diff --git a/.in-toto/tag.47c5a022.link b/.in-toto/tag.47c5a022.link
index c47e060635b32..cadecfa693c35 100644
--- a/.in-toto/tag.47c5a022.link
+++ b/.in-toto/tag.47c5a022.link
@@ -1 +1 @@
-{"signatures":[{"keyid":"47c5a02273f1cf8104ee8d1a7a67dc43b24c1542","other_headers":"04000108001d16210447c5a02273f1cf8104ee8d1a7a67dc43b24c1542050262cc38bf","signature":"6f59e60bfc42eef3104d60831ee8223277a792a92ee4c7dcacd8369e32b9603d25758eb13bfb30a898d0af36798cb0bef7c7779a80f7957c64c71f43e8363981f7d1a940e3e40111b396ecae98133438903c4dacafbfccdfb8a3241dd2c6f0ced8c01fb72271f8e009366b5d59c766ce2843cb07c8a11f65c329e32af98230a304fcb2de2a7fdf85e8c5c333a5ae3fc7eac587ffe780ebe6f2644bcb5698a82c7ba53bd80e0f4944c3b507474023da204714a3d9bf4d8a1b87db40525a1ef6a90de0920e1bbc71d6da663844e92e56d846beadcb8ed0423d482091de858ea24329f9c1a6022105661e287c4e0a1daeb4441b1b0746d5fa0b0f7377863ef2a478a7aeb65472069f7f4ebaba2c8c1067cb14adc0dbd185a8b722d8678a17607798704492e46c245e091560c4389be4ef97144c8bdc98e4ea6c5b808f97759e55142901229da98d25259714a75d657cdac748ecfb761871a1b03005efbcf806632632840b480870c6c538f97b6848fe365df79519f2f0fce645afcd45bbf495e97414e69e8bf330392fcd81f31dbe82ac531207ee6ec072a3b2abc6b11108cdb57f7bb2ed138716356757252eb779ac45281e87f929ad29fe615746c180331354092b8df930810d851ee0f3858bbf0cd4d929d62a7294418542eebdb92326f247d9b5cf517bcb1a43cd5d545c6c4fdd487860486d228726630c1f68a5dc907c1ea5"}],"signed":{"_type":"link","byproducts":{},"command":[],"environment":{},"materials":{},"name":"tag","products":{"datadog_checks_base/datadog_checks/__init__.py":{"sha256":"9a3c64b8b00c94da4b4f34618d803d3255808caf21b8afa9195c84b61da66b6a"},"datadog_checks_base/datadog_checks/base/__about__.py":{"sha256":"41962ca5ca3c5d6f5134199571648b3ff4a50c39e55a5bf20b378e541e23e02d"},"datadog_checks_base/datadog_checks/base/__init__.py":{"sha256":"86d72a8b1cac45e6bcd151c8bd18e5f272b47c5870bdbc1feb42b57ee74ebe49"},"datadog_checks_base/datadog_checks/base/checks/__init__.py":{"sha256":"6b45aff8e774058500e39cf7ede54ebee81f95364c8a380648eb89aa7744dc35"},"datadog_checks_base/datadog_checks/base/checks/base.py":{"sha256":"c4c8152c1be477c0ebf094a9cf98cc031b9863dff3b3b667991af7d67528ed82"},"datadog_checks_base/datadog_checks/base/checks/kube_leader/__init__.py":{"sha256":"ac4335c2a324c7c24bbc9a5834730ecba39d3e60b0438e8948e7c4dd00c0a726"},"datadog_checks_base/datadog_checks/base/checks/kube_leader/base_check.py":{"sha256":"d8b21153a6b67096f86f2338437bf54955498d05bc363549affc9428e7e32a35"},"datadog_checks_base/datadog_checks/base/checks/kube_leader/mixins.py":{"sha256":"81cc766e7da305894c9b98bfbbdcba3a3e2ae0b1943c2fa22db3ed744adc87dc"},"datadog_checks_base/datadog_checks/base/checks/kube_leader/record.py":{"sha256":"6aa334545b055aeda90343b976cfbabf959038cee58103321b0a26e90eaa09a5"},"datadog_checks_base/datadog_checks/base/checks/kubelet_base/__init__.py":{"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"datadog_checks_base/datadog_checks/base/checks/kubelet_base/base.py":{"sha256":"97ec3af5e262a9f1a3dcc0664f01cca4df95241771c4bf53d09fa06b4a8fbc23"},"datadog_checks_base/datadog_checks/base/checks/libs/__init__.py":{"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"datadog_checks_base/datadog_checks/base/checks/libs/prometheus.py":{"sha256":"bc26fc613d37025a1efca477ac60960ad0499d0b73180c0c5bc4045bc62f2630"},"datadog_checks_base/datadog_checks/base/checks/libs/thread_pool.py":{"sha256":"2e56a317ebf0f097c18971fbb7a1ecfadb61e90f0380e6aa166807f01a9d37da"},"datadog_checks_base/datadog_checks/base/checks/libs/timer.py":{"sha256":"8ac17c602136ed7a5e7a1bb39389782190afc505574dd6cd8a46c1db146780c4"},"datadog_checks_base/datadog_checks/base/checks/libs/vmware/__init__.py":{"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"datadog_checks_base/datadog_checks/base/checks/libs/vmware/all_metrics.py":{"sha256":"4f89b8c40a8abc0f57b6abbea2227be3cd8a0a000e34a134b48800fc4a0842c6"},"datadog_checks_base/datadog_checks/base/checks/libs/vmware/basic_metrics.py":{"sha256":"f4ea471b2580d65819e57dc9c6e04753f99a2bd8c049de9ac150d09b4b729a56"},"datadog_checks_base/datadog_checks/base/checks/network.py":{"sha256":"5228cfd4e5410a908d28ccba6d590d6b31e0cba49d9bca82bc26063da5ae4c3a"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/__init__.py":{"sha256":"3876cda6f0d3eb38d15b8d91cd85991f383e692f2a5d83984292aea2e9942771"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/base_check.py":{"sha256":"6e5867daf9717220a004bc9b2910c30701c9f75a2a2b6ab56f4f1f21886a7891"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/mixins.py":{"sha256":"9eed2e239852f46d1383c441ca1541c2832008f4526eaa99b41cc4bb3d55ed97"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/__init__.py":{"sha256":"3fcd4506124b03d306a73e0bee8ffb0bea6f13077803ff235855906758e0d048"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/base.py":{"sha256":"4eecfca12de74d20387dcc617ba40875472d00bca161da659c72cb8e3cc513a7"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/first_scrape_handler.py":{"sha256":"227fad65733389e49d2f6397265200162efc29b415c2e26718fd2268b1fdf7be"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/labels.py":{"sha256":"d05d084a1d37c12daf56c8db9ecdc5ad80e7ea0bf18f45effb67e40361e1f43f"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/scraper.py":{"sha256":"5f5063f5e02a5a55a2cdbaf34239e5a6f2ced2ea596529e104a7ac8589e9d5a1"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transform.py":{"sha256":"eb81688905d875914fbb6c9b246a1dc9812068b0e05a9944dd89cb949b035290"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/__init__.py":{"sha256":"84f667f162ef41faf32d2689c6d15b61802d2b576df084174942cbefdb2b663b"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/counter.py":{"sha256":"2379338f226523eb31d573fae682ba50089355d7557c40422b4cd75620708169"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/counter_gauge.py":{"sha256":"a1bd42bc2747afe56b73905295a4f73972f917633a07b3866a15007a4545dc5c"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/gauge.py":{"sha256":"ff6a19d789bfe7f6fb94e47eb4cc49461b1e17aafa7fd0ec3bee0b6c023288f1"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/histogram.py":{"sha256":"872b69c3785029d57037ccb991e5ba58672adebe3efb11272431f1c167fa8e52"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/metadata.py":{"sha256":"069b093750fd272f78bb12deee4a472f5e042dd961530c939a5e51f3d3003aea"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/rate.py":{"sha256":"7beb75edc142b002a77d7810add521f79c3496c972de2b80d36322cc63ffa1c3"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/service_check.py":{"sha256":"e0244e3b8da63d241c593dfbe9b4c722fb0e68b0db2ce9883e197ce1c58501b5"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/summary.py":{"sha256":"d01d5693b79ae07da77ddb0e5fca10122a2804636aca914372304f2a31d5b52e"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/temporal_percent.py":{"sha256":"c02a8ea971a8550de5c99066fc04e7830a6f21d81c7ce905ff59461397e88625"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/transformers/time_elapsed.py":{"sha256":"c8fb3bd9478e82bd9e40e7610638c507a7add21327c034beaee516388f160db1"},"datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/utils.py":{"sha256":"b6993786d240cff2b0091a85b360938da8c790b0acff64db19d069e75e2b58e4"},"datadog_checks_base/datadog_checks/base/checks/prometheus/__init__.py":{"sha256":"35c57ac8d1d9555c42ac0ac80ece6d4a459fae72f05398b195374d5c57284a30"},"datadog_checks_base/datadog_checks/base/checks/prometheus/base_check.py":{"sha256":"2d4b347b12235a4d520d0901a7191e534fa0888d68cb32e21936898ccd8b8f5d"},"datadog_checks_base/datadog_checks/base/checks/prometheus/mixins.py":{"sha256":"03d11c50f95b877de9efb5c58a7f5eda2976e5aaaad855035229d786b9aacba7"},"datadog_checks_base/datadog_checks/base/checks/prometheus/prometheus_base.py":{"sha256":"9f35823bf488a24646a04ee8f01269a254cfa160bbfe471625f90b1c05de057e"},"datadog_checks_base/datadog_checks/base/checks/win/__init__.py":{"sha256":"9083ff7fefc6d7404110ec4ee3e1a7cb29730a8d6439ff5deb291388151a7a4a"},"datadog_checks_base/datadog_checks/base/checks/win/winpdh.py":{"sha256":"142f282601923e049811ccdc3de3b89b7e21cbaf48f08e487c34cfea1865e839"},"datadog_checks_base/datadog_checks/base/checks/win/winpdh_base.py":{"sha256":"851c1428aab7c14b81f35dff00f5bdc8aed06c0077987f0db686368fa1d9dfe0"},"datadog_checks_base/datadog_checks/base/checks/win/winpdh_stub.py":{"sha256":"3397f2064cc0b842afa19ac6f64b506a9c241ffecaf8a388605e55a52f372cc9"},"datadog_checks_base/datadog_checks/base/checks/win/wmi/__init__.py":{"sha256":"6f4f143f3ef047e807872bc2396f83a4fab9c96406d846e1a12248e43f144f37"},"datadog_checks_base/datadog_checks/base/checks/win/wmi/counter_type.py":{"sha256":"521c1dc1ea0b5c6e2baec6f4bcaa08531a1f3d51f59065a89c2ba42df9470a84"},"datadog_checks_base/datadog_checks/base/checks/win/wmi/sampler.py":{"sha256":"bfec2dfb1a08167f073b97e9e4a2ab4e62005bb04fd57ed4d1e642d9f17accce"},"datadog_checks_base/datadog_checks/base/checks/win/wmi/types.py":{"sha256":"e04f1ed72a69d8ff9e3b180bb11adfb656aeaaf6a9582b956803e872a0abc158"},"datadog_checks_base/datadog_checks/base/checks/windows/__init__.py":{"sha256":"b2e1a32eb8591a9d541a935aa5c56f20fa7ebbc3de68cf24df3a650198f2712a"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/__init__.py":{"sha256":"c4ced6dabda1b7e2b1fe3d22f03bae7bf94433606ffdbab7be0d04b34009e4a1"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/base.py":{"sha256":"9400ccb9c840f06d0f7bcbf2760316c278978738049d9c230f33a256275700ae"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/connection.py":{"sha256":"124462f2699e89a71bb2ead225be6f014cc523f94091459c9d20bb4ce42c006e"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/constants.py":{"sha256":"03015a454cbbc08d7750acf7a0da86698187491024a878346cecd1fa68af9293"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/counter.py":{"sha256":"17f81b04d5a11eb6feeed67e26a834f746582242ca39f3c9a8ccd19024ce41db"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/refresh.py":{"sha256":"b0af01afa2a81b4ec3640c57ef0b58996e2d440082a3c966d48c0e13301107db"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/transform.py":{"sha256":"6d93f17ed0f0d1dd55157e3dca21486be9da18e62529c320a6fb9e491920133f"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/transformers/__init__.py":{"sha256":"a8b142ebeee6817e16846d57125966018eac45ef4a9870efba31fbc9c2555e92"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/transformers/count.py":{"sha256":"8263467bddb648fe101243270ff9dcf30edba0a616fa65b69f9fbabe975c9a37"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/transformers/gauge.py":{"sha256":"73be1f652e85addc433ba64aa2fa75ee1daf85322691a351d8e2deb35af4d681"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/transformers/monotonic_count.py":{"sha256":"479c167c31bd2e471baab21d49ce9dce3470b40729dabe153ee5456aa3a5ce2d"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/transformers/rate.py":{"sha256":"3e4c739755cf6cfb68fb942b882a23361e5684c4e3c03710c2a63f8b6310052f"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/transformers/service_check.py":{"sha256":"c2f74b0d2b871ca2276f35bcb8cf10f764dc454b90975d70b2fb7475266dac70"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/transformers/temporal_percent.py":{"sha256":"2071f661338679e8b63d53790a1f7df200ea620facd4939bbfd6b44e602f3a75"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/transformers/time_elapsed.py":{"sha256":"85633c087612a859c562b35daf5345638eb89cc01514e88df238658594ce6fbf"},"datadog_checks_base/datadog_checks/base/checks/windows/perf_counters/utils.py":{"sha256":"8d50b500407ec9f39733f852c2d36e007f41594721bc1472d2ac31f3646109ae"},"datadog_checks_base/datadog_checks/base/config.py":{"sha256":"a9c000e17f6c5d065177041ef0382219ddbdf34541a7549003477af79b57fed5"},"datadog_checks_base/datadog_checks/base/constants.py":{"sha256":"711d7db40a95cac3056dd056a88199a0720a9359064f2a91b029fd15f1503a7c"},"datadog_checks_base/datadog_checks/base/data/agent_requirements.in":{"sha256":"6621c532a8c8b6568b6917f3a9c09fb88ec422067c1883b225c2003874138554"},"datadog_checks_base/datadog_checks/base/ddyaml.py":{"sha256":"d86ce592be606c30e1844e7f230e716dd894cd6839b3a70dfa826a7abb92c6ca"},"datadog_checks_base/datadog_checks/base/errors.py":{"sha256":"870110e564921ab025e4106272c263c4c7e597506a999c332ba40b0189fa3681"},"datadog_checks_base/datadog_checks/base/log.py":{"sha256":"ded8d63f7b5cc977e0928737476ca71ce1b8611b2fdad26d45be8af8f287703b"},"datadog_checks_base/datadog_checks/base/stubs/__init__.py":{"sha256":"c2958047dbfb0624db6e64ceea9569b21a9aff3f8f59a613af7df049364bcf77"},"datadog_checks_base/datadog_checks/base/stubs/_util.py":{"sha256":"6431ad41af05ddc1dff3e42f4951cc0780462370bd5600bbb067061af3b46a92"},"datadog_checks_base/datadog_checks/base/stubs/aggregator.py":{"sha256":"411cd0187c37e5a52b0daae2347cf4c2d72eab21e04b936572d1e994cdf34175"},"datadog_checks_base/datadog_checks/base/stubs/common.py":{"sha256":"646cc5d9d5f2d6e545406746fdbbf3fe930c8942da05ca73adafe4f70a3d7f4e"},"datadog_checks_base/datadog_checks/base/stubs/datadog_agent.py":{"sha256":"739fa53e9640908520366135ede340563dd0e7915b823edba570b738ce92849e"},"datadog_checks_base/datadog_checks/base/stubs/log.py":{"sha256":"03e7969f3639813a535b8d59721f96e4255c97395d96684c4d6faf0cd15d4f5a"},"datadog_checks_base/datadog_checks/base/stubs/similar.py":{"sha256":"cd9d5bab9c0f690fbc70163f1d2fbad76b29151dd4277bf214069756c19c7013"},"datadog_checks_base/datadog_checks/base/stubs/tagging.py":{"sha256":"cf12dd3c2e04a87c46892fc71216da3ac2ffb399d922137c043931d810133aab"},"datadog_checks_base/datadog_checks/base/types.py":{"sha256":"6a76a3652d16d13b31507250c3e24738fd8d49eb82f418ac5d2cbd9804ad9714"},"datadog_checks_base/datadog_checks/base/utils/__init__.py":{"sha256":"b9a42d0a3f15d1e755495de788dfadddb7e033e4f7fb2005674194b86cfc9975"},"datadog_checks_base/datadog_checks/base/utils/agent/__init__.py":{"sha256":"a37696bf2dcf872903fe1ed84f7b3adbc3b45b66291e2b3436542c495d4f234e"},"datadog_checks_base/datadog_checks/base/utils/agent/common.py":{"sha256":"d5746c3c959da666f100a2815471813d49b858776f8aad28bee820b69c7b2d6a"},"datadog_checks_base/datadog_checks/base/utils/agent/debug.py":{"sha256":"cde05b34bb7763f5b1a5ff4e74092595d2f2d6098bd14e9b30398e1d20c63373"},"datadog_checks_base/datadog_checks/base/utils/agent/memory.py":{"sha256":"986d743c51608d608b7ad17a8a10b8eb7550cf55774b849332cfc5f1b00392f6"},"datadog_checks_base/datadog_checks/base/utils/agent/packages.py":{"sha256":"f54ecd9756a757eb979793c436b18989c5669ebd213227c4e7baa3c4b599b460"},"datadog_checks_base/datadog_checks/base/utils/agent/utils.py":{"sha256":"155fe8eab71c53907432b5f299afb8c80aa62a08649734de39fd6785872663ba"},"datadog_checks_base/datadog_checks/base/utils/aws.py":{"sha256":"c3114b5a5545b6fe7f11445db17cc384e45c4e93348c1940a2470c88f575c43f"},"datadog_checks_base/datadog_checks/base/utils/common.py":{"sha256":"b9823bbc94eeced93ba25a7ee6b35ab983fd422ed313eda9bfdef85947152a29"},"datadog_checks_base/datadog_checks/base/utils/constants.py":{"sha256":"4304decb8096074340c66dab703fb03d84641328257a4408ac0cc531a6c46b7f"},"datadog_checks_base/datadog_checks/base/utils/containers.py":{"sha256":"8227d931334393baecb8dcde9132740b832dcb5b26b07f847f6a9b8ebc60b24b"},"datadog_checks_base/datadog_checks/base/utils/date.py":{"sha256":"2499aa3fce0281570527472f02632ef04b4ceaff7ab48112b9c40d9bd78a7847"},"datadog_checks_base/datadog_checks/base/utils/db/__init__.py":{"sha256":"f964bc85274b6a1cf6a9b115c13d38d419f422ef40f4e96ec3a0b8ff36f17e36"},"datadog_checks_base/datadog_checks/base/utils/db/core.py":{"sha256":"167004f4ebd8e137e721af3b50a004323529e8bad2dbc22bd9bf3057f062004f"},"datadog_checks_base/datadog_checks/base/utils/db/query.py":{"sha256":"9c5d7d9c8c484e3e196f0bd7f06535f3881dd22609566c2026aded2920ad14cd"},"datadog_checks_base/datadog_checks/base/utils/db/sql.py":{"sha256":"a0f94966a841cf408601aecc10d3dba4e83e39fb878feddbffeaefec981a344b"},"datadog_checks_base/datadog_checks/base/utils/db/statement_metrics.py":{"sha256":"4dbdd9396b7a87cbde92cedd39a524a590a02b0a7b1c53f48b33e6bba850df26"},"datadog_checks_base/datadog_checks/base/utils/db/transform.py":{"sha256":"fb2f0d4948515b9395371a08b2bdbb49eb58d5756a532c293f31237ea78f921f"},"datadog_checks_base/datadog_checks/base/utils/db/types.py":{"sha256":"38b5f63aae7c2503c5043e28a94a422e400fee8bd118dfe2d6f164d44d0df0b8"},"datadog_checks_base/datadog_checks/base/utils/db/utils.py":{"sha256":"6ec9bf3345ab65b373e222fa592e9cdc5cfbfa5a432b3008bef2d9ba8ed454c7"},"datadog_checks_base/datadog_checks/base/utils/functions.py":{"sha256":"8869726f147a68f3c494dc4d6f610b3b36e4df6f23f4e541031ade749c5d091c"},"datadog_checks_base/datadog_checks/base/utils/headers.py":{"sha256":"b4b060cbc1448e0056b38169fd0b78ed1a456e6edf97075abae60e4a733eaf0f"},"datadog_checks_base/datadog_checks/base/utils/http.py":{"sha256":"4bf78c890d7339fb59b302965dd04e9f1b29ef4d5dc3903696aa776819101e5d"},"datadog_checks_base/datadog_checks/base/utils/limiter.py":{"sha256":"6114eb3c25f54b912d1cb55c3fff8611fcd1a2db3f2d3732d5ffee1d956cf748"},"datadog_checks_base/datadog_checks/base/utils/metadata/__init__.py":{"sha256":"6d36a6f7a190f43be4ea287c70aabc5b16b69640e48feed3b89de85875d432cb"},"datadog_checks_base/datadog_checks/base/utils/metadata/constants.py":{"sha256":"5c77cfc2f40c6f2344d8562607fed7c968862343761b17415dbb572f87839e27"},"datadog_checks_base/datadog_checks/base/utils/metadata/core.py":{"sha256":"f54330023488e3b21d7c2a83d5cdf9cbe3e578fd5c12b25af16a42527aa2d77a"},"datadog_checks_base/datadog_checks/base/utils/metadata/utils.py":{"sha256":"4c2876f1c9b1434dcc413b9e3af4274f5ad0b604c7dadf30fde8e90901dcaa9e"},"datadog_checks_base/datadog_checks/base/utils/metadata/version.py":{"sha256":"7257bc2c7c2a72ee364ea14a24625d16d1c098e7a2b423a2ce34cd43606cc534"},"datadog_checks_base/datadog_checks/base/utils/models/__init__.py":{"sha256":"b2e1a32eb8591a9d541a935aa5c56f20fa7ebbc3de68cf24df3a650198f2712a"},"datadog_checks_base/datadog_checks/base/utils/models/fields.py":{"sha256":"b3cc9e55f977b91bce1334c5ef0cff69e69b76b75f353ab8c06fa1300c3324d1"},"datadog_checks_base/datadog_checks/base/utils/models/types.py":{"sha256":"7a091279f90e7f24386c1c09392d0a5a50342e88431518c704cf2bffa3bb532d"},"datadog_checks_base/datadog_checks/base/utils/models/validation/__init__.py":{"sha256":"699557dfc5b5a642c793b9281e02b9267d8f3824f940a28f1b35bfc3d2e082da"},"datadog_checks_base/datadog_checks/base/utils/models/validation/core.py":{"sha256":"e4c4c762db3e0792daba69fe8b22f7c06b3bf03349599e2d6bb2b0bfd1b211ea"},"datadog_checks_base/datadog_checks/base/utils/models/validation/helpers.py":{"sha256":"1dc1ad939c6adc4720f876c589dc67ea6505ea664ee8ac8b9079c12810c0c78c"},"datadog_checks_base/datadog_checks/base/utils/models/validation/utils.py":{"sha256":"7837021425ed2f937d4a15c17fe83af1ea6041284cbe13c98ec5e5f8278c9cb6"},"datadog_checks_base/datadog_checks/base/utils/network.py":{"sha256":"970452f4248a9699bed1d5be713e7b2b65fe6f026f4bcbf6afa4fb4ad2bfd6c7"},"datadog_checks_base/datadog_checks/base/utils/platform.py":{"sha256":"c16f1fe972a8e091f1beed6c3740e92c39988d2fdc0aef06a0abdf4e3223e323"},"datadog_checks_base/datadog_checks/base/utils/prometheus/__init__.py":{"sha256":"f794783ecff74f6713b846470f28eaaa841ed20c0d1681bcd18186135e2c150f"},"datadog_checks_base/datadog_checks/base/utils/prometheus/functions.py":{"sha256":"7c4640fc2159de7bc78890b08a9d3143d1bc28999c8726ec9cb8faf6dc62677c"},"datadog_checks_base/datadog_checks/base/utils/prometheus/metrics_pb2.py":{"sha256":"0953cf7b28e8d5f1d4b97526ab2483ef6f985a12f091a1a3cc11de7deebf36c9"},"datadog_checks_base/datadog_checks/base/utils/secrets.py":{"sha256":"e2a7f643f1f05b5c93b9cf4d98ea9a573d54219fa5736b8ecf53324c0455e5d5"},"datadog_checks_base/datadog_checks/base/utils/serialization.py":{"sha256":"7ec78259573604c7c1ac299199cad1f34fa129f19a4f3f605c8a87624426b2da"},"datadog_checks_base/datadog_checks/base/utils/subprocess_output.py":{"sha256":"d0fdff8aa22fb2f7fed2f9a2e3194a2e8c121b15030b176cdc275c73601e25b6"},"datadog_checks_base/datadog_checks/base/utils/tagging.py":{"sha256":"004504188c498cdbe8388110405922b7c653d8ec91c62ca6d45cc21227080acb"},"datadog_checks_base/datadog_checks/base/utils/tailfile.py":{"sha256":"c7fa4ce6982655a5b87890704ba19764a3aa89fa66a9faf01ce537816b6162d3"},"datadog_checks_base/datadog_checks/base/utils/time.py":{"sha256":"9caeb78a0273d313748990aea3dd09a6ca47119cc52671bcca42428186a9a41c"},"datadog_checks_base/datadog_checks/base/utils/timeout.py":{"sha256":"78e059a1f14dfa13aee7125e30e17769cfe87dccbd118ebe92f981bcfe101058"},"datadog_checks_base/datadog_checks/base/utils/tls.py":{"sha256":"a4442f1072adc44badaba2a28e128ed1c5c7fc325b94c8106603840e26f06941"},"datadog_checks_base/datadog_checks/base/utils/tracing.py":{"sha256":"bfccd9943fea92299d12fda591d704a30cce8b58444b58d355fdb7db0357dd98"},"datadog_checks_base/datadog_checks/base/utils/tracking.py":{"sha256":"158228baabb7281f89b31831335897e48a6ffdc5a1b3ccd03933784b15ce909e"},"datadog_checks_base/datadog_checks/checks/__init__.py":{"sha256":"3d6258c4df6b62c13123f26fa5da3bc32772cc848f51385067097c0c2c70045e"},"datadog_checks_base/datadog_checks/checks/base.py":{"sha256":"dc38edab88478b210a5d35af8ddd7ad39abc8930b89f5c05dd1a998bef9e30d4"},"datadog_checks_base/datadog_checks/checks/libs/__init__.py":{"sha256":"2300c3103843a8f3d4d63e0fcaf78691dbb508cbfd91b7de2bdd0802f981c777"},"datadog_checks_base/datadog_checks/checks/libs/thread_pool.py":{"sha256":"b3993208a85fd94da0df48993d018b50f5159c487889c03cc143c33ac80900a4"},"datadog_checks_base/datadog_checks/checks/libs/timer.py":{"sha256":"ba969b008bd579182a0ffb0abea8ff9432c992feffe339c7916c37b4325b0df8"},"datadog_checks_base/datadog_checks/checks/libs/vmware/__init__.py":{"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"datadog_checks_base/datadog_checks/checks/libs/vmware/all_metrics.py":{"sha256":"e7dc615b7bb72cb11ee8afcd298796ebdb9d9396ac8ba2b2203c3be1191a464c"},"datadog_checks_base/datadog_checks/checks/libs/vmware/basic_metrics.py":{"sha256":"5dfd9e9e057aebe88557e02c4455e7b60de077fa9914c2003d69b06ef078ed47"},"datadog_checks_base/datadog_checks/checks/libs/wmi/__init__.py":{"sha256":"2300c3103843a8f3d4d63e0fcaf78691dbb508cbfd91b7de2bdd0802f981c777"},"datadog_checks_base/datadog_checks/checks/libs/wmi/sampler.py":{"sha256":"7771b0b1c5ab5edaf270f718c342d2abf198353ae36cfefcea026af42701c4f4"},"datadog_checks_base/datadog_checks/checks/network.py":{"sha256":"17117f1a7d445eec8b179dc87d5c109167c23a1aa912049182f042e85c9108d6"},"datadog_checks_base/datadog_checks/checks/network_checks.py":{"sha256":"1c001087323bab765881d303f81c5812ff62ba52c7a725657af1c59ac47ebb9f"},"datadog_checks_base/datadog_checks/checks/openmetrics/__init__.py":{"sha256":"0b3e6240dfad0d0a5393d9d8003f48b79b57f32b4ddb1a7050d20d5594af449f"},"datadog_checks_base/datadog_checks/checks/openmetrics/base_check.py":{"sha256":"795244407f255082bcd95a1687ae9f3e3a6e4aaab77a3c7bd9b6e5381fdef872"},"datadog_checks_base/datadog_checks/checks/openmetrics/mixins.py":{"sha256":"c56f5fe86939910ae8dda58c4e5bb74dc079f991d706573a208aa774756c7e94"},"datadog_checks_base/datadog_checks/checks/prometheus/__init__.py":{"sha256":"be43b8c29604d29b672712ddc6c31f13a0d2894c78dd2a3ca2da3e61e478a498"},"datadog_checks_base/datadog_checks/checks/prometheus/base_check.py":{"sha256":"b4f57fb5d9466334d0b082c2383fd730d2380f5803134ec8db1e935fd7279657"},"datadog_checks_base/datadog_checks/checks/prometheus/mixins.py":{"sha256":"7145fffb69fdc4a627993b5f6f8b27e79a638b89390e505404804c033d00fd49"},"datadog_checks_base/datadog_checks/checks/prometheus/prometheus_base.py":{"sha256":"9e4c5922f766a9919184c938ce89d47beea6d4fa18ffb9abb7316b1e033614d9"},"datadog_checks_base/datadog_checks/checks/prometheus_check/__init__.py":{"sha256":"9b5434e894e03018e342ee726f635de62122bf0e1d8f59d3f0109f89a95d890d"},"datadog_checks_base/datadog_checks/checks/win/__init__.py":{"sha256":"0139c7047940115c6f817d0e377710e1f1bd19c1d6761bda90c5d5602ed19541"},"datadog_checks_base/datadog_checks/checks/win/winpdh.py":{"sha256":"0a5d63c0c8b3c9fabc73f0c2e92d371a583d83a3dd97a94d111c6dea268d94bf"},"datadog_checks_base/datadog_checks/checks/win/winpdh_base.py":{"sha256":"0bd3f73333dcf9caade3545426d71cedce4967cc9f3f73f758789c51bb5cbc4b"},"datadog_checks_base/datadog_checks/checks/win/winpdh_stub.py":{"sha256":"7b810576bacc8b2a8b163add8eb7cd90aed4c42812278305eebf4dc5bfcf78f4"},"datadog_checks_base/datadog_checks/checks/win/wmi/__init__.py":{"sha256":"1a3a629024f8a0997508afc0cd652f8ef3cb453890bd789bad7b276ae1bcb55f"},"datadog_checks_base/datadog_checks/checks/win/wmi/counter_type.py":{"sha256":"ace194760755f2e37593a7a7132f0264ad933499382001cc998eb515f0cc0610"},"datadog_checks_base/datadog_checks/checks/win/wmi/sampler.py":{"sha256":"dff3fd553aff952a075739ea60e1bcfb26c11e0df93ea39a3fb67639dcb8d416"},"datadog_checks_base/datadog_checks/checks/winwmi_check.py":{"sha256":"feb4ce64d553782535661c6d095c11ea1a45ad6795940483fcef9ed81fd3a242"},"datadog_checks_base/datadog_checks/config.py":{"sha256":"e8bf9637beaa27c165c1516c76b7145bea655466d1a83ca4868d1dffd8d7678f"},"datadog_checks_base/datadog_checks/errors.py":{"sha256":"32225623dd57d0e17d9559c4d0634bfa40dae26e1001b6d217059f376bd50b5a"},"datadog_checks_base/datadog_checks/log.py":{"sha256":"8c3c40328a1eac771f7b156cb8b2216d56147046762d3778262204ae111d32e7"},"datadog_checks_base/datadog_checks/py.typed":{"sha256":"95aebb28195b8d737effe0df18d71d39c8d8ba6569286fd3930fbc9f9767181e"},"datadog_checks_base/datadog_checks/stubs/__init__.py":{"sha256":"44d51fc02cb61c8c5f3cf856561a130b9ea537e979c0e399ce0f4322491bedb4"},"datadog_checks_base/datadog_checks/stubs/_util.py":{"sha256":"85ad5971661b4d1cdf7a6bc8ee2d73b902665250531f87392797abba1ac41992"},"datadog_checks_base/datadog_checks/stubs/aggregator.py":{"sha256":"67c13ca62d45b892ee276d14344e7d270588d90bd67c8a8917b2752cffd23e24"},"datadog_checks_base/datadog_checks/stubs/datadog_agent.py":{"sha256":"683dc289e79105ef6f47a3f83e4edbddeed65880b1cca5bbbe6065a4f161d7d0"},"datadog_checks_base/datadog_checks/utils/__init__.py":{"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"datadog_checks_base/datadog_checks/utils/common.py":{"sha256":"0254495cbc4437ca79ee9095e99601c3ccf22a7acf222cdcc0edcdd0fbda738a"},"datadog_checks_base/datadog_checks/utils/containers.py":{"sha256":"efd9757e5cfaeb3ce413535f658864f8dcd84b7a40c6f762108a447af82b23b7"},"datadog_checks_base/datadog_checks/utils/headers.py":{"sha256":"49ee3fbbba5916447728088e5e0496406b4558e2059ccd7ce2011a304562abde"},"datadog_checks_base/datadog_checks/utils/limiter.py":{"sha256":"714e05982aae913b337acc96afbdd139f2d89cda529a486bdd322c3ccec78a74"},"datadog_checks_base/datadog_checks/utils/platform.py":{"sha256":"0ad1a1b91a9e393f8b8fd6c4754ffeffaecbd586cc77a5fad0267714e2421557"},"datadog_checks_base/datadog_checks/utils/prometheus/__init__.py":{"sha256":"6146957796d2404c1bb69b2b6a69826188c233b3771906d494f9b4b76a8d2c29"},"datadog_checks_base/datadog_checks/utils/prometheus/functions.py":{"sha256":"e9dd7561b2c10df79e07c6cfeb7004f314bf4f74fe15ac9c9f378808f93a8fe0"},"datadog_checks_base/datadog_checks/utils/prometheus/metrics_pb2.py":{"sha256":"2b1e9a7b1ac08f2ca198c354a93949e3060f10c53708a231c8fc634634cf0b1c"},"datadog_checks_base/datadog_checks/utils/proxy.py":{"sha256":"a72ff1f15b71b2b026d3890c32f5a3a14e41a71b82be28f3cbd244f8a2740d59"},"datadog_checks_base/datadog_checks/utils/subprocess_output.py":{"sha256":"597df0f0faea11360e8586402aadc093a2738901e025d07b0e626ec492d052f1"},"datadog_checks_base/datadog_checks/utils/tailfile.py":{"sha256":"9a0136818048bd4673dada3ede2cfd335556a3c40eaff07a1a84582e073aab76"},"datadog_checks_base/datadog_checks/utils/timeout.py":{"sha256":"491f65bc4bdeacc1f87c7a61e84f3bf0a502b4fa1d45a799291db922859c377f"},"datadog_checks_base/datadog_checks/utils/tracing.py":{"sha256":"07ce4352bacd50297c7e1d385b6ec78d81bda5d599f0ec63878d62171b037d5e"},"datadog_checks_base/pyproject.toml":{"sha256":"8ee0f8f7b3aa57a32ce67e841cc92a7703ca9bd84cbb5e029e8fdc94c6c3db55"},"datadog_checks_base/setup.py":{"sha256":"e7210eb1ae3c0844ea698595879257261be6e7e649249e6fbcf4e8c50c10e15a"}}}}
\ No newline at end of file
+{"signatures":[{"keyid":"47c5a02273f1cf8104ee8d1a7a67dc43b24c1542","other_headers":"04000108001d16210447c5a02273f1cf8104ee8d1a7a67dc43b24c15420502654a6e53","signature":"8be2de05487457f0020b4ac312d5dcb972ad7b9f0125abcaa257283bd2278b701cb5202acf1a45d281916caa3a8b18ff13c85c0698ca6b1756e0a72322c7f5dd844bd1a606f8003ff679d1ccff24d10dfef396f80d2879d3ffb6e3f2897d0080e33d7ca0e8e79a0a75b1d059d042ad5d63179d984fd05131492fafe5c2aa228aef951d78fa791ee079e849747d61aa7c2dc82160584cd4baf81a048a1ec46f9880387e269a77620b27b450f4dadcec4d4da181d8e69b9701984a437c68fd6875cfadf6a9209a52232a7f34fe87f452197223f1e665a1ab5907d64086234ea208554cd20d297b198702b23644f0a9d66fa60b57688e8153306b33f8c87e2dc2b994c8dcea47d84ce5cb25fc28b0b305cf15c61b4f5a18f5e53551e2311b4d01bdca8a5d32c517662d15b514e8a89aabe3fdf16fdee2716f2e6252421aea419943c2a598685bfafddb7d48cf12490b2b0764655f64ce274b240fad13dd56cf4cb9fb4762c767acadd63f8419476014078f72e59f21c1f6e383cee22bb6ebe743b1ffacfe249ad170afc9ffe41c87ece150e1f3619409b660826db9291632c82ebfe3d5fc990114137c869b09ea02b898ba8126694f0560d2b5223e0f459655d6d1e0cab63710b98bed12ed01336c0309b5f8c8763c502a5de51fca4222d7c8e158b9ac981f4d4e358c3a6f909dff4c8da136792d36915617bd24e5b24de2c0198b"}],"signed":{"_type":"link","byproducts":{},"command":[],"environment":{},"materials":{},"name":"tag","products":{"vsphere/datadog_checks/__init__.py":{"sha256":"9a3c64b8b00c94da4b4f34618d803d3255808caf21b8afa9195c84b61da66b6a"},"vsphere/datadog_checks/vsphere/__about__.py":{"sha256":"5dca4cd5bccf45dddcd655173164fce414d764d80ac3954ee7241684acad6992"},"vsphere/datadog_checks/vsphere/__init__.py":{"sha256":"4804b8be022831763a2a77005a48a21d06797841fed86adc908eca264ec21f4f"},"vsphere/datadog_checks/vsphere/api.py":{"sha256":"563d105831c6f61e9e8080670b33379c9190be2458975b97c51c93c978918782"},"vsphere/datadog_checks/vsphere/api_rest.py":{"sha256":"1de42fe22e085da371b910d6f240e05360da903a5a75de50d47d89a82b6b4905"},"vsphere/datadog_checks/vsphere/cache.py":{"sha256":"0308fa909a3edcce5719e4f7e0f31eb3934ebf7d23e00410bf609cbfc6f2503a"},"vsphere/datadog_checks/vsphere/config.py":{"sha256":"127884860a368ae6493e0e5b4f2084d3f674fed1316e590725f7b236867d1b16"},"vsphere/datadog_checks/vsphere/config_models/__init__.py":{"sha256":"c9cf5c66894430e7edbb00d00613b58ccfd38360f2fe490a23c17cf71ed294dc"},"vsphere/datadog_checks/vsphere/config_models/defaults.py":{"sha256":"9bfd54a50e06f469bcb52ff9fdec765613c992241695428ea000a6d57ba23b70"},"vsphere/datadog_checks/vsphere/config_models/instance.py":{"sha256":"96b8febb77ca3a78beac7bd06b7ec748d1297ab0226030a056b590218b2edbc2"},"vsphere/datadog_checks/vsphere/config_models/shared.py":{"sha256":"c75d0763dcc07c8496bf65aae4c775ba4c5d7c389bbaeb8b7c0ed94907530edd"},"vsphere/datadog_checks/vsphere/config_models/validators.py":{"sha256":"82e19f443280078dbfc1316e3cd99d213a2d8f75bbfc4b6f18767fb0ff75ce40"},"vsphere/datadog_checks/vsphere/constants.py":{"sha256":"aecb4a7d70fd677e4e92e830f4cae725dae7cece3afc60e746df6743483ccd71"},"vsphere/datadog_checks/vsphere/data/conf.yaml.example":{"sha256":"6023a5c540f13f807e613308bdbdea59a7443bc0b598449048dfaf9579fc8b06"},"vsphere/datadog_checks/vsphere/event.py":{"sha256":"7c48432fdb96473a2d05210f6b985b1b2506ef5167c968e6eb01b522f58c8469"},"vsphere/datadog_checks/vsphere/legacy/__init__.py":{"sha256":"92fc4bfe3192bbd9b98e323e14ab590a57642db8c05ad720f0afacbfbe4353a0"},"vsphere/datadog_checks/vsphere/legacy/cache_config.py":{"sha256":"f466913e3b3c0618c7b58eef2629e3335d4e78daf80caf66f5435f0abf1c3794"},"vsphere/datadog_checks/vsphere/legacy/common.py":{"sha256":"b1dd3cc418aa6221d1527f2808986d4cb34ee3bec2674f2de4ebf650ce63ce58"},"vsphere/datadog_checks/vsphere/legacy/errors.py":{"sha256":"e605974dcb27d8a7c62e8d37be7cf9a7904923d0a25692214184581788f555b8"},"vsphere/datadog_checks/vsphere/legacy/metadata_cache.py":{"sha256":"14be37cc512b81d08b10b98880fe35a6ed1301ec0d22d6e8e338dac61b4416d3"},"vsphere/datadog_checks/vsphere/legacy/mor_cache.py":{"sha256":"1546306bfc54735909169565a15e86c96288447e7ebb5027636be54c85d4d91b"},"vsphere/datadog_checks/vsphere/legacy/objects_queue.py":{"sha256":"b1e0759db951f9e3cc1c10f23f3045d0ec0cf6482823e385493f257ad7406336"},"vsphere/datadog_checks/vsphere/legacy/vsphere_legacy.py":{"sha256":"14e7bb80368e378771a6b6842e8fa27332eb38def6a7b60244ac9737479f9317"},"vsphere/datadog_checks/vsphere/metrics.py":{"sha256":"a02338ce785ef209668ec0dbac77e17c92e59939ed56591c2cf7bc2e531f3661"},"vsphere/datadog_checks/vsphere/resource_filters.py":{"sha256":"f34d26fe702c2d39ae687180e841581aae9f3f8baef2bdabb03e7788f0097a08"},"vsphere/datadog_checks/vsphere/types.py":{"sha256":"0c3fd977f88710c4187d5cafe5778f339dc1f50451a3fcecadeb0631de2a83ee"},"vsphere/datadog_checks/vsphere/utils.py":{"sha256":"32801619576b5aea8d9977ad7fbb7215d8258d96e5d4b62af1889e573e774678"},"vsphere/datadog_checks/vsphere/vsphere.py":{"sha256":"e11001ff3731db167ff26def388254bfa250119b5bfacc356f1718788de2a59c"},"vsphere/pyproject.toml":{"sha256":"c65bd0cdf424015b377291466554585b81d815a8cd2d9af567030c4346fcb2c0"},"vsphere/setup.py":{"sha256":"71e8080d0bd2bb03e8501d56090dd89baab42377200f26a0a9bb231d7242ed7c"}}}}
\ No newline at end of file
diff --git a/cilium/changelog.d/16164.added b/cilium/changelog.d/16164.added
new file mode 100644
index 0000000000000..3af8906b3bbbf
--- /dev/null
+++ b/cilium/changelog.d/16164.added
@@ -0,0 +1 @@
+Add more FQDN and L7 metrics
\ No newline at end of file
diff --git a/cilium/datadog_checks/cilium/metrics.py b/cilium/datadog_checks/cilium/metrics.py
index 1e02c6d54a74b..fbe335f971842 100644
--- a/cilium/datadog_checks/cilium/metrics.py
+++ b/cilium/datadog_checks/cilium/metrics.py
@@ -60,6 +60,9 @@
     'cilium_kvstore_events_queue_seconds': 'kvstore.events_queue.seconds',
     'cilium_kvstore_quorum_errors_total': 'kvstore.quorum_errors.total',
     'cilium_policy_implementation_delay': 'policy.implementation_delay',
+    'cilium_proxy_redirects': 'proxy.redirects',
+    'cilium_proxy_upstream_reply_seconds': 'proxy.upstream_reply.seconds',
+    'cilium_policy_l7_total': 'policy.l7.total',
     # Cilium <= 1.7
     'cilium_policy_l7_denied_total': 'policy.l7_denied.total',
     'cilium_policy_l7_forwarded_total': 'policy.l7_forwarded.total',
@@ -90,6 +93,11 @@
     'cilium_ipcache_errors_total': 'ipcache.errors.total',
     'cilium_k8s_event_lag_seconds': 'k8s_event.lag.seconds',
     'cilium_k8s_terminating_endpoints_events_total': 'k8s_terminating.endpoints_events.total',
+    'cilium_proxy_datapath_update_timeout_total': 'proxy.datapath.update_timeout.total',
+    # Cilium 1.12+
+    'cilium_fqdn_active_names': 'fqdn.active_names',
+    'cilium_fqdn_active_ips': 'fqdn.active_ips',
+    'cilium_fqdn_alive_zombie_connections': 'fqdn.alive_zombie_connections',
     # Cilium 1.14+
     'cilium_kvstore_sync_queue_size': 'kvstore.sync_queue_size',
     'cilium_kvstore_initial_sync_completed': 'kvstore.initial_sync_completed',
diff --git a/cilium/metadata.csv b/cilium/metadata.csv
index eca1dbfae59d7..b64948b07f3cd 100644
--- a/cilium/metadata.csv
+++ b/cilium/metadata.csv
@@ -52,6 +52,9 @@ cilium.forward_count.total,count,,packet,,"[OpenMetrics V1] Total forwarded pack
 cilium.forward_count.count,count,,packet,,"[OpenMetrics V2] Total forwarded packets",1,cilium,forward packet,
 cilium.fqdn.gc_deletions.total,count,,event,,"[OpenMetrics V1] Total number of FQDNs cleaned in FQDN garbage collector job.",0,cilium,fdqn total,
 cilium.fqdn.gc_deletions.count,count,,event,,"[OpenMetrics V2] Total number of FQDNs cleaned in FQDN garbage collector job.",0,cilium,fdqn total,
+cilium.fqdn.active_names,gauge,,item,,"Number of domains inside the DNS cache that have not expired (by TTL), per endpoint. Available in Cilium v1.12+",0,cilium,fdqn active names,
+cilium.fqdn.active_ips,gauge,,item,,"Number of IPs inside the DNS cache associated with a domain that has not expired (by TTL), per endpoint. Available in Cilium v1.12+",0,cilium,fdqn active ips,
+cilium.fqdn.alive_zombie_connections,gauge,,item,,"Number of IPs associated with domains that have expired (by TTL) yet still associated with an active connection (aka zombie), per endpoint. Available in Cilium v1.12+",0,cilium,fdqn alive zombie connections,
 cilium.ipcache.errors.total,count,,error,,"[OpenMetrics V1] Number of errors interacting with the ipcache",-1,cilium,ipcache errors v1,
 cilium.ipcache.errors.count,count,,error,,"[OpenMetrics V2] Number of errors interacting with the ipcache",-1,cilium,ipcache errors v2,
 cilium.ip_addresses.count,gauge,,unit,,"[OpenMetrics V1 and V2] Number of allocated ip_addresses",0,cilium,ip count,
@@ -114,6 +117,14 @@ cilium.kvstore.quorum_errors.total,count,,error,,"[OpenMetrics V1] Number of quo
 cilium.kvstore.quorum_errors.count,count,,error,,"[OpenMetrics V2] Number of quorum errors",-1,cilium,kvstore quorum errors,
 cilium.kvstore.sync_queue_size,gauge,,item,,"Number of elements queued for synchronization in the kvstore",-1,cilium,kvstore sync queue size,
 cilium.kvstore.initial_sync_completed,gauge,,,,"Whether the initial synchronization from/to the kvstore has completed",0,cilium,kvstore initial sync completed,
+cilium.proxy.redirects,gauge,,,,"Number of redirects installed for endpoints by protocol",0,cilium,proxy redirects,
+cilium.proxy.upstream_reply.seconds.count,count,,second,,"[OpenMetrics V1 and V2] Seconds waited for upstream server to reply to a request labeled by error, protocol and span time",-1,cilium,proxy upstream reply seconds,
+cilium.proxy.upstream_reply.seconds.sum,count,,second,,"[OpenMetrics V1 and V2] Seconds waited for upstream server to reply to a request labeled by error, protocol and span time",-1,cilium,proxy upstream reply seconds,
+cilium.proxy.upstream_reply.seconds.bucket,count,,second,,"[OpenMetrics V2] Seconds waited for upstream server to reply to a request labeled by error, protocol and span time",-1,cilium,proxy upstream reply seconds,
+cilium.proxy.datapath.update_timeout.total,count,,timeout,,"[OpenMetrics V1] Number of total datapath update timeouts due to FQDN IP updates. Available in Cilium 1.10+",-1,cilium,proxy datapath update timeout,
+cilium.proxy.datapath.update_timeout.count,count,,timeout,,"[OpenMetrics V2] Number of total datapath update timeouts due to FQDN IP updates. Available in Cilium 1.10+",-1,cilium,proxy datapath update timeout,
+cilium.policy.l7.total,count,,unit,,"[OpenMetrics V1] Number of total L7 requests/responses by type",0,cilium,policy l7 total,
+cilium.policy.l7.count,count,,unit,,"[OpenMetrics V2] Number of total L7 requests/responses by type",0,cilium,policy l7 total,
 cilium.policy.l7_denied.total,count,,unit,,"[OpenMetrics V1] Number of total L7 denied requests/responses due to policy. Available in Cilium <= v1.7",-1,cilium,denied l7 policy,
 cilium.policy.l7_denied.count,count,,unit,,"[OpenMetrics V2] Number of total L7 denied requests/responses due to policy. Available in Cilium <= v1.7",-1,cilium,denied l7 policy,
 cilium.policy.l7_forwarded.total,count,,unit,,"[OpenMetrics V1] Number of total L7 forwarded requests/responses. Available in Cilium <= v1.7",1,cilium,forwarded l7 policy,
diff --git a/cilium/tests/common.py b/cilium/tests/common.py
index 7c74ac72bb26a..c66ce0d2086ff 100644
--- a/cilium/tests/common.py
+++ b/cilium/tests/common.py
@@ -64,6 +64,9 @@
     "cilium.forward_bytes.count",
     "cilium.forward_count.count",
     "cilium.fqdn.gc_deletions.count",
+    "cilium.fqdn.active_names",
+    "cilium.fqdn.active_ips",
+    "cilium.fqdn.alive_zombie_connections",
     "cilium.identity.count",
     "cilium.ip_addresses.count",
     "cilium.ipam.events.count",
@@ -79,6 +82,12 @@
     "cilium.policy.count",
     "cilium.policy.endpoint_enforcement_status",
     "cilium.policy.import_errors.count",
+    "cilium.proxy.redirects",
+    "cilium.proxy.upstream_reply.seconds.bucket",
+    "cilium.proxy.upstream_reply.seconds.count",
+    "cilium.proxy.upstream_reply.seconds.sum",
+    "cilium.proxy.datapath.update_timeout.count",
+    "cilium.policy.l7.count",
     "cilium.policy.l7_denied.count",
     "cilium.policy.l7_forwarded.count",
     "cilium.policy.l7_parse_errors.count",
@@ -157,6 +166,9 @@
     "cilium.forward_bytes.total",
     "cilium.forward_count.total",
     "cilium.fqdn.gc_deletions.total",
+    "cilium.fqdn.active_names",
+    "cilium.fqdn.active_ips",
+    "cilium.fqdn.alive_zombie_connections",
     "cilium.identity.count",
     "cilium.ip_addresses.count",
     "cilium.ipcache.errors.total",
@@ -172,6 +184,11 @@
     "cilium.policy.count",
     "cilium.policy.endpoint_enforcement_status",
     "cilium.policy.import_errors.count",
+    "cilium.proxy.redirects",
+    "cilium.proxy.upstream_reply.seconds.count",
+    "cilium.proxy.upstream_reply.seconds.sum",
+    "cilium.proxy.datapath.update_timeout.total",
+    "cilium.policy.l7.total",
     "cilium.policy.l7_denied.total",
     "cilium.policy.l7_forwarded.total",
     "cilium.policy.l7_parse_errors.total",
@@ -224,6 +241,8 @@
     "cilium.triggers_policy.update_call_duration.seconds.sum",
     "cilium.policy.implementation_delay.count",
     "cilium.policy.implementation_delay.sum",
+    "cilium.proxy.upstream_reply.seconds.count",
+    "cilium.proxy.upstream_reply.seconds.sum",
 ]
 
 OPERATOR_V2_PROCESS_METRICS = [
@@ -344,6 +363,7 @@
     "cilium.operator.ces.sync_errors.count",
 ]
 
+# Optional metrics for integration tests
 OPTIONAL_METRICS = {
     "cilium.bpf.map_pressure",
     "cilium.datapath.conntrack_dump.resets.count",
@@ -367,4 +387,13 @@
     "cilium.kvstore.quorum_errors.count",
     "cilium.kvstore.sync_queue_size",
     "cilium.kvstore.initial_sync_completed",
+    "cilium.fqdn.active_names",
+    "cilium.fqdn.active_ips",
+    "cilium.fqdn.alive_zombie_connections",
+    "cilium.proxy.redirects",
+    "cilium.proxy.upstream_reply.seconds.bucket",
+    "cilium.proxy.upstream_reply.seconds.count",
+    "cilium.proxy.upstream_reply.seconds.sum",
+    "cilium.proxy.datapath.update_timeout.count",
+    "cilium.policy.l7.count",
 }
diff --git a/cilium/tests/fixtures/agent_metrics.txt b/cilium/tests/fixtures/agent_metrics.txt
index 457805cac4bf3..df1482ea9734a 100644
--- a/cilium/tests/fixtures/agent_metrics.txt
+++ b/cilium/tests/fixtures/agent_metrics.txt
@@ -581,6 +581,15 @@ cilium_forward_count_total{direction="INGRESS"} 1.455756e+06
 # HELP cilium_fqdn_gc_deletions_total Number of FQDNs that have been cleaned on FQDN Garbage collector job
 # TYPE cilium_fqdn_gc_deletions_total counter
 cilium_fqdn_gc_deletions_total 0
+# HELP cilium_fqdn_active_names Number of domains inside the DNS cache that have not expired (by TTL), per endpoint
+# TYPE cilium_fqdn_active_names gauge
+cilium_fqdn_active_names{endpoint="123"} 1
+# HELP cilium_fqdn_active_ips Number of IPs inside the DNS cache associated with a domain that has not expired (by TTL), per endpoint
+# TYPE cilium_fqdn_active_ips gauge
+cilium_fqdn_active_ips{endpoint="123"} 1
+# HELP cilium_fqdn_alive_zombie_connections Number of IPs associated with domains that have expired (by TTL) yet still associated with an active connection (aka zombie), per endpoint
+# TYPE cilium_fqdn_alive_zombie_connections gauge
+cilium_fqdn_alive_zombie_connections{endpoint="123"} 0
 # HELP cilium_identity_count Number of identities currently allocated
 # TYPE cilium_identity_count gauge
 cilium_identity_count 13
@@ -960,6 +969,88 @@ cilium_policy_endpoint_enforcement_status{enforcement="none"} 2
 # HELP cilium_policy_import_errors Number of times a policy import has failed
 # TYPE cilium_policy_import_errors counter
 cilium_policy_import_errors 0
+# HELP cilium_proxy_redirects Number of redirects installed for endpoints, labeled by protocol
+# TYPE cilium_proxy_redirects gauge
+cilium_proxy_redirects{protocol_l7="dns"} 18
+# HELP cilium_proxy_upstream_reply_seconds Seconds waited to get a reply from a upstream server
+# TYPE cilium_proxy_upstream_reply_seconds histogram
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="0.005"} 65310
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="0.01"} 67455
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="0.025"} 86203
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="0.05"} 86727
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="0.1"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="0.25"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="0.5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="1"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="2.5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="10"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="dataplaneTime",le="+Inf"} 86734
+cilium_proxy_upstream_reply_seconds_sum{error="allow",protocol_l7="dns",scope="dataplaneTime"} 319.95475046600376
+cilium_proxy_upstream_reply_seconds_count{error="allow",protocol_l7="dns",scope="dataplaneTime"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="0.005"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="0.01"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="0.025"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="0.05"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="0.1"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="0.25"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="0.5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="1"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="2.5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="10"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="policyCheckTime",le="+Inf"} 86734
+cilium_proxy_upstream_reply_seconds_sum{error="allow",protocol_l7="dns",scope="policyCheckTime"} 0.7216416319999959
+cilium_proxy_upstream_reply_seconds_count{error="allow",protocol_l7="dns",scope="policyCheckTime"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="0.005"} 65308
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="0.01"} 67248
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="0.025"} 86186
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="0.05"} 86725
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="0.1"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="0.25"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="0.5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="1"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="2.5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="10"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="processingTime",le="+Inf"} 86734
+cilium_proxy_upstream_reply_seconds_sum{error="allow",protocol_l7="dns",scope="processingTime"} 337.8281641690027
+cilium_proxy_upstream_reply_seconds_count{error="allow",protocol_l7="dns",scope="processingTime"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="0.005"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="0.01"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="0.025"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="0.05"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="0.1"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="0.25"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="0.5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="1"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="2.5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="10"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="allow",protocol_l7="dns",scope="semaphoreTime",le="+Inf"} 86734
+cilium_proxy_upstream_reply_seconds_sum{error="allow",protocol_l7="dns",scope="semaphoreTime"} 0
+cilium_proxy_upstream_reply_seconds_count{error="allow",protocol_l7="dns",scope="semaphoreTime"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="0.005"} 86461
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="0.01"} 86683
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="0.025"} 86733
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="0.05"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="0.1"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="0.25"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="0.5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="1"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="2.5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="5"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="10"} 86734
+cilium_proxy_upstream_reply_seconds_bucket{error="timeout",protocol_l7="dns",scope="upstreamTime",le="+Inf"} 86734
+cilium_proxy_upstream_reply_seconds_sum{error="timeout",protocol_l7="dns",scope="upstreamTime"} 64.2562496679994
+cilium_proxy_upstream_reply_seconds_count{error="timeout",protocol_l7="dns",scope="upstreamTime"} 86734
+# HELP cilium_proxy_datapath_update_timeout_total Number of total datapath update timeouts due to FQDN IP updates
+# TYPE cilium_proxy_datapath_update_timeout_total counter
+cilium_proxy_datapath_update_timeout_total 2
+# HELP cilium_policy_l7_total Number of total proxy requests handled
+# TYPE cilium_policy_l7_total counter
+cilium_policy_l7_total{rule="forwarded"} 700864
+cilium_policy_l7_total{rule="received"} 700864
 # HELP cilium_policy_l7_denied_total Number of total L7 denied requests/responses due to policy
 # TYPE cilium_policy_l7_denied_total counter
 cilium_policy_l7_denied_total 0
diff --git a/cilium/tests/legacy/legacy_common.py b/cilium/tests/legacy/legacy_common.py
index 310693544b6e2..e5205162143a9 100644
--- a/cilium/tests/legacy/legacy_common.py
+++ b/cilium/tests/legacy/legacy_common.py
@@ -50,6 +50,11 @@
     'cilium.subprocess.start.total',
     'cilium.process.cpu.seconds.total',
     'cilium.policy.regeneration.total',
+    'cilium.proxy.redirects',
+    'cilium.proxy.upstream_reply.seconds.count',
+    'cilium.proxy.upstream_reply.seconds.sum',
+    'cilium.proxy.datapath.update_timeout.total',
+    'cilium.policy.l7.total',
     'cilium.policy.l7_denied.total',
     'cilium.policy.l7_forwarded.total',
     'cilium.policy.l7_parse_errors.total',
@@ -62,6 +67,9 @@
     'cilium.k8s_client.api_calls.count',
     'cilium.ipam.events.total',
     'cilium.fqdn.gc_deletions.total',
+    'cilium.fqdn.active_names',
+    'cilium.fqdn.active_ips',
+    'cilium.fqdn.alive_zombie_connections',
     'cilium.forward_bytes.total',
     'cilium.forward_count.total',
     'cilium.errors_warning.total',
diff --git a/datadog_checks_base/changelog.d/16080.fixed b/datadog_checks_base/changelog.d/16080.fixed
new file mode 100644
index 0000000000000..de77fe27da120
--- /dev/null
+++ b/datadog_checks_base/changelog.d/16080.fixed
@@ -0,0 +1 @@
+Fix `aarch64` compatibility of the `sqlserver` check by downgrading `lxml` to version 4.9.2 ([16080](https://github.com/DataDog/integrations-core/pull/16080))
\ No newline at end of file
diff --git a/datadog_checks_base/changelog.d/16150.fixed b/datadog_checks_base/changelog.d/16150.fixed
new file mode 100644
index 0000000000000..bf3c5c374e79b
--- /dev/null
+++ b/datadog_checks_base/changelog.d/16150.fixed
@@ -0,0 +1 @@
+Bump the dnspython version to 2.4.2 on Python 3
diff --git a/datadog_checks_base/datadog_checks/base/data/agent_requirements.in b/datadog_checks_base/datadog_checks/base/data/agent_requirements.in
index db7dfc79f8069..42b49c29747f8 100644
--- a/datadog_checks_base/datadog_checks/base/data/agent_requirements.in
+++ b/datadog_checks_base/datadog_checks/base/data/agent_requirements.in
@@ -24,7 +24,8 @@ cryptography==41.0.5; python_version > '3.0'
 ddtrace==0.32.2; sys_platform == 'win32' and python_version < '3.0'
 ddtrace==0.53.2; sys_platform != 'win32' and python_version < '3.0'
 ddtrace==1.11.2; python_version > '3.0'
-dnspython==1.16.0
+dnspython==1.16.0; python_version < '3.0'
+dnspython==2.4.2; python_version > '3.0'
 enum34==1.1.10; python_version < '3.0'
 foundationdb==6.3.24; python_version > '3.0'
 futures==3.4.0; python_version < '3.0'
@@ -38,7 +39,7 @@ jpype1==1.4.1; python_version > '3.0'
 kubernetes==18.20.0; python_version < '3.0'
 kubernetes==28.1.0; python_version > '3.0'
 ldap3==2.9.1
-lxml==4.9.3
+lxml==4.9.2
 lz4==2.2.1; python_version < '3.0'
 lz4==4.3.2; python_version > '3.0'
 mmh3==2.5.1; python_version < '3.0'
diff --git a/datadog_checks_dev/changelog.d/16166.fixed b/datadog_checks_dev/changelog.d/16166.fixed
new file mode 100644
index 0000000000000..190a241683b0e
--- /dev/null
+++ b/datadog_checks_dev/changelog.d/16166.fixed
@@ -0,0 +1 @@
+Exclude orjson when checking for dependency updates.
diff --git a/datadog_checks_dev/datadog_checks/dev/tooling/commands/dep.py b/datadog_checks_dev/datadog_checks/dev/tooling/commands/dep.py
index 2e47f0b43d0b2..463a3d5ef45b3 100644
--- a/datadog_checks_dev/datadog_checks/dev/tooling/commands/dep.py
+++ b/datadog_checks_dev/datadog_checks/dev/tooling/commands/dep.py
@@ -47,6 +47,13 @@
     # We're not ready to switch to v3 of the postgress library, see:
     # https://github.com/DataDog/integrations-core/pull/15859
     'psycopg2-binary',
+    # orjson ... requires rustc 1.65+, but the latest we can have (thanks CentOS 6) is 1.62.
+    # We get the following error when compiling orjson on Centos 6:
+    # error: package `associative-cache v2.0.0` cannot be built because it requires rustc 1.65 or newer,
+    # while the currently active rustc version is 1.62.0-nightly
+    # Here's orjson switching to rustc 1.65:
+    # https://github.com/ijl/orjson/commit/ce9bae876657ed377d761bf1234b040e2cc13d3c
+    'orjson',
 }
 
 # Dependencies for the downloader that are security-related and should be updated separately from the others
diff --git a/datadog_cluster_agent/changelog.d/16122.added b/datadog_cluster_agent/changelog.d/16122.added
new file mode 100644
index 0000000000000..1022ea804d41f
--- /dev/null
+++ b/datadog_cluster_agent/changelog.d/16122.added
@@ -0,0 +1 @@
+Add `datadog.rate_limit_queries.remaining_min` to default metrics of `datadog_cluster_agent` integration 
\ No newline at end of file
diff --git a/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/check.py b/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/check.py
index 0d2f1d9b6f301..4e6933fedad86 100644
--- a/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/check.py
+++ b/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/check.py
@@ -51,6 +51,7 @@
     'rate_limit_queries_limit': 'datadog.rate_limit_queries.limit',
     'rate_limit_queries_period': 'datadog.rate_limit_queries.period',
     'rate_limit_queries_remaining': 'datadog.rate_limit_queries.remaining',
+    'rate_limit_queries_remaining_min': 'datadog.rate_limit_queries.remaining_min',
     'rate_limit_queries_reset': 'datadog.rate_limit_queries.reset',
     'secret_backend__elapsed_ms': 'secret_backend.elapsed',
 }
diff --git a/datadog_cluster_agent/metadata.csv b/datadog_cluster_agent/metadata.csv
index f2a1c15b2377e..3869e13a7e679 100644
--- a/datadog_cluster_agent/metadata.csv
+++ b/datadog_cluster_agent/metadata.csv
@@ -34,6 +34,7 @@ datadog.cluster_agent.cluster_checks.updating_stats_duration_seconds,gauge,,seco
 datadog.cluster_agent.datadog.rate_limit_queries.limit,gauge,,query,,Maximum number of queries to the Datadog API allowed in the period by endpoint,0,datadog_cluster_agent,rate limit queries limit,
 datadog.cluster_agent.datadog.rate_limit_queries.period,gauge,,second,,Period of rate limiting for the Datadog API by endpoint,0,datadog_cluster_agent,rate limit queries period,
 datadog.cluster_agent.datadog.rate_limit_queries.remaining,gauge,,query,,Number of queries to the Datadog API remaining before next reset by endpoint,0,datadog_cluster_agent,rate limit queries remaining,
+datadog.cluster_agent.datadog.rate_limit_queries.remaining_min,gauge,,query,,Minimum number of queries remaining before next reset observed during an expiration interval of 2*refresh period,0,datadog_cluster_agent,rate limit queries remaining minimum,
 datadog.cluster_agent.datadog.rate_limit_queries.reset,gauge,,second,,Number of seconds before next reset applied to the Datadog API by endpoint,0,datadog_cluster_agent,rate limit queries reset,
 datadog.cluster_agent.datadog.requests,count,,request,,Requests made to Datadog by status,0,datadog_cluster_agent,datadog requests,
 datadog.cluster_agent.endpoint_checks.configs_dispatched,gauge,,,,Number of endpoint-check configurations dispatched by node,0,datadog_cluster_agent,endpoint check configs dispatched,
diff --git a/datadog_cluster_agent/tests/fixtures/metrics.txt b/datadog_cluster_agent/tests/fixtures/metrics.txt
index c7b3d890bc415..a148f738aae1d 100644
--- a/datadog_cluster_agent/tests/fixtures/metrics.txt
+++ b/datadog_cluster_agent/tests/fixtures/metrics.txt
@@ -313,6 +313,9 @@ rate_limit_queries_period{endpoint="/api/v1/query",join_leader="true"} 3600
 # HELP rate_limit_queries_remaining number of queries remaining before next reset
 # TYPE rate_limit_queries_remaining gauge
 rate_limit_queries_remaining{endpoint="/api/v1/query",join_leader="true"} 5473
+# HELP rate_limit_queries_remaining_min minimum number of queries remaining before next reset observed during an expiration interval of 2*refresh period
+# TYPE rate_limit_queries_remaining_min gauge
+rate_limit_queries_remaining_min{endpoint="/api/v1/query",join_leader="true"} 248
 # HELP rate_limit_queries_reset number of seconds before next reset
 # TYPE rate_limit_queries_reset gauge
 rate_limit_queries_reset{endpoint="/api/v1/query",join_leader="true"} 414
diff --git a/datadog_cluster_agent/tests/test_datadog_cluster_agent.py b/datadog_cluster_agent/tests/test_datadog_cluster_agent.py
index a589746e427a5..6f148d56d2e5f 100644
--- a/datadog_cluster_agent/tests/test_datadog_cluster_agent.py
+++ b/datadog_cluster_agent/tests/test_datadog_cluster_agent.py
@@ -48,6 +48,7 @@
     'datadog.rate_limit_queries.limit',
     'datadog.rate_limit_queries.period',
     'datadog.rate_limit_queries.remaining',
+    'datadog.rate_limit_queries.remaining_min',
     'datadog.rate_limit_queries.reset',
     'datadog.requests',
     'endpoint_checks.configs_dispatched',
diff --git a/ddev/changelog.d/16156.fixed b/ddev/changelog.d/16156.fixed
new file mode 100644
index 0000000000000..e05438a8d59cf
--- /dev/null
+++ b/ddev/changelog.d/16156.fixed
@@ -0,0 +1 @@
+Allow bumping the version of `dnspython`
diff --git a/ddev/changelog.d/16157.fixed b/ddev/changelog.d/16157.fixed
new file mode 100644
index 0000000000000..ae2f8ff5063c5
--- /dev/null
+++ b/ddev/changelog.d/16157.fixed
@@ -0,0 +1 @@
+Add a retry mechanism when pulling the agent docker image
diff --git a/ddev/pyproject.toml b/ddev/pyproject.toml
index 9d788c438c36f..c697c3b4a1ce7 100644
--- a/ddev/pyproject.toml
+++ b/ddev/pyproject.toml
@@ -34,6 +34,7 @@ dependencies = [
     "jsonpointer",
     "pluggy",
     "rich>=12.5.1",
+    "stamina==23.2.0",
     "tomli; python_version < '3.11'",
     "tomli-w",
     "tomlkit",
diff --git a/ddev/src/ddev/cli/dep.py b/ddev/src/ddev/cli/dep.py
index 83a4b84a13133..f5e65692142e5 100644
--- a/ddev/src/ddev/cli/dep.py
+++ b/ddev/src/ddev/cli/dep.py
@@ -17,7 +17,6 @@
 # Dependencies to ignore when update dependencies
 IGNORED_DEPS = {
     'ddtrace',  # https://github.com/DataDog/integrations-core/pull/9132
-    'dnspython',
     'pymysql',  # https://github.com/DataDog/integrations-core/pull/12612
     'foundationdb',  # Breaking datadog_checks_base tests
     'openstacksdk',  # Breaking openstack_controller tests
diff --git a/ddev/src/ddev/e2e/agent/docker.py b/ddev/src/ddev/e2e/agent/docker.py
index 61d5213ef9c94..a5c86972fd23f 100644
--- a/ddev/src/ddev/e2e/agent/docker.py
+++ b/ddev/src/ddev/e2e/agent/docker.py
@@ -9,6 +9,8 @@
 from functools import cache, cached_property
 from typing import TYPE_CHECKING, Callable
 
+import stamina
+
 from ddev.e2e.agent.interface import AgentInterface
 from ddev.utils.structures import EnvVars
 
@@ -165,9 +167,7 @@ def start(self, *, agent_build: str, local_packages: dict[Path, str], env_vars:
                     volumes[i] = f'/{vm_file}:{remaining}'
 
         if os.getenv('DDEV_E2E_DOCKER_NO_PULL') != '1':
-            process = self._run_command(['docker', 'pull', agent_build])
-            if process.returncode:
-                raise RuntimeError(f'Could not pull image {agent_build}')
+            self.__pull_image(agent_build)
 
         command = [
             'docker',
@@ -282,6 +282,12 @@ def invoke(self, args: list[str]) -> None:
     def enter_shell(self) -> None:
         self._run_command(self._format_command(['cmd' if self._is_windows_container else 'bash']), check=True)
 
+    @stamina.retry(on=RuntimeError, attempts=3)
+    def __pull_image(self, agent_build):
+        process = self._run_command(['docker', 'pull', agent_build])
+        if process.returncode:
+            raise RuntimeError(f'Could not pull image {agent_build}')
+
 
 @cache
 def _get_hostname():
diff --git a/ddev/tests/e2e/agent/test_docker.py b/ddev/tests/e2e/agent/test_docker.py
index e6936b4700eb2..0c6959cc09735 100644
--- a/ddev/tests/e2e/agent/test_docker.py
+++ b/ddev/tests/e2e/agent/test_docker.py
@@ -491,6 +491,70 @@ def test_docker_volumes_windows_running_windows(
             ),
         ]
 
+    def test_retry_pull_image(
+        self,
+        platform,
+        temp_dir,
+        default_hostname,
+        get_integration,
+        docker_path,
+        free_port,
+        mocker,
+    ):
+        run = mocker.patch(
+            'subprocess.run',
+            side_effect=[
+                mocker.MagicMock(returncode=1),
+                mocker.MagicMock(returncode=1),
+                mocker.MagicMock(returncode=0),
+                mocker.MagicMock(returncode=0),
+            ],
+        )
+
+        integration = 'postgres'
+        environment = 'py3.12'
+        metadata = {}
+
+        agent = DockerAgent(platform, get_integration(integration), environment, metadata, temp_dir / 'config.yaml')
+        agent.start(agent_build='', local_packages={}, env_vars={})
+
+        assert run.call_args_list == [
+            mocker.call([docker_path, 'pull', 'datadog/agent-dev:master-py3'], shell=False),
+            mocker.call([docker_path, 'pull', 'datadog/agent-dev:master-py3'], shell=False),
+            mocker.call([docker_path, 'pull', 'datadog/agent-dev:master-py3'], shell=False),
+            mocker.call(
+                [
+                    docker_path,
+                    'run',
+                    '-d',
+                    '--name',
+                    f'dd_{integration}_{environment}',
+                    '--network',
+                    'host',
+                    '-v',
+                    '/proc:/host/proc',
+                    '-e',
+                    'DD_API_KEY=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+                    '-e',
+                    'DD_APM_ENABLED=false',
+                    '-e',
+                    f'DD_CMD_PORT={free_port}',
+                    '-e',
+                    'DD_EXPVAR_PORT=5000',
+                    '-e',
+                    f'DD_HOSTNAME={default_hostname}',
+                    '-e',
+                    'DD_TELEMETRY_ENABLED=1',
+                    '-e',
+                    'PYTHONDONTWRITEBYTECODE=1',
+                    'datadog/agent-dev:master-py3',
+                ],
+                shell=False,
+                stdout=subprocess.PIPE,
+                stderr=subprocess.STDOUT,
+            ),
+        ]
+
     def test_custom_hosts(
         self,
         platform,
diff --git a/dns_check/changelog.d/16150.fixed b/dns_check/changelog.d/16150.fixed
new file mode 100644
index 0000000000000..bf3c5c374e79b
--- /dev/null
+++ b/dns_check/changelog.d/16150.fixed
@@ -0,0 +1 @@
+Bump the dnspython version to 2.4.2 on Python 3
diff --git a/dns_check/datadog_checks/dns_check/dns_check.py b/dns_check/datadog_checks/dns_check/dns_check.py
index 9877040251e46..e6c7598e23a9b 100644
--- a/dns_check/datadog_checks/dns_check/dns_check.py
+++ b/dns_check/datadog_checks/dns_check/dns_check.py
@@ -78,7 +78,8 @@ def check(self, _):
                     raise AssertionError("Expected an NXDOMAIN, got a result.")
             else:
                 answer = resolver.query(self.hostname, rdtype=self.record_type)  # dns.resolver.Answer
-                assert answer.rrset.items[0].to_text()
+                assert any(it.to_text() for it in answer.rrset.items)
+
                 if self.resolves_as_ips:
                     self._check_answer(answer)
 
diff --git a/dns_check/pyproject.toml b/dns_check/pyproject.toml
index 83b65d1c3d393..11eeda6322d15 100644
--- a/dns_check/pyproject.toml
+++ b/dns_check/pyproject.toml
@@ -39,7 +39,8 @@ dynamic = [
 
 [project.optional-dependencies]
 deps = [
-    "dnspython==1.16.0",
+    "dnspython==1.16.0; python_version < '3.0'",
+    "dnspython==2.4.2; python_version > '3.0'",
 ]
 
 [project.urls]
diff --git a/dns_check/tests/common.py b/dns_check/tests/common.py
index 70531eedb448c..27623fc1ca186 100644
--- a/dns_check/tests/common.py
+++ b/dns_check/tests/common.py
@@ -51,26 +51,6 @@
     'nameserver': '127.0.0.1',
 }
 
-CONFIG_INVALID = [
-    # invalid hostname
-    ({'name': 'invalid_hostname', 'hostname': 'example'}, "DNS resolution of example has failed"),
-    # invalid nameserver
-    (
-        {'name': 'invalid_nameserver', 'hostname': 'www.example.org', 'nameserver': '0.0.0.0'},
-        "DNS resolution of www.example.org timed out",
-    ),
-    # invalid record type
-    (
-        {'name': 'invalid_rcrd_type', 'hostname': 'www.example.org', 'record_type': 'FOO'},
-        "DNS resolution of www.example.org has failed",
-    ),
-    # valid domain when NXDOMAIN is expected
-    (
-        {'name': 'valid_domain_for_nxdomain_type', 'hostname': 'example.com', 'record_type': 'NXDOMAIN'},
-        "DNS resolution of example.com has failed",
-    ),
-]
-
 E2E_METADATA = {'docker_platform': 'windows' if using_windows_containers() else 'linux'}
 
 
diff --git a/dns_check/tests/mocks.py b/dns_check/tests/mocks.py
index ad4047e25e385..e4f9974fb4ceb 100644
--- a/dns_check/tests/mocks.py
+++ b/dns_check/tests/mocks.py
@@ -3,6 +3,7 @@
 # Licensed under Simplified BSD License (see LICENSE)
 
 from dns.resolver import NXDOMAIN
+from six import PY3
 
 
 class MockDNSAnswer:
@@ -13,12 +14,11 @@ class MockRrset:
         def __init__(self, address):
             addresses = [x.strip().lower() for x in address.split(',')]
             if len(addresses) > 1:
-                items = []
-                for address in addresses:
-                    items.append(MockDNSAnswer.MockItem(address))
-                self.items = items
+                items = [MockDNSAnswer.MockItem(address) for address in addresses]
             else:
-                self.items = [MockDNSAnswer.MockItem(address)]
+                items = [MockDNSAnswer.MockItem(address)]
+
+            self.items = {item: None for item in items} if PY3 else items
 
     class MockItem:
         def __init__(self, address):
diff --git a/dns_check/tests/test_dns_check.py b/dns_check/tests/test_dns_check.py
index f5f32e32e1835..fe012d56da7a2 100644
--- a/dns_check/tests/test_dns_check.py
+++ b/dns_check/tests/test_dns_check.py
@@ -124,11 +124,28 @@ def test_instance_timeout(mocked_query, mocked_time, aggregator):
     aggregator.assert_all_metrics_covered()
 
 
-def test_invalid_config(aggregator):
-    for instance, message in common.CONFIG_INVALID:
-        integration = DNSCheck('dns_check', {}, [instance])
-        integration.check(instance)
-        aggregator.assert_service_check(DNSCheck.SERVICE_CHECK_NAME, status=DNSCheck.CRITICAL, count=1, message=message)
-
-        # Assert coverage for this check on this instance
-        aggregator.assert_all_metrics_covered()
+@pytest.mark.parametrize(
+    'instance, message',
+    [
+        pytest.param(
+            {'name': 'invalid_hostname', 'hostname': 'example'},
+            "DNS resolution of example has failed",
+            id='invalid hostname',
+        ),
+        pytest.param(
+            {'name': 'invalid_rcrd_type', 'hostname': 'www.example.org', 'record_type': 'FOO'},
+            "DNS resolution of www.example.org has failed",
+            id='invalid record type',
+        ),
+        pytest.param(
+            {'name': 'valid_domain_for_nxdomain_type', 'hostname': 'example.com', 'record_type': 'NXDOMAIN'},
+            "DNS resolution of example.com has failed",
+            id='valid domain when NXDOMAIN is expected',
+        ),
+    ],
+)
+def test_invalid_config(aggregator, instance, message):
+    integration = DNSCheck('dns_check', {}, [instance])
+    integration.check(instance)
+    aggregator.assert_service_check(DNSCheck.SERVICE_CHECK_NAME, status=DNSCheck.CRITICAL, count=1, message=message)
+    aggregator.assert_all_metrics_covered()
diff --git a/http_check/assets/configuration/spec.yaml b/http_check/assets/configuration/spec.yaml
index 39e8cff1620bd..1cb43c5fd2e13 100644
--- a/http_check/assets/configuration/spec.yaml
+++ b/http_check/assets/configuration/spec.yaml
@@ -75,8 +75,11 @@ files:
         The check will report as DOWN if status code returned differs.
         This defaults to 1xx, 2xx and 3xx HTTP status code.
       value:
-        type: string
+        anyOf:
+          - type: string
+          - type: integer
         example: (1|2|3)\d\d
+        default: (1|2|3)\d\d
     - name: include_content
       description: |
         The include_content parameter will instruct the check
diff --git a/http_check/changelog.d/16163.fixed b/http_check/changelog.d/16163.fixed
new file mode 100644
index 0000000000000..400a06f3e258f
--- /dev/null
+++ b/http_check/changelog.d/16163.fixed
@@ -0,0 +1 @@
+Allow using an integer for the expected status code in the config
diff --git a/http_check/datadog_checks/http_check/config_models/instance.py b/http_check/datadog_checks/http_check/config_models/instance.py
index 0e69cf4f6a95a..db8ca88428bc1 100644
--- a/http_check/datadog_checks/http_check/config_models/instance.py
+++ b/http_check/datadog_checks/http_check/config_models/instance.py
@@ -71,7 +71,7 @@ class InstanceConfig(BaseModel):
     empty_default_hostname: Optional[bool] = None
     extra_headers: Optional[MappingProxyType[str, Any]] = None
     headers: Optional[MappingProxyType[str, Any]] = None
-    http_response_status_code: Optional[str] = None
+    http_response_status_code: Optional[Union[str, int]] = None
     include_content: Optional[bool] = None
     include_default_headers: Optional[bool] = None
     kerberos_auth: Optional[str] = None
diff --git a/http_check/datadog_checks/http_check/data/conf.yaml.example b/http_check/datadog_checks/http_check/data/conf.yaml.example
index 29dfe85a232df..ba82592c4e622 100644
--- a/http_check/datadog_checks/http_check/data/conf.yaml.example
+++ b/http_check/datadog_checks/http_check/data/conf.yaml.example
@@ -94,7 +94,7 @@ instances:
     #
     # reverse_content_match: false
 
-    ## @param http_response_status_code - string - optional - default: (1|2|3)\d\d
+    ## @param http_response_status_code - string or integer - optional - default: (1|2|3)\d\d
     ## The http_response_status_code parameter will instruct the check
     ## to look for a particular HTTP response status code or a Regex identifying
     ## a set of possible status codes.
diff --git a/http_check/tests/test_http_integration.py b/http_check/tests/test_http_integration.py
index b877c32514193..fc4ea0cdf41f7 100644
--- a/http_check/tests/test_http_integration.py
+++ b/http_check/tests/test_http_integration.py
@@ -605,3 +605,15 @@ def test_case_insensitive_header_content_type(dd_run_check, headers):
         assert check.http.options["headers"] == default_headers
     else:
         assert check.http.options["headers"] == headers
+
+
+def test_http_response_status_code_accepts_int_value(aggregator, dd_run_check):
+    instance = {
+        'name': 'foobar',
+        'url': 'http://something.com',
+        'http_response_status_code': 404,
+    }
+    check = HTTPCheck('http_check', {'ca_certs': 'foo'}, [instance])
+
+    dd_run_check(check)
+    aggregator.assert_service_check(HTTPCheck.SC_STATUS, status=AgentCheck.CRITICAL)
diff --git a/ibm_mq/metadata.csv b/ibm_mq/metadata.csv
index c3375d861b8e5..74af3ad8607c7 100644
--- a/ibm_mq/metadata.csv
+++ b/ibm_mq/metadata.csv
@@ -1,92 +1,92 @@
 metric_name,metric_type,interval,unit_name,per_unit_name,description,orientation,integration,short_name,curated_metric
 ibm_mq.channel.channels,gauge,,resource,,The number of active channels.,0,ibm_mq,active channel count,
 ibm_mq.channel.count,gauge,,,,Sum by status to count channels. Filter by channel and status tags to create notifications.,0,ibm_mq,channel count,
-ibm_mq.channel.batch_interval,gauge,,second,,This attribute is a period during which the channel keeps a batch open even if there are no messages on the transmission queue (parameter identifier: BATCHINT).,0,ibm_mq,batch interval,
-ibm_mq.channel.batch_size,gauge,,resource,,This attribute is the maximum number of messages to be sent before a sync point is taken (parameter identifier: BATCHSZ).,0,ibm_mq,batch size,
-ibm_mq.channel.disc_interval,gauge,,second,,"This attribute is the length of time after which a channel closes down, if no message arrives during that period (parameter identifier: DISCINT).",0,ibm_mq,disc interval,
-ibm_mq.channel.hb_interval,gauge,,second,,This attribute specifies the approximate time between heartbeat flows that are to be passed from a sending MCA when there are no messages on the transmission queue (parameter identifier: HBINT).,0,ibm_mq,hb interval,
-ibm_mq.channel.keep_alive_interval,gauge,,second,,This attribute is used to specify a timeout value for a channel (parameter identifier: KAINT).,0,ibm_mq,keep alive interval,
-ibm_mq.channel.long_retry,gauge,,time,,This attribute specifies the maximum number of times that the channel is to try allocating a session to its partner (parameter identifier: LONGRTY).,0,ibm_mq,long retry,
-ibm_mq.channel.long_timer,gauge,,second,,"This attribute is the approximate interval in seconds that the channel is to wait before retrying to establish connection, during the long retry mode (parameter identifier: LONGTMR).",0,ibm_mq,long timer,
-ibm_mq.channel.max_message_length,gauge,,byte,,This attribute specifies the maximum length of a message that can be transmitted on the channel (parameter identifier: MAXMSGL).,0,ibm_mq,max msg length,
-ibm_mq.channel.mr_count,gauge,,,,This attribute specifies the number of times the channel tries to redeliver the message (parameter identifier: MRRTY).,0,ibm_mq,mr count,
-ibm_mq.channel.mr_interval,gauge,,second,,This attribute specifies the minimum interval of time that must pass before the channel can retry the MQPUT operation (parameter identifier: MRTMR).,0,ibm_mq,mr interval,
+ibm_mq.channel.batch_interval,gauge,,second,,This attribute is a period during which the channel keeps a batch open even if there are no messages on the transmission queue (parameter identifier: `BATCHINT`).,0,ibm_mq,batch interval,
+ibm_mq.channel.batch_size,gauge,,resource,,This attribute is the maximum number of messages to be sent before a sync point is taken (parameter identifier: `BATCHSZ`).,0,ibm_mq,batch size,
+ibm_mq.channel.disc_interval,gauge,,second,,"This attribute is the length of time after which a channel closes down, if no message arrives during that period (parameter identifier: `DISCINT`).",0,ibm_mq,disc interval,
+ibm_mq.channel.hb_interval,gauge,,second,,This attribute specifies the approximate time between heartbeat flows that are to be passed from a sending MCA when there are no messages on the transmission queue (parameter identifier: `HBINT`).,0,ibm_mq,hb interval,
+ibm_mq.channel.keep_alive_interval,gauge,,second,,This attribute is used to specify a timeout value for a channel (parameter identifier: `KAINT`).,0,ibm_mq,keep alive interval,
+ibm_mq.channel.long_retry,gauge,,time,,This attribute specifies the maximum number of times that the channel is to try allocating a session to its partner (parameter identifier: `LONGRTY`).,0,ibm_mq,long retry,
+ibm_mq.channel.long_timer,gauge,,second,,"This attribute is the approximate interval in seconds that the channel is to wait before retrying to establish connection, during the long retry mode (parameter identifier: `LONGTMR`).",0,ibm_mq,long timer,
+ibm_mq.channel.max_message_length,gauge,,byte,,This attribute specifies the maximum length of a message that can be transmitted on the channel (parameter identifier: `MAXMSGL`).,0,ibm_mq,max msg length,
+ibm_mq.channel.mr_count,gauge,,,,This attribute specifies the number of times the channel tries to redeliver the message (parameter identifier: `MRRTY`).,0,ibm_mq,mr count,
+ibm_mq.channel.mr_interval,gauge,,second,,This attribute specifies the minimum interval of time that must pass before the channel can retry the MQPUT operation (parameter identifier: `MRTMR`).,0,ibm_mq,mr interval,
 ibm_mq.channel.network_priority,gauge,,,,"This attribute specifies the priority for the network connection. Distributed queuing chooses the path with the highest priority if there are multiple paths available. The value must be in the range 0 through 9; 0 is the lowest priority (parameter identifier: NETPRTY).",0,ibm_mq,network priority,
-ibm_mq.channel.npm_speed,gauge,,,,This attribute specifies the speed at which non-persistent messages are to be sent (parameter identifier: NPMSPEED).,0,ibm_mq,npm speed,
-ibm_mq.channel.sharing_conversations,gauge,,,,This attribute specifies the maximum number of conversations that can share a channel instance associated with this channel (parameter identifier: SHARECNV).,0,ibm_mq,sharing conversations,
-ibm_mq.channel.short_retry,gauge,,,,This attribute specifies the maximum number of attempts that are made by a sender or server channel to establish a connection to the remote machine (parameter identifier: MQIACH_SHORT_RETRY).,0,ibm_mq,short retry,
-ibm_mq.channel.short_timer,gauge,,second,,This attribute specifies the short retry wait interval for a sender or server channel that is started automatically by the channel initiator (Parameter identifier: MQIACH_SHORT_TIMER).,0,ibm_mq,short timer,
-ibm_mq.channel.buffers_rcvd,gauge,,buffer,,This attribute specifies the number of buffers received (parameter identifier: MQIACH_BUFFERS_RCVD).,0,ibm_mq,buffers rcvd,
-ibm_mq.channel.buffers_sent,gauge,,buffer,,This attribute specifies the number of buffers sent (parameter identifier: MQIACH_BUFFERS_SENT),0,ibm_mq,buffers sent,
-ibm_mq.channel.bytes_rcvd,gauge,,byte,,This attribute specifies the number of bytes received (parameter identifier: MQIACH_BYTES_RCVD).,0,ibm_mq,bytes rcvd,
-ibm_mq.channel.bytes_sent,gauge,,byte,,This attribute specifies the number of bytes sent (parameter identifier: MQIACH_BYTES_SENT).,0,ibm_mq,bytes sent,
-ibm_mq.channel.channel_status,gauge,,,,This attribute specifies the channel status (parameter identifier: MQIACH_CHANNEL_STATUS).,0,ibm_mq,channel status,
-ibm_mq.channel.mca_status,gauge,,,,This attribute specifies the MCA status (parameter identifier: MQIACH_MCA_STATUS). ,0,ibm_mq,mca status,
-ibm_mq.channel.msgs,gauge,,message,,"This attribute specifies the number of messages sent or received, or number of MQI calls handled (parameter identifier: MQIACH_MSGS).",0,ibm_mq,msgs,
-ibm_mq.channel.ssl_key_resets,gauge,,,,"The value represents the total number of unencrypted bytes that are sent and received on the channel before the secret key is renegotiated (parameter identifier: SSLRSTCNT).",0,ibm_mq,ssl key resets,
-ibm_mq.channel.batches,gauge,,,,This attribute specifies the number of completed batches (parameter identifier: MQIACH_BATCHES).,0,ibm_mq,batches,
-ibm_mq.channel.current_msgs,gauge,,message,,This attribute specifies the number of messages in-doubt (parameter identifier: MQIACH_CURRENT_MSGS).,0,ibm_mq,current msgs,
-ibm_mq.channel.indoubt_status,gauge,,,,This attribute specifies the number whether the channel is currently in doubt (parameter identifier: MQIACH_INDOUBT_STATUS).,0,ibm_mq,indoubt status,
-ibm_mq.queue.high_q_depth,gauge,,message,,This attribute specifies the maximum number of messages on a queue (parameter identifier: MQIA_HIGH_Q_DEPTH).,0,ibm_mq,high q depth,
-ibm_mq.queue.msg_deq_count,count,,message,,This attribute specifies the number of messages dequeued (parameter identifier: MQIA_MSG_DEQ_COUNT).,0,ibm_mq,msg deq count,
-ibm_mq.queue.msg_enq_count,count,,message,,This attribute specifies the number of messages enqueued (parameter identifier: MQIA_MSG_ENQ_COUNT).,0,ibm_mq,msg enq count,
-ibm_mq.queue.time_since_reset,count,,second,,This attribute specifies the time since statistics reset in seconds (parameter identifier: MQIA_TIME_SINCE_RESET).,0,ibm_mq,time since reset,
-ibm_mq.queue.service_interval,gauge,,millisecond,,This attribute specifies the target for queue service interval. This is used for comparison to generate Queue Service Interval High and Queue Service Interval OK events (parameter identifier: MQIA_Q_SERVICE_INTERVAL).,0,ibm_mq,service interval,
-ibm_mq.queue.inhibit_put,gauge,,occurrence,,This attribute specifies whether put operations are allowed (parameter identifier: MQIA_INHIBIT_PUT).,0,ibm_mq,puts inhibited,
+ibm_mq.channel.npm_speed,gauge,,,,This attribute specifies the speed at which non-persistent messages are to be sent (parameter identifier: `NPMSPEED`).,0,ibm_mq,npm speed,
+ibm_mq.channel.sharing_conversations,gauge,,,,This attribute specifies the maximum number of conversations that can share a channel instance associated with this channel (parameter identifier: `SHARECNV`).,0,ibm_mq,sharing conversations,
+ibm_mq.channel.short_retry,gauge,,,,This attribute specifies the maximum number of attempts that are made by a sender or server channel to establish a connection to the remote machine (parameter identifier: `MQIACH_SHORT_RETRY`).,0,ibm_mq,short retry,
+ibm_mq.channel.short_timer,gauge,,second,,This attribute specifies the short retry wait interval for a sender or server channel that is started automatically by the channel initiator (Parameter identifier: `MQIACH_SHORT_TIMER`).,0,ibm_mq,short timer,
+ibm_mq.channel.buffers_rcvd,gauge,,buffer,,This attribute specifies the number of buffers received (parameter identifier: `MQIACH_BUFFERS_RCVD`).,0,ibm_mq,buffers rcvd,
+ibm_mq.channel.buffers_sent,gauge,,buffer,,This attribute specifies the number of buffers sent (parameter identifier: `MQIACH_BUFFERS_SENT`),0,ibm_mq,buffers sent,
+ibm_mq.channel.bytes_rcvd,gauge,,byte,,This attribute specifies the number of bytes received (parameter identifier: `MQIACH_BYTES_RCVD`).,0,ibm_mq,bytes rcvd,
+ibm_mq.channel.bytes_sent,gauge,,byte,,This attribute specifies the number of bytes sent (parameter identifier: `MQIACH_BYTES_SENT`).,0,ibm_mq,bytes sent,
+ibm_mq.channel.channel_status,gauge,,,,This attribute specifies the channel status (parameter identifier: `MQIACH_CHANNEL_STATUS`).,0,ibm_mq,channel status,
+ibm_mq.channel.mca_status,gauge,,,,This attribute specifies the MCA status (parameter identifier: `MQIACH_MCA_STATUS`). ,0,ibm_mq,mca status,
+ibm_mq.channel.msgs,gauge,,message,,"This attribute specifies the number of messages sent or received, or number of MQI calls handled (parameter identifier: `MQIACH_MSGS`).",0,ibm_mq,msgs,
+ibm_mq.channel.ssl_key_resets,gauge,,,,"The value represents the total number of unencrypted bytes that are sent and received on the channel before the secret key is renegotiated (parameter identifier: `SSLRSTCNT`).",0,ibm_mq,ssl key resets,
+ibm_mq.channel.batches,gauge,,,,This attribute specifies the number of completed batches (parameter identifier: `MQIACH_BATCHES`).,0,ibm_mq,batches,
+ibm_mq.channel.current_msgs,gauge,,message,,This attribute specifies the number of messages in-doubt (parameter identifier: `MQIACH_CURRENT_MSGS`).,0,ibm_mq,current msgs,
+ibm_mq.channel.indoubt_status,gauge,,,,This attribute specifies the number whether the channel is currently in doubt (parameter identifier: `MQIACH_INDOUBT_STATUS`).,0,ibm_mq,indoubt status,
+ibm_mq.queue.high_q_depth,gauge,,message,,This attribute specifies the maximum number of messages on a queue (parameter identifier: `MQIA_HIGH_Q_DEPTH`).,0,ibm_mq,high q depth,
+ibm_mq.queue.msg_deq_count,count,,message,,This attribute specifies the number of messages dequeued (parameter identifier: `MQIA_MSG_DEQ_COUNT`).,0,ibm_mq,msg deq count,
+ibm_mq.queue.msg_enq_count,count,,message,,This attribute specifies the number of messages enqueued (parameter identifier: `MQIA_MSG_ENQ_COUNT`).,0,ibm_mq,msg enq count,
+ibm_mq.queue.time_since_reset,count,,second,,This attribute specifies the time since statistics reset in seconds (parameter identifier: `MQIA_TIME_SINCE_RESET`).,0,ibm_mq,time since reset,
+ibm_mq.queue.service_interval,gauge,,millisecond,,This attribute specifies the target for queue service interval. This is used for comparison to generate Queue Service Interval High and Queue Service Interval OK events (parameter identifier: `MQIA_Q_SERVICE_INTERVAL`).,0,ibm_mq,service interval,
+ibm_mq.queue.inhibit_put,gauge,,occurrence,,This attribute specifies whether put operations are allowed (parameter identifier: `MQIA_INHIBIT_PUT`).,0,ibm_mq,puts inhibited,
 ibm_mq.queue.depth_low_limit,gauge,,item,,"This attribute specifies low limit for queue depth. This indicates that an application has retrieved a message from a queue, and this has caused the number of messages on the queue to become less than or equal to the queue depth low threshold (parameter identifier: MQIA_Q_DEPTH_LOW_LIMIT).",0,ibm_mq,depth low limit,
-ibm_mq.queue.inhibit_get,gauge,,occurrence,,Whether get operations are allowed (parameter identifier: MQIA_INHIBIT_GET).,0,ibm_mq,gets inhibited,
-ibm_mq.queue.harden_get_backout,gauge,,request,,Whether to harden backout count. Specifies whether the count of backed out messages should be saved (hardened) across restarts of the message queue manager (parameter identifier: MQIA_HARDEN_GET_BACKOUT).,0,ibm_mq,times messages retrieved,
-ibm_mq.queue.service_interval_event,gauge,,occurrence,,Controls whether Service Interval High or Service Interval OK events are generated (parameter identifier: MQIA_Q_SERVICE_INTERVAL_EVENT).,0,ibm_mq,service needed,
-ibm_mq.queue.trigger_control,gauge,,method,,This attribute specifies whether trigger messages are written to the initiation queue (parameter identifier: MQIA_TRIGGER_CONTROL).,0,ibm_mq,trigger control,
-ibm_mq.queue.usage,gauge,,resource,,This attribute whether the queue is for normal usage or for transmitting messages to a remote message queue manager (parameter identifier: MQIA_USAGE).,0,ibm_mq,usage,
-ibm_mq.queue.scope,gauge,,resource,,"Scope of the queue definition (parameter identifier: MQIA_SCOPE). On OS/400, this is valid for receipt by MQSeries for AS/400 V4R2, or later. Specifies whether the scope of the queue definition does not extend beyond the queue manager which owns the queue, or whether the queue name is contained in a cell directory, so that it is known to all of the queue managers within the cell.",0,ibm_mq,scope,
-ibm_mq.queue.type,gauge,,resource,,"Type of queue to which the alias resolves (parameter identifier: MQIA_Q_TYPE).",0,ibm_mq,queue type,
-ibm_mq.queue.depth_max,gauge,,message,,"Maximum queue depth (parameter identifier: MQIA_MAX_Q_DEPTH). The maximum number of messages allowed on the queue. Note that other factors may cause the queue to be treated as full; for example, it will appear to be full if there is no storage available for a message.",0,ibm_mq,queue max depth,
-ibm_mq.queue.backout_threshold,gauge,,resource,,"Backout threshold (parameter identifier: MQIA_BACKOUT_THRESHOLD). That is, the number of times a message can be backed out before it is transferred to the backout queue specified by BackoutRequeueName.",0,ibm_mq,backout threshold,
-ibm_mq.queue.depth_high_event,gauge,,event,,"High limit for queue depth (parameter identifier: MQIA_Q_DEPTH_HIGH_LIMIT). This event indicates that an application has put a message to a queue, and this has caused the number of messages on the queue to become greater than or equal to the queue depth high threshold.",0,ibm_mq,depth high event,
-ibm_mq.queue.depth_low_event,gauge,,event,,"Low limit for queue depth (parameter identifier: MQIA_Q_DEPTH_LOW_LIMIT). This event indicates that an application has retrieved a message from a queue, and this has caused the number of messages on the queue to become less than or equal to the queue depth low threshold.",0,ibm_mq,depth low event,
-ibm_mq.queue.trigger_message_priority,gauge,,resource,,"Threshold message priority for triggers (parameter identifier: MQIA_TRIGGER_MSG_PRIORITY). Specifies the minimum priority that a message must have before it can cause, or be counted for, a trigger event. The value must be in the range of priority values that are supported (0 through 9).",0,ibm_mq,trigger message priority,
-ibm_mq.queue.depth_current,gauge,,message,,"The number of messages currently in the queue (parameter identifier: MQIA_CURRENT_Q_DEPTH).",0,ibm_mq,messages,
-ibm_mq.queue.depth_max_event,gauge,,event,,"Controls whether Queue Full events are generated (parameter identifier: MQIA_Q_DEPTH_MAX_EVENT).",0,ibm_mq,messages,
-ibm_mq.queue.open_input_count,gauge,,connection,,"Number of MQOPEN calls that have the queue open for input (parameter identifier: MQIA_OPEN_INPUT_COUNT).",0,ibm_mq,open handles,
-ibm_mq.queue.persistence,gauge,,resource,,"Specifies the default for message-persistence on the queue. Message persistence determines whether or not messages are preserved across restarts of the queue manager (parameter identifier: MQIA_DEF_PERSISTENCE).",0,ibm_mq,persistence,
-ibm_mq.queue.trigger_depth,gauge,,resource,,"This attribute specifies the number of messages that will initiate a trigger message to the initiation queue (parameter identifier: MQIA_TRIGGER_DEPTH). ",0,ibm_mq,queue trigger depth,
-ibm_mq.queue.max_message_length,gauge,,resource,,"This attribute specifies the maximum message length that can be transmitted on the channel (parameter identifier: MQIACH_MAX_MSG_LENGTH). ",0,ibm_mq,max message length,
-ibm_mq.queue.depth_high_limit,gauge,,resource,,"This attribute specifies the threshold against which the queue depth is compared before generated a queue high event (parameter identifier: MQIA_Q_DEPTH_HIGH_LIMIT).",0,ibm_mq,depth high limit,
-ibm_mq.queue.priority,gauge,,resource,,"Specifies the default priority of messages put on the queue (parameter identifier: MQIA_DEF_PRIORITY).",0,ibm_mq,default priority,
-ibm_mq.queue.input_open_option,gauge,,resource,,"Specifies the default share option for applications opening this queue for input (parameter identifier: MQIA_DEF_INPUT_OPEN_OPTION).",0,ibm_mq,default open option,
-ibm_mq.queue.message_delivery_sequence,gauge,,resource,,"The order in which messages will be returned after a get operation (parameter identifier: MQIA_MSG_DELIVERY_SEQUENCE).",0,ibm_mq,message delivery sequence,
-ibm_mq.queue.retention_interval,gauge,,hour,,"The number of hours for which the queue may be needed, based on the date and time when the queue was created (parameter identifier: MQIA_RETENTION_INTERVAL).",0,ibm_mq,retention interval,
-ibm_mq.queue.open_output_count,gauge,,connection,,"Number of MQOPEN calls that have the queue open for output (parameter identifier: MQIA_OPEN_OUTPUT_COUNT).",0,ibm_mq,open output count,
-ibm_mq.queue.trigger_type,gauge,,resource,,"The conditions under which trigger messages are written as a result of messages arriving on this queue (parameter identifier: MQIA_TRIGGER_TYPE).",0,ibm_mq,trigger type,
+ibm_mq.queue.inhibit_get,gauge,,occurrence,,Whether get operations are allowed (parameter identifier: `MQIA_INHIBIT_GET`).,0,ibm_mq,gets inhibited,
+ibm_mq.queue.harden_get_backout,gauge,,request,,Whether to harden backout count. Specifies whether the count of backed out messages should be saved (hardened) across restarts of the message queue manager (parameter identifier: `MQIA_HARDEN_GET_BACKOUT`).,0,ibm_mq,times messages retrieved,
+ibm_mq.queue.service_interval_event,gauge,,occurrence,,Controls whether Service Interval High or Service Interval OK events are generated (parameter identifier: `MQIA_Q_SERVICE_INTERVAL_EVENT`).,0,ibm_mq,service needed,
+ibm_mq.queue.trigger_control,gauge,,method,,This attribute specifies whether trigger messages are written to the initiation queue (parameter identifier: `MQIA_TRIGGER_CONTROL`).,0,ibm_mq,trigger control,
+ibm_mq.queue.usage,gauge,,resource,,This attribute whether the queue is for normal usage or for transmitting messages to a remote message queue manager (parameter identifier: `MQIA_USAGE`).,0,ibm_mq,usage,
+ibm_mq.queue.scope,gauge,,resource,,"Scope of the queue definition (parameter identifier: `MQIA_SCOPE`). On OS/400, this is valid for receipt by MQSeries for AS/400 V4R2, or later. Specifies whether the scope of the queue definition does not extend beyond the queue manager which owns the queue, or whether the queue name is contained in a cell directory, so that it is known to all of the queue managers within the cell.",0,ibm_mq,scope,
+ibm_mq.queue.type,gauge,,resource,,"Type of queue to which the alias resolves (parameter identifier: `MQIA_Q_TYPE`).",0,ibm_mq,queue type,
+ibm_mq.queue.depth_max,gauge,,message,,"Maximum queue depth (parameter identifier: `MQIA_MAX_Q_DEPTH`). The maximum number of messages allowed on the queue. Note that other factors may cause the queue to be treated as full; for example, it will appear to be full if there is no storage available for a message.",0,ibm_mq,queue max depth,
+ibm_mq.queue.backout_threshold,gauge,,resource,,"Backout threshold (parameter identifier: `MQIA_BACKOUT_THRESHOLD`). That is, the number of times a message can be backed out before it is transferred to the backout queue specified by BackoutRequeueName.",0,ibm_mq,backout threshold,
+ibm_mq.queue.depth_high_event,gauge,,event,,"High limit for queue depth (parameter identifier: `MQIA_Q_DEPTH_HIGH_LIMIT`). This event indicates that an application has put a message to a queue, and this has caused the number of messages on the queue to become greater than or equal to the queue depth high threshold.",0,ibm_mq,depth high event,
+ibm_mq.queue.depth_low_event,gauge,,event,,"Low limit for queue depth (parameter identifier: `MQIA_Q_DEPTH_LOW_LIMIT`). This event indicates that an application has retrieved a message from a queue, and this has caused the number of messages on the queue to become less than or equal to the queue depth low threshold.",0,ibm_mq,depth low event,
+ibm_mq.queue.trigger_message_priority,gauge,,resource,,"Threshold message priority for triggers (parameter identifier: `MQIA_TRIGGER_MSG_PRIORITY`). Specifies the minimum priority that a message must have before it can cause, or be counted for, a trigger event. The value must be in the range of priority values that are supported (0 through 9).",0,ibm_mq,trigger message priority,
+ibm_mq.queue.depth_current,gauge,,message,,"The number of messages currently in the queue (parameter identifier: `MQIA_CURRENT_Q_DEPTH`).",0,ibm_mq,messages,
+ibm_mq.queue.depth_max_event,gauge,,event,,"Controls whether Queue Full events are generated (parameter identifier: `MQIA_Q_DEPTH_MAX_EVENT`).",0,ibm_mq,messages,
+ibm_mq.queue.open_input_count,gauge,,connection,,"Number of MQOPEN calls that have the queue open for input (parameter identifier: `MQIA_OPEN_INPUT_COUNT`).",0,ibm_mq,open handles,
+ibm_mq.queue.persistence,gauge,,resource,,"Specifies the default for message-persistence on the queue. Message persistence determines whether or not messages are preserved across restarts of the queue manager (parameter identifier: `MQIA_DEF_PERSISTENCE`).",0,ibm_mq,persistence,
+ibm_mq.queue.trigger_depth,gauge,,resource,,"This attribute specifies the number of messages that will initiate a trigger message to the initiation queue (parameter identifier: `MQIA_TRIGGER_DEPTH`). ",0,ibm_mq,queue trigger depth,
+ibm_mq.queue.max_message_length,gauge,,resource,,"This attribute specifies the maximum message length that can be transmitted on the channel (parameter identifier: `MQIACH_MAX_MSG_LENGTH`). ",0,ibm_mq,max message length,
+ibm_mq.queue.depth_high_limit,gauge,,resource,,"This attribute specifies the threshold against which the queue depth is compared before generated a queue high event (parameter identifier: `MQIA_Q_DEPTH_HIGH_LIMIT`).",0,ibm_mq,depth high limit,
+ibm_mq.queue.priority,gauge,,resource,,"Specifies the default priority of messages put on the queue (parameter identifier: `MQIA_DEF_PRIORITY`).",0,ibm_mq,default priority,
+ibm_mq.queue.input_open_option,gauge,,resource,,"Specifies the default share option for applications opening this queue for input (parameter identifier: `MQIA_DEF_INPUT_OPEN_OPTION`).",0,ibm_mq,default open option,
+ibm_mq.queue.message_delivery_sequence,gauge,,resource,,"The order in which messages will be returned after a get operation (parameter identifier: `MQIA_MSG_DELIVERY_SEQUENCE`).",0,ibm_mq,message delivery sequence,
+ibm_mq.queue.retention_interval,gauge,,hour,,"The number of hours for which the queue may be needed, based on the date and time when the queue was created (parameter identifier: `MQIA_RETENTION_INTERVAL`).",0,ibm_mq,retention interval,
+ibm_mq.queue.open_output_count,gauge,,connection,,"Number of MQOPEN calls that have the queue open for output (parameter identifier: `MQIA_OPEN_OUTPUT_COUNT`).",0,ibm_mq,open output count,
+ibm_mq.queue.trigger_type,gauge,,resource,,"The conditions under which trigger messages are written as a result of messages arriving on this queue (parameter identifier: `MQIA_TRIGGER_TYPE`).",0,ibm_mq,trigger type,
 ibm_mq.queue.depth_percent,gauge,,percent,,The percent of the queue that is currently utilized.,0,ibm_mq,queue usage percentage,
 ibm_mq.queue.last_get_time,gauge,,second,,The elapsed time in seconds since the last message get from a queue.,0,ibm_mq,last get time,
 ibm_mq.queue.last_put_time,gauge,,second,,The elapsed time in seconds since the last message put to a queue.,0,ibm_mq,last put time,
-ibm_mq.queue_manager.dist_lists,gauge,,resource,,"Specifies whether distribution-list messages can be placed on the queue (parameter identifier: MQIA_DIST_LISTS).",0,ibm_mq,dist list,
-ibm_mq.queue_manager.max_msg_list,gauge,,byte,,"Specifies the maximum message length that can be transmitted on the channel. This is compared with the value for the remote channel and the actual maximum is the lowest of the two values (parameter identifier: MQIACH_MAX_MSG_LENGTH).",0,ibm_mq,max message length,
-ibm_mq.queue.max_channels,gauge,,connection,,"This attribute is the maximum number of channels that can be current (parameter identifier: MQIA_MAX_CHANNELS).",0,ibm_mq,max channels,
-ibm_mq.queue.oldest_message_age,gauge,,second,,"The age, in seconds, of the oldest message on the queue (parameter identifier: MSGAGE).",0,ibm_mq,oldest message,
-ibm_mq.queue.uncommitted_msgs,gauge,,message,,"Specifies the maximum number of uncommitted messages. That is, the number of messages that can be retrieved, the number of messages that can be put, and any trigger messages generated within this unit of work (parameter identifier: MQIA_MAX_UNCOMMITTED_MSGS).",0,ibm_mq,uncommitted msgs,
-ibm_mq.stats.channel.msgs,count,,message,,"The number of persistent and nonpersistent messages sent or received (parameter identifier: QCSTNMSG).",0,ibm_mq,stats chan msgs,
-ibm_mq.stats.channel.bytes,count,,message,,"The number of bytes sent or received for persistent and nonpersistent messages. (parameter identifier: QCSTNBYT).",0,ibm_mq,stats chan msgs,
-ibm_mq.stats.channel.put_retries,count,,message,,"The number of times in the time interval that a message failed to be put, and entered a retry loop (parameter identifier: MQIAMO_PUT_RETRIES).",0,ibm_mq,stats chan put retries,
-ibm_mq.stats.channel.full_batches,count,,message,,"The number of batches processed by the channel that were sent because the value of the channel attributes BATCHSZ or BATCHLIM was reached (parameter identifier: MQIAMO_FULL_BATCHES).",0,ibm_mq,stats chan full batches,
-ibm_mq.stats.channel.incomplete_batches,count,,message,,"The number of batches processed by the channel, that were sent without the value of the channel attribute BATCHSZ being reached (parameter identifier: MQIAMO_INCOMPLETE_BATCHES).",0,ibm_mq,stats chan incomplete batches,
-ibm_mq.stats.channel.avg_batch_size,gauge,,message,,"The average batch size of batches processed by the channel (parameter identifier: MQIAMO_AVG_BATCH_SIZE).",0,ibm_mq,stats chan avg batch size,
-ibm_mq.stats.queue.q_min_depth,gauge,,message,,"The minimum queue depth during the monitoring period (parameter identifier: MQIAMO_Q_MIN_DEPTH).",0,ibm_mq,stats queue q min depth,
-ibm_mq.stats.queue.q_max_depth,gauge,,message,,The maximum queue depth during the monitoring period (parameter identifier: MQIAMO_Q_MAX_DEPTH).,0,ibm_mq,stats queue q max depth,
-ibm_mq.stats.queue.put_fail_count,count,,message,,The number of unsuccessful attempts to put a message to the queue (parameter identifier: MQIAMO_PUTS_FAILED).,0,ibm_mq,stats queue put fail count,
-ibm_mq.stats.queue.get_fail_count,count,,message,,The number of unsuccessful destructive get requests (parameter identifier: MQIAMO_GETS_FAILED).,0,ibm_mq,stats queue get fail count,
-ibm_mq.stats.queue.put1_fail_count,count,,message,,The number of unsuccessful attempts to put a message using MQPUT1 calls (parameter identifier: MQIAMO_PUT1S_FAILED).,0,ibm_mq,stats queue put1 fail count,
-ibm_mq.stats.queue.browse_fail_count,count,,message,,The number of unsuccessful non-destructive get requests (parameter identifier: MQIAMO_BROWSES_FAILED).,0,ibm_mq,stats queue browse fail count,
+ibm_mq.queue_manager.dist_lists,gauge,,resource,,"Specifies whether distribution-list messages can be placed on the queue (parameter identifier: `MQIA_DIST_LISTS`).",0,ibm_mq,dist list,
+ibm_mq.queue_manager.max_msg_list,gauge,,byte,,"Specifies the maximum message length that can be transmitted on the channel. This is compared with the value for the remote channel and the actual maximum is the lowest of the two values (parameter identifier: `MQIACH_MAX_MSG_LENGTH`).",0,ibm_mq,max message length,
+ibm_mq.queue.max_channels,gauge,,connection,,"This attribute is the maximum number of channels that can be current (parameter identifier: `MQIA_MAX_CHANNELS`).",0,ibm_mq,max channels,
+ibm_mq.queue.oldest_message_age,gauge,,second,,"The age, in seconds, of the oldest message on the queue (parameter identifier: `MSGAGE`).",0,ibm_mq,oldest message,
+ibm_mq.queue.uncommitted_msgs,gauge,,message,,"Specifies the maximum number of uncommitted messages. That is, the number of messages that can be retrieved, the number of messages that can be put, and any trigger messages generated within this unit of work (parameter identifier: `MQIA_MAX_UNCOMMITTED_MSGS`).",0,ibm_mq,uncommitted msgs,
+ibm_mq.stats.channel.msgs,count,,message,,"The number of persistent and nonpersistent messages sent or received (parameter identifier: `QCSTNMSG`).",0,ibm_mq,stats chan msgs,
+ibm_mq.stats.channel.bytes,count,,message,,"The number of bytes sent or received for persistent and nonpersistent messages. (parameter identifier: `QCSTNBYT`).",0,ibm_mq,stats chan msgs,
+ibm_mq.stats.channel.put_retries,count,,message,,"The number of times in the time interval that a message failed to be put, and entered a retry loop (parameter identifier: `MQIAMO_PUT_RETRIES`).",0,ibm_mq,stats chan put retries,
+ibm_mq.stats.channel.full_batches,count,,message,,"The number of batches processed by the channel that were sent because the value of the channel attributes BATCHSZ or BATCHLIM was reached (parameter identifier: `MQIAMO_FULL_BATCHES`).",0,ibm_mq,stats chan full batches,
+ibm_mq.stats.channel.incomplete_batches,count,,message,,"The number of batches processed by the channel, that were sent without the value of the channel attribute BATCHSZ being reached (parameter identifier: `MQIAMO_INCOMPLETE_BATCHES`).",0,ibm_mq,stats chan incomplete batches,
+ibm_mq.stats.channel.avg_batch_size,gauge,,message,,"The average batch size of batches processed by the channel (parameter identifier: `MQIAMO_AVG_BATCH_SIZE`).",0,ibm_mq,stats chan avg batch size,
+ibm_mq.stats.queue.q_min_depth,gauge,,message,,"The minimum queue depth during the monitoring period (parameter identifier: `MQIAMO_Q_MIN_DEPTH`).",0,ibm_mq,stats queue q min depth,
+ibm_mq.stats.queue.q_max_depth,gauge,,message,,The maximum queue depth during the monitoring period (parameter identifier: `MQIAMO_Q_MAX_DEPTH`).,0,ibm_mq,stats queue q max depth,
+ibm_mq.stats.queue.put_fail_count,count,,message,,The number of unsuccessful attempts to put a message to the queue (parameter identifier: `MQIAMO_PUTS_FAILED`).,0,ibm_mq,stats queue put fail count,
+ibm_mq.stats.queue.get_fail_count,count,,message,,The number of unsuccessful destructive get requests (parameter identifier: `MQIAMO_GETS_FAILED`).,0,ibm_mq,stats queue get fail count,
+ibm_mq.stats.queue.put1_fail_count,count,,message,,The number of unsuccessful attempts to put a message using MQPUT1 calls (parameter identifier: `MQIAMO_PUT1S_FAILED`).,0,ibm_mq,stats queue put1 fail count,
+ibm_mq.stats.queue.browse_fail_count,count,,message,,The number of unsuccessful non-destructive get requests (parameter identifier: `MQIAMO_BROWSES_FAILED`).,0,ibm_mq,stats queue browse fail count,
 ibm_mq.stats.queue.non_queued_msg_count,count,,message,,"The number of messages that bypassed the queue and were transferred directly to a waiting application. This number represents how many times WebSphere MQ was able to bypass the queue, and not the number of times an application was waiting (parameter identifier: MQIAMO_MSGS_NOT_QUEUED).",0,ibm_mq,stats queue non queued msg count,
-ibm_mq.stats.queue.expired_msg_count,count,,message,,The number of persistent and non-persistent messages that were discarded because they had expired before they could be retrieved (parameter identifier: MQIAMO_MSGS_EXPIRED).,0,ibm_mq,stats queue expired msg count,
-ibm_mq.stats.queue.purge_count,count,,message,,The number of messages purged (parameter identifier: MQIAMO_MSGS_PURGED).,0,ibm_mq,stats queue purge count,
-ibm_mq.stats.queue.avg_q_time,gauge,,message,,"The average latency, in microseconds, of messages destructively retrieved from the queue during the monitoring period for persistent and non-persistent messages (parameter identifier: MQIAMO64_AVG_Q_TIME).",0,ibm_mq,stats queue avg q time,
-ibm_mq.stats.queue.browse_bytes,gauge,,message,,The number of bytes read in non-destructive get requests for persistent and non-persistent messages (parameter identifier: MQIAMO64_BROWSE_BYTES).,0,ibm_mq,stats queue browse bytes,
-ibm_mq.stats.queue.browse_count,count,,message,,The number of successful non-destructive get requests for persistent and non-persistent messages (parameter identifier: MQIAMO_BROWSES).,0,ibm_mq,stats queue browse count,
-ibm_mq.stats.queue.get_bytes,count,,message,,The number of bytes read in destructive put requests for persistent and non-persistent messages (parameter identifier: MQIAMO64_GET_BYTES).,0,ibm_mq,stats queue get bytes,
-ibm_mq.stats.queue.get_count,count,,message,,The number of successful destructive get requests for persistent and non-persistent messages (parameter identifier: MQIAMO_GETS).,0,ibm_mq,stats queue get count,
-ibm_mq.stats.queue.put_bytes,count,,message,,The number of bytes written in put requests to the queue for persistent and non-persistent messages (parameter identifier: MQIAMO64_PUT_BYTES).,0,ibm_mq,stats queue put bytes,
-ibm_mq.stats.queue.put_count,count,,message,,"The number of persistent and non-persistent messages successfully put to the queue, with exception of MQPUT1 requests (parameter identifier: MQIAMO_PUTS).",0,ibm_mq,stats queue put count,
-ibm_mq.stats.queue.put1_count,count,,message,,The number of persistent and non-persistent messages successfully put to the queue using MQPUT1 calls (parameter identifier: MQIAMO_PUT1S).,0,ibm_mq,stats queue put1 count,
+ibm_mq.stats.queue.expired_msg_count,count,,message,,The number of persistent and non-persistent messages that were discarded because they had expired before they could be retrieved (parameter identifier: `MQIAMO_MSGS_EXPIRED`).,0,ibm_mq,stats queue expired msg count,
+ibm_mq.stats.queue.purge_count,count,,message,,The number of messages purged (parameter identifier: `MQIAMO_MSGS_PURGED`).,0,ibm_mq,stats queue purge count,
+ibm_mq.stats.queue.avg_q_time,gauge,,message,,"The average latency, in microseconds, of messages destructively retrieved from the queue during the monitoring period for persistent and non-persistent messages (parameter identifier: `MQIAMO64_AVG_Q_TIME`).",0,ibm_mq,stats queue avg q time,
+ibm_mq.stats.queue.browse_bytes,gauge,,message,,The number of bytes read in non-destructive get requests for persistent and non-persistent messages (parameter identifier: `MQIAMO64_BROWSE_BYTES`).,0,ibm_mq,stats queue browse bytes,
+ibm_mq.stats.queue.browse_count,count,,message,,The number of successful non-destructive get requests for persistent and non-persistent messages (parameter identifier: `MQIAMO_BROWSES`).,0,ibm_mq,stats queue browse count,
+ibm_mq.stats.queue.get_bytes,count,,message,,The number of bytes read in destructive put requests for persistent and non-persistent messages (parameter identifier: `MQIAMO64_GET_BYTES`).,0,ibm_mq,stats queue get bytes,
+ibm_mq.stats.queue.get_count,count,,message,,The number of successful destructive get requests for persistent and non-persistent messages (parameter identifier: `MQIAMO_GETS`).,0,ibm_mq,stats queue get count,
+ibm_mq.stats.queue.put_bytes,count,,message,,The number of bytes written in put requests to the queue for persistent and non-persistent messages (parameter identifier: `MQIAMO64_PUT_BYTES`).,0,ibm_mq,stats queue put bytes,
+ibm_mq.stats.queue.put_count,count,,message,,"The number of persistent and non-persistent messages successfully put to the queue, with exception of MQPUT1 requests (parameter identifier: `MQIAMO_PUTS`).",0,ibm_mq,stats queue put count,
+ibm_mq.stats.queue.put1_count,count,,message,,The number of persistent and non-persistent messages successfully put to the queue using MQPUT1 calls (parameter identifier: `MQIAMO_PUT1S`).,0,ibm_mq,stats queue put1 count,
diff --git a/ibm_was/changelog.d/16080.fixed b/ibm_was/changelog.d/16080.fixed
new file mode 100644
index 0000000000000..de77fe27da120
--- /dev/null
+++ b/ibm_was/changelog.d/16080.fixed
@@ -0,0 +1 @@
+Fix `aarch64` compatibility of the `sqlserver` check by downgrading `lxml` to version 4.9.2 ([16080](https://github.com/DataDog/integrations-core/pull/16080))
\ No newline at end of file
diff --git a/ibm_was/pyproject.toml b/ibm_was/pyproject.toml
index cc237ed8568ec..86eea4a0d7d9a 100644
--- a/ibm_was/pyproject.toml
+++ b/ibm_was/pyproject.toml
@@ -39,7 +39,7 @@ license = "BSD-3-Clause"
 
 [project.optional-dependencies]
 deps = [
-    "lxml==4.9.3",
+    "lxml==4.9.2",
 ]
 
 [project.urls]
diff --git a/kubernetes_state_core/README.md b/kubernetes_state_core/README.md
index 885a3ae7ba0f6..996c1d69dc09c 100644
--- a/kubernetes_state_core/README.md
+++ b/kubernetes_state_core/README.md
@@ -43,21 +43,20 @@ datadog:
 To enable the `kubernetes_state_core` check, the setting `spec.features.kubeStateMetricsCore.enabled` must be set to `true` in the DatadogAgent resource:
 
 ```yaml
-apiVersion: datadoghq.com/v1alpha1
 kind: DatadogAgent
+apiVersion: datadoghq.com/v2alpha1
 metadata:
   name: datadog
 spec:
-  credentials:
-    apiKey: <DATADOG_API_KEY>
-    appKey: <DATADOG_APP_KEY>
+  global:
+    credentials:
+      apiKey: <DATADOG_API_KEY>
   features:
     kubeStateMetricsCore:
       enabled: true
-  # (...)
 ```
 
-Note: Datadog Operator v0.7.0 or greater is required.
+**Note**: Datadog Operator v0.7.0 or greater is required.
 
 <!-- xxz tab xxx -->
 <!-- xxz tabs xxx -->
@@ -79,6 +78,7 @@ Here is the mapping between deprecated tags and the official tags that have repl
 | cronjob               | kube_cronjob                |
 | daemonset             | kube_daemon_set             |
 | deployment            | kube_deployment             |
+| hpa                   | horizontalpodautoscaler     |
 | image                 | image_name                  |
 | job                   | kube_job                    |
 | job_name              | kube_job                    |
@@ -94,7 +94,7 @@ Here is the mapping between deprecated tags and the official tags that have repl
 The Kubernetes State Metrics Core check is not backward compatible, be sure to read the changes carefully before migrating from the legacy `kubernetes_state` check.
 
 `kubernetes_state.node.by_condition`
-: A new metric with node name granularity. It replaces `kubernetes_state.nodes.by_condition`.
+: A new metric with node name granularity. The legacy metric `kubernetes_state.nodes.by_condition` is deprecated in favor of this one. **Note:** This metric is backported into the legacy check, where both metrics (it and the legacy metric it replaces) are available.
 
 `kubernetes_state.persistentvolume.by_phase`
 : A new metric with persistentvolume name granularity. It replaces `kubernetes_state.persistentvolumes.by_phase`.
@@ -111,6 +111,48 @@ The Kubernetes State Metrics Core check is not backward compatible, be sure to r
 `kube_job`
 : In `kubernetes_state`, the `kube_job` tag value is the `CronJob` name if the `Job` had `CronJob` as an owner, otherwise it is the `Job` name. In `kubernetes_state_core`, the `kube_job` tag value is always the `Job` name, and a new `kube_cronjob` tag key is added with the `CronJob` name as the tag value. When migrating to `kubernetes_state_core`, it's recommended to use the new tag or `kube_job:foo*`, where `foo` is the `CronJob` name, for query filters.
 
+`kubernetes_state.job.succeeded`
+: In `kubernetes_state`, the `kuberenetes.job.succeeded` was `count` type. In `kubernetes_state_core` it is `gauge` type.
+
+### Node-level tag assignment
+
+Host or node-level tags no longer appear on cluster-centric metrics. Only metrics relative to an actual node in the cluster, like `kubernetes_state.node.by_condition` or `kubernetes_state.container.restarts`, continue to inherit their respective host or node level tags. 
+
+To add tags globally, use the `DD_TAGS` environment variable, or use the respective Helm or Operator configurations. Instance-only level tags can be specified by mounting a custom `kubernetes_state_core.yaml` into the Cluster Agent.
+
+<!-- xxx tabs xxx -->
+<!-- xxx tab "Helm" xxx -->
+```yaml
+datadog:
+  kubeStateMetricsCore:
+    enabled: true
+  tags: 
+    - "<TAG_KEY>:<TAG_VALUE>"
+```
+<!-- xxz tab xxx -->
+<!-- xxx tab "Operator" xxx -->
+```yaml
+kind: DatadogAgent
+apiVersion: datadoghq.com/v2alpha1
+metadata:
+  name: datadog
+spec:
+  global:
+    credentials:
+      apiKey: <DATADOG_API_KEY>
+    tags:
+      - "<TAG_KEY>:<TAG_VALUE>"
+  features:
+    kubeStateMetricsCore:
+      enabled: true
+```
+<!-- xxz tab xxx -->
+<!-- xxz tabs xxx -->
+
+Metrics like `kubernetes_state.container.memory_limit.total` or `kubernetes_state.node.count` are aggregate counts of groups within a cluster, and host or node-level tags are not added.
+
+### Legacy check
+
 <!-- xxx tabs xxx -->
 <!-- xxx tab "Helm" xxx -->
 
@@ -147,7 +189,29 @@ The Kubernetes State Metrics Core check does not include any events.
 
 ### Service Checks
 
-See [../kubernetes/assets/service_checks.json][7] for a list of service checks provided by this integration.
+`kubernetes_state.cronjob.complete`
+: Whether the last job of the cronjob is failed or not. Tags:`kube_cronjob` `kube_namespace` (`env` `service` `version` from standard labels).
+
+`kubernetes_state.cronjob.on_schedule_check`
+: Alert if the cronjob's next schedule is in the past. Tags:`kube_cronjob` `kube_namespace` (`env` `service` `version` from standard labels).
+
+`kubernetes_state.job.complete`
+: Whether the job is failed or not. Tags:`kube_job` or `kube_cronjob` `kube_namespace` (`env` `service` `version` from standard labels).
+
+`kubernetes_state.node.ready`
+: Whether the node is ready. Tags:`node` `condition` `status`.
+
+`kubernetes_state.node.out_of_disk`
+: Whether the node is out of disk. Tags:`node` `condition` `status`.
+
+`kubernetes_state.node.disk_pressure`
+: Whether the node is under disk pressure. Tags:`node` `condition` `status`.
+
+`kubernetes_state.node.network_unavailable`
+: Whether the node network is unavailable. Tags:`node` `condition` `status`.
+
+`kubernetes_state.node.memory_pressure`
+: Whether the node network is under memory pressure. Tags:`node` `condition` `status`.
 
 ### Validation
 
@@ -155,19 +219,65 @@ See [../kubernetes/assets/service_checks.json][7] for a list of service checks p
 
 ## Troubleshooting
 
-Need help? Contact [Datadog support][9].
+### Timeout errors
 
-## Further Reading
+By default, the Kubernetes State Metrics Core check waits 10 seconds for a response from the Kubernetes API server. For large clusters, the request may time out, resulting in missing metrics.
+
+You can avoid this by setting the environment variable `DD_KUBERNETES_APISERVER_CLIENT_TIMEOUT` to a higher value than the default 10 seconds.
+
+<!-- xxx tabs xxx -->
+<!-- xxx tab "Operator" xxx -->
+Update your `datadog-agent.yaml` with the following configuration:
+
+```yaml
+apiVersion: datadoghq.com/v2alpha1
+kind: DatadogAgent
+metadata:
+  name: datadog
+spec:
+  override:
+    clusterAgent:
+      env:
+        - name: DD_KUBERNETES_APISERVER_CLIENT_TIMEOUT
+          value: <value_greater_than_10>
+```
 
-{{< partial name="whats-next/whats-next.html" >}}
+Then apply the new configuration:
 
+```shell
+kubectl apply -n $DD_NAMESPACE -f datadog-agent.yaml
+```
+<!-- xxz tab xxx -->
+<!-- xxx tab "Helm" xxx -->
+Update your `datadog-values.yaml` with the following configuration:
+
+```yaml
+clusterAgent:
+  env:
+    - name: DD_KUBERNETES_APISERVER_CLIENT_TIMEOUT
+      value: <value_greater_than_10>
+```
+
+Then upgrade your Helm chart:
+
+```shell
+helm upgrade -f datadog-values.yaml <RELEASE_NAME> datadog/datadog
+```
+<!-- xxz tab xxx -->
+<!-- xxz tabs xxx -->
+
+Need help? Contact [Datadog support][9].
+
+## Further Reading
+- [Our Journey Taking Kubernetes State Metrics to the Next Level][10]
 
 [1]: https://kubernetes.io/blog/2021/04/13/kube-state-metrics-v-2-0/
-[2]: /integrations/kubernetes_state_core/#migration-from-kubernetes_state-to-kubernetes_state_core
-[3]: /integrations/kubernetes_state_core/#data-collected
+[2]: #migration-from-kubernetes_state-to-kubernetes_state_core
+[3]: #data-collected
 [4]: /agent/cluster_agent/
 [5]: https://github.com/DataDog/integrations-core/blob/master/kubernetes_state_core/metadata.csv
-[6]: /getting_started/tagging/unified_service_tagging/?tab=kubernetes#configuration-1
+[6]: /getting_started/tagging/unified_service_tagging/#configuration
 [7]: https://github.com/DataDog/integrations-core/blob/master/kubernetes/assets/service_checks.json
-[8]: /agent/guide/agent-commands/?tab=clusteragent#agent-status-and-information
-[9]: https://docs.datadoghq.com/help/
+[8]: /agent/guide/agent-commands/#agent-status-and-information
+[9]: /help/
+[10]: https://www.datadoghq.com/blog/engineering/our-journey-taking-kubernetes-state-metrics-to-the-next-level/
diff --git a/nvidia_triton/CHANGELOG.md b/nvidia_triton/CHANGELOG.md
index d6505a69af9d3..82b4e99793857 100644
--- a/nvidia_triton/CHANGELOG.md
+++ b/nvidia_triton/CHANGELOG.md
@@ -1,7 +1,3 @@
 # CHANGELOG - Nvidia Triton
 
-## 1.0.0 / 2023-10-11
-
-***Added***:
-
-* Initial Release ([#15991](https://github.com/DataDog/integrations-core/pull/15991))
+<!-- towncrier release notes start -->
diff --git a/nvidia_triton/changelog.d/15918.added b/nvidia_triton/changelog.d/15918.added
new file mode 100644
index 0000000000000..1f4cd1630e729
--- /dev/null
+++ b/nvidia_triton/changelog.d/15918.added
@@ -0,0 +1 @@
+Add Nvidia Triton integration.
\ No newline at end of file
diff --git a/nvidia_triton/datadog_checks/nvidia_triton/__about__.py b/nvidia_triton/datadog_checks/nvidia_triton/__about__.py
index dd3aa4ad028a4..21965178e0b7c 100644
--- a/nvidia_triton/datadog_checks/nvidia_triton/__about__.py
+++ b/nvidia_triton/datadog_checks/nvidia_triton/__about__.py
@@ -1,4 +1,4 @@
 # (C) Datadog, Inc. 2023-present
 # All rights reserved
 # Licensed under a 3-clause BSD style license (see LICENSE)
-__version__ = '1.0.0'
+__version__ = '0.0.1'
diff --git a/openstack_controller/CHANGELOG.md b/openstack_controller/CHANGELOG.md
index 8e0380dd62d91..678ad2053edaa 100644
--- a/openstack_controller/CHANGELOG.md
+++ b/openstack_controller/CHANGELOG.md
@@ -2,6 +2,12 @@
 
 <!-- towncrier release notes start -->
 
+## 6.0.0 / 2023-11-07
+
+***Changed***:
+
+* Refactor integration and add support for Ironic and Octavia components. ([#15918](https://github.com/DataDog/integrations-core/pull/15918))
+
 ## 5.0.0 / 2023-09-29 / Agent 7.49.0
 
 ***Changed***:
diff --git a/openstack_controller/README.md b/openstack_controller/README.md
index 8e430d06913a7..b6c079ba2bf3e 100644
--- a/openstack_controller/README.md
+++ b/openstack_controller/README.md
@@ -14,7 +14,7 @@ The OpenStack Controller check is included in the [Datadog Agent][3] package, so
 
 ### Configuration
 
-The OpenStack Controller integration is designed to collect information from all compute nodes and the servers running it. The integration should be run from a single Agent to monitor your OpenStack environment, and can be deployed on your controller node or an adjacent server that has access to the Keystone and Nova endpoints.
+The OpenStack Controller integration is designed to collect information from all compute nodes and the servers running it. The integration should be run from a single Agent to monitor your OpenStack environment, and can be deployed on your controller node or an adjacent server that has access to the Keystone, Nova, Neutron, Cinder, Ironic, and Octavia endpoints.
 
 #### Prepare OpenStack
 
@@ -28,28 +28,16 @@ Create a `datadog` user that is used in your `openstack_controller.d/conf.yaml`
    init_config:
 
    instances:
-     ## @param name - string - required
-     ## Unique identifier for this instance.
-     #
-     - name: "<INSTANCE_NAME>"
-
-       ## @param user - object - required
-       ## Password authentication is the only auth method supported
-       ## User expects username, password, and user domain id
-       ## `user` should resolve to a structure like
-       ## {'password': '<PASSWORD>', 'name': '<USER_NAME>', 'domain': {'id': '<DOMAIN_ID>'}}
-       ## The check uses the Unscoped token method to collect information about
-       ## all available projects to the user.
-       #
-       user:
-         password: "<PASSWORD>"
-         name: "<USER_NAME>"
-         domain:
-           id: "<DOMAIN_ID>"
+     - keystone_server_url: "<AUTH_URL>"
+       password: "<PASSWORD>"
+       username: "<USER_NAME>"
+       domain_id: "<DOMAIN_ID>"
    ```
 
 2. [Restart the Agent][5]
 
+**Note**: If you are upgrading the integration to v6.0.0 or later from v5.0.0 or older, you need to enable the `use_legacy_check_version` flag to use newer features. You may also need to make changes to your configuration to maintain compatibility. See the [sample openstack controller.d/conf.yaml][4] for details.  
+
 ##### Log collection
 
 1. Collecting logs is disabled by default in the Datadog Agent, you can enable it in `datadog.yaml`:
diff --git a/openstack_controller/assets/configuration/spec.yaml b/openstack_controller/assets/configuration/spec.yaml
index e4f32926cffc1..3d43a3ba4575c 100644
--- a/openstack_controller/assets/configuration/spec.yaml
+++ b/openstack_controller/assets/configuration/spec.yaml
@@ -14,14 +14,43 @@ files:
             service.hidden: true
     - template: instances
       options:
+        - name: use_legacy_check_version
+          display_priority: 1
+          description: |
+            For backward compatibility reasons, it is possible to use a deprecated version of the Openstack Controller
+            integration by setting this field to "true".
+          value:
+              type: boolean
+              example: false
         - name: name
+          hidden: true
           description: |
             Unique identifier for this instance.
           value:
             example: <INSTANCE_NAME>
             type: string
-          enabled: true
+        - name: username
+          description: |
+           The User name used to connect to Openstack.
+          value:
+            example: "admin"
+            type: string
+            display_default: null
+        - name: password
+          description: |
+           The Password used to connect to Openstack.
+          value:
+            example: <PASSWORD>
+            type: string
+        - name: domain_id
+          description: |
+           The domain ID used to connect to Openstack. If not specified, the check will
+           use the "default" Domain ID
+          value:
+            example: "default"
+            type: string
         - name: user
+          hidden: true
           description: |
            Password authentication is the only auth method supported
            User expects username, password, and user domain id
@@ -37,6 +66,7 @@ files:
             type: object
           enabled: true
         - name: whitelist_project_names
+          hidden: true
           description: |
            IDs of projects to whitelist for monitoring (by default the agent collects limit metrics from all projects)
            Regex expressions for the project names are supported.
@@ -50,6 +80,7 @@ files:
             items:
               type: string
         - name: blacklist_project_names
+          hidden: true
           description: |
            IDs of projects to blacklist for monitoring (by default the agent collects limit metrics from all projects)
            Regex expressions for the project names are supported.
@@ -63,6 +94,7 @@ files:
             items:
               type: string
         - name: exclude_server_ids
+          hidden: true
           description: |
            IDs of servers to exclude from monitoring. (by default the agent collects metrics from all guest servers)
            Regex expressions for the server IDs are supported.
@@ -75,6 +107,7 @@ files:
             items:
               type: string
         - name: exclude_network_ids
+          hidden: true
           description: |
            IDs of networks to exclude from monitoring (by default the agent collects metrics from networks returned by the
            neutron:get_networks operation)
@@ -124,7 +157,33 @@ files:
             example: https://<KEYSTONE_ENDPOINT>:<PORT>/
             type: string
             display_default: null
+        - name: ironic_microversion
+          description: |
+           The microversion of the Ironic (Bare Metal) API to call.
+           It is recommended to set this parameter to the latest Ironic microversion supported by your Openstack version.
+
+           View this page for more about Ironic microvoersion compatibility:
+              https://docs.openstack.org/ironic/latest/contributor/webapi-version-history.html
+          enabled: true
+          value:
+            example: "1.80"
+            type: string
+            display_default: null
+        - name: nova_microversion
+          description: |
+           The microversion of the Nova (Compute) API to call.
+           It is recommended to set this parameter to the latest Compute microversion supported by your Openstack version.
+           View this page for more about Compute microvoersion compatibility:
+              https://docs.openstack.org/nova/latest/reference/api-microversion-history.html
+           View this page for more information about microversions in Openstack:
+              https://docs.openstack.org/api-guide/compute/microversions.html
+          enabled: true
+          value:
+            example: "2.93"
+            type: string
+            display_default: null
         - name: collect_hypervisor_load
+          hidden: true
           description: |
            Collects hypervisor_load.1/5/15 for each hypervisor
            Disabled by default to increase performance of the check.
@@ -135,6 +194,7 @@ files:
             display_default: true
             type: boolean
         - name: collect_hypervisor_metrics
+          hidden: true
           description: |
            Collects hypervisor metrics (including hypervisor_load).
           value:
@@ -142,6 +202,7 @@ files:
             display_default: true
             type: boolean
         - name: collect_project_metrics
+          hidden: true
           description: |
            The admin user defined for Datadog starts with a "default" project.
            If this option is disabled, project limits metrics are only collected from projects the
@@ -151,6 +212,7 @@ files:
             display_default: true
             type: boolean
         - name: collect_network_metrics
+          hidden: true
           description: |
            Collects network metrics.
           value:
@@ -158,6 +220,7 @@ files:
             display_default: true
             type: boolean
         - name: collect_server_flavor_metrics
+          hidden: true
           description: |
            Collect server flavor metrics.
           value:
@@ -165,6 +228,7 @@ files:
             display_default: true
             type: boolean
         - name: collect_server_diagnostic_metrics
+          hidden: true
           description: |
            Collect server diagnostic metrics. Enabling this may result in performance decrease.
            This is fine for small deployments. For large deployment, turn it off and install the agent on VMs directly.
@@ -181,13 +245,433 @@ files:
             example: false
             display_default: false
             type: boolean
+        - name: endpoint_interface
+          description: |
+           Indicates the visibility scope of the component's endpoints to use. The possible values are:
+             public: This endpoint is accessible from outside the cloud and typically denotes a public-facing URL or 
+                 IP address.
+             internal: This endpoint is typically used for communication between services within the cloud 
+                 infrastructure itself.
+                 It may be an internal IP or hostname that's not accessible from outside the cloud.  
+             admin: This endpoint is specifically for administrative tasks and may have extended privileges or 
+                 functionality compared to the public and internal endpoints.
+                 It's meant for cloud operators or administrators.
+          value:
+            example: "internal"
+            display_default: "public"
+            type: string
+        - name: endpoint_region_id
+          description: |
+           The region_id that will be used to filter the endpoints to use for each component.
+          value:
+            type: string
+        - name: components
+          description: |
+            General configuration that we want to apply to each of the components and their different metric blocks.
+          value:
+            type: object
+            properties:
+              - name: identity
+                anyOf:
+                  - type: boolean
+                  - type: object
+                    properties:
+                      - name: regions
+                        type: boolean
+                      - name: domains
+                        type: boolean
+                      - name: projects
+                        type: boolean
+                      - name: users
+                        type: boolean
+                      - name: groups
+                        type: boolean
+                      - name: services
+                        type: boolean
+                      - name: limits
+                        type: boolean
+              - name: compute
+                anyOf:
+                  - type: boolean
+                  - type: object
+                    properties:
+                      - name: limits
+                        type: boolean
+                      - name: services
+                        type: boolean
+                      - name: flavors
+                        type: boolean
+                      - name: hypervisors
+                        anyOf:
+                          - type: boolean
+                          - type: object
+                            properties:
+                              - name: limit
+                                description: |
+                                  Maximum number of hypervisors to be processed.
+                                type: integer
+                              - name: include
+                                type: array
+                                items:
+                                  anyOf:
+                                    - type: string
+                                    - type: object
+                                      properties:
+                                        - name: name
+                                          type: string
+                                        - name: uptime
+                                          type: boolean
+                              - name: exclude
+                                type: array
+                                items:
+                                  type: string
+                              - name: interval
+                                type: integer
+                      - name: quota_sets
+                        type: boolean
+                      - name: servers
+                        anyOf:
+                          - type: boolean
+                          - type: object
+                            properties:
+                              - name: limit
+                                description: |
+                                  Maximum number of servers to be processed.
+                                type: integer
+                              - name: include
+                                type: array
+                                items:
+                                  anyOf:
+                                    - type: string
+                                    - type: object
+                                      properties:
+                                        - name: name
+                                          type: string
+                                        - name: flavors
+                                          type: boolean
+                                        - name: diagnostics
+                                          type: boolean
+                              - name: exclude
+                                type: array
+                                items:
+                                  type: string
+                              - name: interval
+                                type: integer
+              - name: network
+                anyOf:
+                  - type: boolean
+                  - type: object
+                    properties:
+                      - name: agents
+                        type: boolean
+                      - name: networks
+                        anyOf:
+                          - type: boolean
+                          - type: object
+                            properties:
+                              - name: limit
+                                description: |
+                                  Maximum number of networks to be processed.
+                                type: integer
+                              - name: include
+                                type: array
+                                items:
+                                  anyOf:
+                                    - type: string
+                                    - type: object
+                                      properties:
+                                        - name: name
+                                          type: string
+                              - name: exclude
+                                type: array
+                                items:
+                                  type: string
+                              - name: interval
+                                type: integer
+                      - name: quotas
+                        type: boolean
+              - name: block-storage
+                anyOf:
+                  - type: boolean
+                  - type: object
+              - name: baremetal
+                anyOf:
+                  - type: boolean
+                  - type: object
+                    properties:
+                      - name: nodes
+                        anyOf:
+                          - type: boolean
+                          - type: object
+                            properties:
+                              - name: limit
+                                description: |
+                                  Maximum number of nodes to be processed.
+                                type: integer
+                              - name: include
+                                type: array
+                                items:
+                                  anyOf:
+                                    - type: string
+                                    - type: object
+                                      properties:
+                                        - name: name
+                                          type: string
+                                        - name: uptime
+                                          type: boolean
+                              - name: exclude
+                                type: array
+                                items:
+                                  type: string
+                              - name: interval
+                                type: integer
+                      - name: conductors
+                        type: boolean
+              - name: load-balancer
+                anyOf:
+                  - type: boolean
+                  - type: object
+                    properties:
+                      - name: loadbalancers
+                        anyOf:
+                          - type: boolean
+                          - type: object
+                            properties:
+                              - name: limit
+                                description: |
+                                  Maximum number of loadbalancers to be processed.
+                                type: integer
+                              - name: include
+                                type: array
+                                items:
+                                  anyOf:
+                                    - type: string
+                                    - type: object
+                                      properties:
+                                        - name: name
+                                          type: string
+                                        - name: stats
+                                          type: boolean
+                              - name: exclude
+                                type: array
+                                items:
+                                  type: string
+                              - name: interval
+                                type: integer
+                      - name: listeners
+                        anyOf:
+                          - type: boolean
+                          - type: object
+                            properties:
+                              - name: limit
+                                description: |
+                                  Maximum number of listeners to be processed.
+                                type: integer
+                              - name: include
+                                type: array
+                                items:
+                                  anyOf:
+                                    - type: string
+                                    - type: object
+                                      properties:
+                                        - name: name
+                                          type: string
+                                        - name: stats
+                                          type: boolean
+                              - name: exclude
+                                type: array
+                                items:
+                                  type: string
+                              - name: interval
+                                type: integer
+                      - name: pools
+                        anyOf:
+                          - type: boolean
+                          - type: object
+                            properties:
+                              - name: limit
+                                description: |
+                                  Maximum number of pools to be processed.
+                                type: integer
+                              - name: include
+                                type: array
+                                items:
+                                  anyOf:
+                                    - type: string
+                                    - type: object
+                                      properties:
+                                        - name: name
+                                          type: string
+                                        - name: members
+                                          anyOf:
+                                          - type: boolean
+                                          - type: object
+                                            properties:
+                                              - name: limit
+                                                description: |
+                                                  Maximum number of members to be processed.
+                                                type: integer
+                                              - name: include
+                                                type: array
+                                                items:
+                                                  anyOf:
+                                                    - type: string
+                                                    - type: object
+                                                      properties:
+                                                        - name: name
+                                                          type: string
+                                              - name: exclude
+                                                type: array
+                                                items:
+                                                  type: string
+                                              - name: interval
+                                                type: integer           
+                      - name: healthmonitors
+                        anyOf:
+                          - type: boolean
+                          - type: object
+                            properties:
+                              - name: limit
+                                description: |
+                                  Maximum number of healthmonitors to be processed.
+                                type: integer
+                              - name: include
+                                type: array
+                                items:
+                                  anyOf:
+                                    - type: string
+                                    - type: object
+                                      properties:
+                                        - name: name
+                                          type: string
+                              - name: exclude
+                                type: array
+                                items:
+                                  type: string
+                              - name: interval
+                                type: integer
+                      - name: quotas
+                        anyOf:
+                          - type: boolean
+                          - type: object
+                            properties:
+                              - name: limit
+                                description: |
+                                  Maximum number of quotas to be processed.
+                                type: integer
+                              - name: include
+                                type: array
+                                items:
+                                  anyOf:
+                                    - type: string
+                                    - type: object
+                                      properties:
+                                        - name: name
+                                          type: string
+                              - name: exclude
+                                type: array
+                                items:
+                                  type: string
+                              - name: interval
+                                type: integer                                  
+                      - name: amphorae
+                        anyOf:
+                          - type: boolean
+                          - type: object
+                            properties:
+                              - name: limit
+                                description: |
+                                  Maximum number of amphorae to be processed.
+                                type: integer
+                              - name: include
+                                type: array
+                                items:
+                                  anyOf:
+                                    - type: string
+                                    - type: object
+                                      properties:
+                                        - name: id
+                                          type: string
+                                        - name: stats
+                                          type: boolean
+                              - name: exclude
+                                type: array
+                                items:
+                                  type: string
+                              - name: interval
+                                type: integer
+            example:
+              compute: false
+        - name: projects
+          description: |
+            Optional configuration to indicate the projects that we want to be processed. If not configured,
+            all projects will be processed.
+
+            The 'include' key will indicate the regular expressions of the projects for which metrics are to be reported
+            and the configuration to be applied to each of them. Each group may have a 'components'-like configuration,
+            enabling or disabling components or metrics. For further details see previous section 'components'.
+            If no configuration associated with the key is indicated
+            with the regular expression, they will be processed with the default configuration.
+
+            The projects will be processed in the order indicated in the 'include'.
+            If a projects is matched on an 'include' key, it will only be processed there and not in a later 'include'
+            that it might match on.
+
+            The 'exclude' key will indicate the regular expressions of those projects for which metrics
+            are not to be reported.
+            The excludes will have priority over the includes, that is, if a projects matches an exclude, it will not be
+            processed even if it matches an include.
+
+            The 'limit' key will allow limiting the number of projects processed to avoid a combinatorial explosion of tags
+            associated with a metric.
+
+            The 'interval' key will indicate the validity time of the last list of projects obtained through the endpoint.
+            If 'interval' is not indicated, the list of projects will be obtained each time the check is executed
+            and will not be cached.
+
+            In the following example, all projects will be processed except those whose name begins with 'tmp_'
+            up to a maximum of 10 projects.
+            Furthermore, the cache will be valid for 1 minute.
+
+              projects:
+                limit: 10
+                include:
+                  - '.*'
+                exclude:
+                  - 'tmp_.*'
+                interval: 60
+          value:
+            type: object
+            properties:
+              - name: limit
+                description: |
+                  Maximum number of clusters to be processed.
+                type: integer
+              - name: include
+                type: array
+                items:
+                  anyOf:
+                    - type: string
+                    - type: object
+              - name: exclude
+                type: array
+                items:
+                  type: string
+              - name: interval
+                type: integer
+            example:
+              include:
+                - '.*'
+              exclude:
+                - 'tmp_.*'
         - template: instances/default
           overrides:
             service.hidden: true
-            min_collection_interval.hidden: true
             empty_default_hostname.hidden: true
         - template: instances/http
           overrides:
+            username.hidden: true
+            password.hidden: true
             tls_use_host_header.hidden: true
             auth_type.hidden: true
             use_legacy_auth_encoding.hidden: true
diff --git a/openstack_controller/assets/dashboards/openstack-controller.json b/openstack_controller/assets/dashboards/openstack-controller.json
index a5a9c32e96eb6..8e7c2c60d4f15 100644
--- a/openstack_controller/assets/dashboards/openstack-controller.json
+++ b/openstack_controller/assets/dashboards/openstack-controller.json
@@ -1,5 +1,5 @@
 {
-    "title": "OpenStack Controller Overview",
+    "title": "OpenStack Controller Overview [Legacy]",
     "description": "## OpenStack Controller - Overview\n\nPreset dashboard for the OpenStack Controller integration. Used for OpenStack deployments v13 and higher. \n\n[See integration docs for more details](https://docs.datadoghq.com/integrations/openstack_controller/)",
     "widgets": [
       {
diff --git a/openstack_controller/assets/dashboards/openstack_controller_overview_[default_microversion].json b/openstack_controller/assets/dashboards/openstack_controller_overview_[default_microversion].json
new file mode 100644
index 0000000000000..9b89d6ba9e51d
--- /dev/null
+++ b/openstack_controller/assets/dashboards/openstack_controller_overview_[default_microversion].json
@@ -0,0 +1,5368 @@
+{
+    "author_name": "Datadog",
+    "description": "## OpenStack Controller - Overview\n\nPreset dashboard for the OpenStack Controller integration. Used for OpenStack deployments v13 and higher. \n\n[See integration docs for more details](https://docs.datadoghq.com/integrations/openstack_controller/) ",
+    "layout_type": "ordered",
+    "template_variables": [
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "Keystone_Server_URL",
+            "prefix": "keystone_server"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "RegionId",
+            "prefix": "region_id"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "Domain",
+            "prefix": "domain_id"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "Project",
+            "prefix": "project_name"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "Server",
+            "prefix": "server_name"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "Server_Status",
+            "prefix": "server_status"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "Hypervisor",
+            "prefix": "hypervisor"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "Flavor",
+            "prefix": "flavor_name"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "LoadBalancer",
+            "prefix": "loadbalancer_name"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "Listener",
+            "prefix": "listener_name"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "Pool",
+            "prefix": "pool_name"
+        },
+        {
+            "available_values": [],
+            "default": "*",
+            "name": "HealthMonitor",
+            "prefix": "healthmonitor_name"
+        }
+    ],
+    "title": "OpenStack Controller Overview [Default Microversion]",
+    "widgets": [
+        {
+            "definition": {
+                "banner_img": "/static/images/logos/openstack_large.svg",
+                "layout_type": "ordered",
+                "show_title": true,
+                "title": "",
+                "type": "group",
+                "widgets": [
+                    {
+                        "definition": {
+                            "background_color": "white",
+                            "content": "This dashboard provides an overview of your Openstack deployment. Track the health of your Nova, Neutron, Ironic, and Octavia services and view key information such as:\n- hypervisor load and status \n- server details and errors \n- status of bare metal nodes \n- load balancer service health\n\nMake sure to scope your dashboard to the `keystone_server_url` of your Openstack deployment as well as the `region` that you would like to see data for. You can additionally drill down into specific servers, hypervisors, and more.",
+                            "font_size": "14",
+                            "has_padding": true,
+                            "show_tick": false,
+                            "text_align": "left",
+                            "tick_edge": "left",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "top"
+                        },
+                        "id": 1279542448767170,
+                        "layout": {
+                            "height": 3,
+                            "width": 6,
+                            "x": 0,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "white",
+                            "content": "**Further Reading on Openstack**\n\n[Datadog Openstack Controller Integration Docs&nbsp;\u2197]( https://docs.datadoghq.com/integrations/openstack_controller/)\n\n[Openstack Docs &nbsp;\u2197]( https://www.openstack.org/)\n\n[Openstack Services &nbsp;\u2197](https://www.openstack.org/software/project-navigator/openstack-components#openstack-services)\n",
+                            "font_size": "14",
+                            "has_padding": true,
+                            "show_tick": false,
+                            "text_align": "left",
+                            "tick_edge": "left",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "top"
+                        },
+                        "id": 695657035123988,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 0,
+                            "y": 3
+                        }
+                    }
+                ]
+            },
+            "id": 3650127614551902,
+            "layout": {
+                "height": 8,
+                "width": 6,
+                "x": 0,
+                "y": 0
+            }
+        },
+        {
+            "definition": {
+                "background_color": "white",
+                "layout_type": "ordered",
+                "show_title": true,
+                "title": "Overview",
+                "type": "group",
+                "widgets": [
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Components",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 6076858181941086,
+                        "layout": {
+                            "height": 1,
+                            "width": 6,
+                            "x": 0,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "check": "openstack.keystone.api.up",
+                            "group_by": [
+                                "keystone_server"
+                            ],
+                            "grouping": "cluster",
+                            "tags": [
+                                "$Keystone_Server_URL"
+                            ],
+                            "title": "Keystone",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "check_status"
+                        },
+                        "id": 5012464578391900,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 0,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "check": "openstack.nova.api.up",
+                            "group": "$Project",
+                            "group_by": [
+                                "domain_id",
+                                "keystone_server"
+                            ],
+                            "grouping": "cluster",
+                            "tags": [
+                                "$Domain",
+                                "$Keystone_Server_URL"
+                            ],
+                            "title": "Nova",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "check_status"
+                        },
+                        "id": 7127932884759874,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 2,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "check": "openstack.neutron.api.up",
+                            "group": "$Project",
+                            "group_by": [
+                                "domain_id",
+                                "keystone_server"
+                            ],
+                            "grouping": "cluster",
+                            "tags": [
+                                "$Domain",
+                                "$Keystone_Server_URL"
+                            ],
+                            "title": "Neutron",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "check_status"
+                        },
+                        "id": 7813309804115824,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 4,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.keystone.response_time{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area"
+                            },
+                            "title": "Response Time",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 5893131258645472,
+                        "layout": {
+                            "height": 2,
+                            "width": 2,
+                            "x": 0,
+                            "y": 2
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.response_time{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area"
+                            },
+                            "title": "Response Time",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 2275586178175996,
+                        "layout": {
+                            "height": 2,
+                            "width": 2,
+                            "x": 2,
+                            "y": 2
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.neutron.response_time{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area"
+                            },
+                            "title": "Response Time",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 7927320907633026,
+                        "layout": {
+                            "height": 2,
+                            "width": 2,
+                            "x": 4,
+                            "y": 2
+                        }
+                    },
+                    {
+                        "definition": {
+                            "check": "openstack.cinder.api.up",
+                            "group_by": [
+                                "domain_id",
+                                "keystone_server"
+                            ],
+                            "grouping": "cluster",
+                            "tags": [
+                                "$Domain",
+                                "$Keystone_Server_URL"
+                            ],
+                            "title": "Cinder",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "check_status"
+                        },
+                        "id": 435440859398038,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 0,
+                            "y": 4
+                        }
+                    },
+                    {
+                        "definition": {
+                            "check": "openstack.ironic.api.up",
+                            "group": "$Project",
+                            "group_by": [
+                                "domain_id"
+                            ],
+                            "grouping": "cluster",
+                            "tags": [
+                                "$Domain",
+                                "$Keystone_Server_URL"
+                            ],
+                            "title": "Ironic",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "check_status"
+                        },
+                        "id": 5227104244716420,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 2,
+                            "y": 4
+                        }
+                    },
+                    {
+                        "definition": {
+                            "check": "openstack.octavia.api.up",
+                            "group": "$Project",
+                            "group_by": [
+                                "domain_id",
+                                "project_name"
+                            ],
+                            "grouping": "cluster",
+                            "tags": [
+                                "$Domain",
+                                "$Project",
+                                "$Keystone_Server_URL"
+                            ],
+                            "title": "Octavia",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "check_status"
+                        },
+                        "id": 1294662051798076,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 4,
+                            "y": 4
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.cinder.response_time{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area"
+                            },
+                            "title": "Response Time",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 5218774259137714,
+                        "layout": {
+                            "height": 2,
+                            "width": 2,
+                            "x": 0,
+                            "y": 5
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.ironic.response_time{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area"
+                            },
+                            "title": "Response Time",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 7244495661221860,
+                        "layout": {
+                            "height": 2,
+                            "width": 2,
+                            "x": 2,
+                            "y": 5
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.response_time{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area"
+                            },
+                            "title": "Response Time",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 4992704165041010,
+                        "layout": {
+                            "height": 2,
+                            "width": 2,
+                            "x": 4,
+                            "y": 5
+                        }
+                    }
+                ]
+            },
+            "id": 1149578833829744,
+            "layout": {
+                "height": 8,
+                "width": 6,
+                "x": 6,
+                "y": 0
+            }
+        },
+        {
+            "definition": {
+                "background_color": "vivid_purple",
+                "layout_type": "ordered",
+                "show_title": true,
+                "title": "Identity",
+                "type": "group",
+                "widgets": [
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Domains",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 4695876917446764,
+                        "layout": {
+                            "height": 1,
+                            "width": 4,
+                            "x": 0,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Projects",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 6855120474688900,
+                        "layout": {
+                            "height": 1,
+                            "width": 4,
+                            "x": 4,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Users",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 5909839954300574,
+                        "layout": {
+                            "height": 1,
+                            "width": 4,
+                            "x": 8,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.keystone.domain.count{$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Total",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 8471118323486286,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 0,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.keystone.domain.enabled{$Domain,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Enabled",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 4731903736791392,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 2,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.keystone.project.count{$Domain,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Total",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 8803274434703752,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 4,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.keystone.project.enabled{$Domain,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Enabled",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 3191908915378146,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 6,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.keystone.user.count{$Domain,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Total",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 379477558204828,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 8,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.keystone.user.enabled{$Domain,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Enabled",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 2666423509360874,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 10,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "enabled",
+                                            "cell_display_mode": "number",
+                                            "conditional_formats": [
+                                                {
+                                                    "comparator": ">",
+                                                    "palette": "green_on_white",
+                                                    "value": 0
+                                                },
+                                                {
+                                                    "comparator": "<=",
+                                                    "palette": "red_on_white",
+                                                    "value": 0
+                                                }
+                                            ],
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.keystone.domain.enabled{$Domain,$Keystone_Server_URL,$RegionId} by {domain_id}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": " ",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 8256690346784846,
+                        "layout": {
+                            "height": 2,
+                            "width": 4,
+                            "x": 0,
+                            "y": 2
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "enabled",
+                                            "cell_display_mode": "number",
+                                            "conditional_formats": [
+                                                {
+                                                    "comparator": ">",
+                                                    "palette": "green_on_white",
+                                                    "value": 0
+                                                },
+                                                {
+                                                    "comparator": "<=",
+                                                    "palette": "red_on_white",
+                                                    "value": 0
+                                                }
+                                            ],
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.keystone.project.enabled{$Domain,$Keystone_Server_URL,$RegionId} by {domain_id,project_id,project_name}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": " ",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 6751456233289334,
+                        "layout": {
+                            "height": 2,
+                            "width": 4,
+                            "x": 4,
+                            "y": 2
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "enabled",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.keystone.user.enabled{$Domain,$Keystone_Server_URL,$RegionId} by {domain_id,user_id,user_name}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": " ",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 6211672064498870,
+                        "layout": {
+                            "height": 2,
+                            "width": 4,
+                            "x": 8,
+                            "y": 2
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Groups",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 5394392430164294,
+                        "layout": {
+                            "height": 1,
+                            "width": 4,
+                            "x": 0,
+                            "y": 4
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Services",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 5554661661937140,
+                        "layout": {
+                            "height": 1,
+                            "width": 4,
+                            "x": 4,
+                            "y": 4
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Limits",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 606975590383336,
+                        "layout": {
+                            "height": 1,
+                            "width": 4,
+                            "x": 8,
+                            "y": 4
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.keystone.group.count{$Domain,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "avg:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Total",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 6817216920918920,
+                        "layout": {
+                            "height": 3,
+                            "width": 1,
+                            "x": 0,
+                            "y": 5
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "users",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.keystone.group.users{$Domain,$Keystone_Server_URL,$RegionId} by {domain_id,group_id,group_name}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": " ",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 4181141736947942,
+                        "layout": {
+                            "height": 3,
+                            "width": 3,
+                            "x": 1,
+                            "y": 5
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.keystone.service.count{$Domain,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Domain,$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Total",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 3210267908879186,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 4,
+                            "y": 5
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.keystone.service.enabled{$Domain,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Domain,$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Enabled",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 1980455363009180,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 6,
+                            "y": 5
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "limit",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.keystone.limit.limit{$Domain,$Keystone_Server_URL,$RegionId} by {service_id,region_id,resource_name}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": " ",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 2963307684002388,
+                        "layout": {
+                            "height": 3,
+                            "width": 4,
+                            "x": 8,
+                            "y": 5
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "enabled",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.keystone.service.enabled{$Domain,$Keystone_Server_URL,$RegionId} by {service_id,service_name,service_type,region_id}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": " ",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 4987419821831102,
+                        "layout": {
+                            "height": 2,
+                            "width": 4,
+                            "x": 4,
+                            "y": 6
+                        }
+                    }
+                ]
+            },
+            "id": 1527655802099832,
+            "layout": {
+                "height": 9,
+                "width": 12,
+                "x": 0,
+                "y": 8
+            }
+        },
+        {
+            "definition": {
+                "background_color": "yellow",
+                "layout_type": "ordered",
+                "show_title": true,
+                "title": "Networking",
+                "type": "group",
+                "widgets": [
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Quotas",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 5152521546461456,
+                        "layout": {
+                            "height": 1,
+                            "width": 6,
+                            "x": 0,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Agents",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 8347391281503614,
+                        "layout": {
+                            "height": 1,
+                            "width": 6,
+                            "x": 6,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "floating ips",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        },
+                                        {
+                                            "alias": "networks",
+                                            "cell_display_mode": "number",
+                                            "formula": "query2"
+                                        },
+                                        {
+                                            "alias": "ports",
+                                            "cell_display_mode": "number",
+                                            "formula": "query3"
+                                        },
+                                        {
+                                            "alias": "RBAC policies",
+                                            "cell_display_mode": "number",
+                                            "formula": "query4"
+                                        },
+                                        {
+                                            "alias": "Routers",
+                                            "cell_display_mode": "number",
+                                            "formula": "query5"
+                                        },
+                                        {
+                                            "alias": "Subnets",
+                                            "cell_display_mode": "number",
+                                            "formula": "query7"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.neutron.quota.floatingip{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "avg:openstack.neutron.quota.network{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query3",
+                                            "query": "avg:openstack.neutron.quota.port{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query4",
+                                            "query": "avg:openstack.neutron.quota.rbac_policy{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query5",
+                                            "query": "avg:openstack.neutron.quota.router{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query7",
+                                            "query": "avg:openstack.neutron.quota.subnet{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": " ",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 8622710894073694,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 0,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "is alive?",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        },
+                                        {
+                                            "alias": "admin state up",
+                                            "cell_display_mode": "number",
+                                            "formula": "query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.neutron.agent.alive{$Keystone_Server_URL,$RegionId} by {agent_name,agent_host,agent_type,agent_id}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "avg:openstack.neutron.agent.admin_state_up{$Keystone_Server_URL,$RegionId} by {agent_name,agent_host,agent_type,agent_id}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": " ",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 57551622267148,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 1
+                        }
+                    }
+                ]
+            },
+            "id": 2520929327185178,
+            "layout": {
+                "height": 4,
+                "width": 12,
+                "x": 0,
+                "y": 17
+            }
+        },
+        {
+            "definition": {
+                "background_color": "blue",
+                "layout_type": "ordered",
+                "show_title": true,
+                "title": "Bare Metal",
+                "type": "group",
+                "widgets": [
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.ironic.conductor.up{$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": false
+                                }
+                            },
+                            "title": "Number of Conductors",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 4150424962558634,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 0,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_green",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "count_nonzero(query1) / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.ironic.conductor.up{$Keystone_Server_URL,$RegionId} by {conductor_hostname}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": false
+                                }
+                            },
+                            "title": "Conductors Up",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 5618354817475102,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 3,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "count_not_null(query1) / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.ironic.node.up{$Keystone_Server_URL,$RegionId} by {node_name}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": false
+                                }
+                            },
+                            "title": "Number of Nodes",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 5985516085421070,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 6,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_green",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "count_nonzero(query1) / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.ironic.node.up{$Keystone_Server_URL,$RegionId} by {node_name}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": false
+                                }
+                            },
+                            "title": "Nodes Up",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 1075111026210398,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 9,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "Is conductor up?",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.ironic.conductor.up{$Keystone_Server_URL,$RegionId} by {conductor_hostname,conductor_group,region_id}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Conductors Status",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 616800945825908,
+                        "layout": {
+                            "height": 3,
+                            "width": 6,
+                            "x": 0,
+                            "y": 2
+                        }
+                    },
+                    {
+                        "definition": {
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "Is node up?",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 10,
+                                                "order": "desc"
+                                            },
+                                            "number_format": {
+                                                "unit": {
+                                                    "type": "canonical_unit"
+                                                }
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.ironic.node.up{$Keystone_Server_URL,$RegionId} by {node_name,node_uuid,provision_state,target_provision_state,driver,conductor_group,power_state}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Node Status",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 5575798020651374,
+                        "layout": {
+                            "height": 3,
+                            "width": 6,
+                            "x": 6,
+                            "y": 2
+                        }
+                    }
+                ]
+            },
+            "id": 2467325690259512,
+            "layout": {
+                "height": 6,
+                "width": 12,
+                "x": 0,
+                "y": 21
+            }
+        },
+        {
+            "definition": {
+                "background_color": "green",
+                "layout_type": "ordered",
+                "show_title": true,
+                "title": "Compute",
+                "type": "group",
+                "widgets": [
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Cores",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 1083091091293100,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 0,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "RAM",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 4489659513775978,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 2,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Servers",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "right",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 7316697881838270,
+                        "layout": {
+                            "height": 1,
+                            "width": 3,
+                            "x": 4,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 0,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.server.count{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Total",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 8389755498827206,
+                        "layout": {
+                            "height": 1,
+                            "width": 1,
+                            "x": 7,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 0,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "green_on_white",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.server.active{$Domain,$Project,$Server,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Active",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 8959907913169442,
+                        "layout": {
+                            "height": 1,
+                            "width": 1,
+                            "x": 8,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 0,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "red_on_white",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.server.error{$Domain,$Project,$Server,server_status:error,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Error",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 847817452869816,
+                        "layout": {
+                            "height": 1,
+                            "width": 1,
+                            "x": 9,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 0,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.limit.absolute.max_total_instances{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Max",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 2371291432188162,
+                        "layout": {
+                            "height": 1,
+                            "width": 1,
+                            "x": 10,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 0,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_green",
+                                            "value": 0
+                                        },
+                                        {
+                                            "comparator": "<=",
+                                            "palette": "white_on_red",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "(query1 - query2) / query3"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.limit.absolute.max_total_instances{$Domain,$Project,$Server,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.nova.server.count{$Domain,$Project,$Server,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query3",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Available",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 7914730465800642,
+                        "layout": {
+                            "height": 1,
+                            "width": 1,
+                            "x": 11,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.limit.absolute.total_cores_used{$Domain,$Project,$Server,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Used",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 1065326342064856,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 0,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.limit.absolute.total_ram_used{$Domain,$Project,$Server,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Used",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 8259629504654942,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 2,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "always",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "vCPUS",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        },
+                                        {
+                                            "alias": "RAM",
+                                            "cell_display_mode": "number",
+                                            "formula": "query2"
+                                        },
+                                        {
+                                            "alias": "Disk",
+                                            "cell_display_mode": "number",
+                                            "formula": "query3"
+                                        },
+                                        {
+                                            "alias": "Uptime",
+                                            "cell_display_mode": "number",
+                                            "formula": "query4",
+                                            "number_format": {
+                                                "unit": {
+                                                    "type": "canonical_unit",
+                                                    "unit_name": "second"
+                                                }
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.server.flavor.vcpus{$Domain,$Project,$Server,$Hypervisor,$Flavor,$Server_Status,$Keystone_Server_URL,$RegionId} by {project_name,server_id,server_name,server_status,instance_hostname,instance_name}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "avg:openstack.nova.server.flavor.ram{$Domain,$Project,$Server,$Hypervisor,$Flavor,$Server_Status,$Keystone_Server_URL,$RegionId} by {project_name,server_id,server_name,server_status,instance_hostname}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query3",
+                                            "query": "avg:openstack.nova.server.flavor.disk{$Domain,$Project,$Server,$Hypervisor,$Flavor,$Server_Status,$Keystone_Server_URL,$RegionId} by {project_name,server_id,server_name,server_status,instance_hostname}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query4",
+                                            "query": "avg:openstack.nova.server.diagnostic.uptime{$Domain,$Project,$Server,$Hypervisor,$Flavor,$Server_Status,$Keystone_Server_URL,$RegionId} by {project_name,server_id,server_name,server_status,instance_hostname}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Servers",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 1423442814929672,
+                        "layout": {
+                            "height": 3,
+                            "width": 8,
+                            "x": 4,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 0,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.limit.absolute.max_total_cores{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Max",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 72723294366206,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 0,
+                            "y": 2
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.limit.absolute.max_total_ram_size{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Max",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 7280734997901480,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 2,
+                            "y": 2
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": false,
+                            "precision": 0,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_green",
+                                            "value": 0
+                                        },
+                                        {
+                                            "comparator": "<=",
+                                            "palette": "white_on_red",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "(query2 - query1) / query3"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.nova.limit.absolute.max_total_cores{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.limit.absolute.total_cores_used{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query3",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Available",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 1360251480683836,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 0,
+                            "y": 3
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_green",
+                                            "value": 0
+                                        },
+                                        {
+                                            "comparator": "<=",
+                                            "palette": "white_on_red",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "(query1 - query2) / query3"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.limit.absolute.max_total_ram_size{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.nova.limit.absolute.total_ram_used{$Domain,$Project,$Keystone_Server_URL,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query3",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Available",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 3415917263580914,
+                        "layout": {
+                            "height": 1,
+                            "width": 2,
+                            "x": 2,
+                            "y": 3
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Services",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 1621257520086820,
+                        "layout": {
+                            "height": 1,
+                            "width": 12,
+                            "x": 0,
+                            "y": 4
+                        }
+                    },
+                    {
+                        "definition": {
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "Is up?",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.service.up{$Server,$Domain,$Server_Status,$Hypervisor,$Flavor,$Keystone_Server_URL,$RegionId} by {service_name,service_state,service_status,service_id,service_host}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": " ",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 394175047495050,
+                        "layout": {
+                            "height": 3,
+                            "width": 8,
+                            "x": 0,
+                            "y": 5
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "blue",
+                            "content": "View the status and health of all of the Compute services in your Openstack deployment. Quickly identify which services are in maintenance mode and on what host they are running, so you know exactly where to troubleshoot an error in your environment.",
+                            "font_size": "16",
+                            "has_padding": true,
+                            "show_tick": false,
+                            "text_align": "left",
+                            "tick_edge": "left",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "top"
+                        },
+                        "id": 2608729604359742,
+                        "layout": {
+                            "height": 3,
+                            "width": 4,
+                            "x": 8,
+                            "y": 5
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Details",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 961421823181182,
+                        "layout": {
+                            "height": 1,
+                            "width": 12,
+                            "x": 0,
+                            "y": 8
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "yellow",
+                            "content": "Disk",
+                            "font_size": "24",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "top"
+                        },
+                        "id": 5735202382077678,
+                        "layout": {
+                            "height": 1,
+                            "width": 6,
+                            "x": 0,
+                            "y": 9
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "blue",
+                            "content": "View important server diagnostic information such as VM disk read and write requests and memory availability.\n\n",
+                            "font_size": "16",
+                            "has_padding": true,
+                            "show_tick": false,
+                            "text_align": "left",
+                            "tick_edge": "left",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "top"
+                        },
+                        "id": 251952917953624,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 9
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Requests",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.server.diagnostic.disk_details.read_requests{$Domain,$Project,$Server,$Keystone_Server_URL,$RegionId} by {project_name,server_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Read Requests",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 152404002909504,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 0,
+                            "y": 10
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "yellow",
+                            "content": "Memory",
+                            "font_size": "24",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "top"
+                        },
+                        "id": 7545458892580266,
+                        "layout": {
+                            "height": 1,
+                            "width": 6,
+                            "x": 6,
+                            "y": 11
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Requests",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.server.diagnostic.disk_details.read_requests{$Domain,$Project,$Server,$Keystone_Server_URL,$RegionId} by {project_name,server_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Write Requests",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 1846417427059902,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 0,
+                            "y": 12
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.server.diagnostic.memory_details.used{$Domain,$Project,$Server,$Keystone_Server_URL,$RegionId} by {project_name,server_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Memory Used",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 4907952300916936,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 12
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Errors",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.server.diagnostic.disk_details.errors_count{$Domain,$Project,$Server,$Keystone_Server_URL,$RegionId} by {project_name,server_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Errors",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 151587003195190,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 0,
+                            "y": 14
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "formula": "query1"
+                                        },
+                                        {
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.server.diagnostic.memory_details.maximum{$Keystone_Server_URL,$Domain,$Project,$Server,$Hypervisor,$Flavor,$RegionId} by {project_name,server_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Maximum Memory",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 1895873899024496,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 14
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Hypervisors",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 6757644244857988,
+                        "layout": {
+                            "height": 1,
+                            "width": 12,
+                            "x": 0,
+                            "y": 16
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.nova.hypervisor.count{$Keystone_Server_URL, $RegionId, $Domain}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL, $RegionId, $Domain}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "time": {},
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": true
+                                }
+                            },
+                            "title": "Number of Hypervisors",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 8866499660765004,
+                        "layout": {
+                            "height": 2,
+                            "width": 2,
+                            "x": 0,
+                            "y": 17
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Load 1",
+                                            "formula": "query1"
+                                        },
+                                        {
+                                            "alias": "Load 5",
+                                            "formula": "query2"
+                                        },
+                                        {
+                                            "alias": "Load 15",
+                                            "formula": "query3"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.hypervisor.load_1{$Domain,$Hypervisor,$Keystone_Server_URL,$RegionId} by {hypervisor_name}"
+                                        },
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "avg:openstack.nova.hypervisor.load_5{$Domain,$Hypervisor,$Keystone_Server_URL,$RegionId} by {hypervisor_name}"
+                                        },
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query3",
+                                            "query": "avg:openstack.nova.hypervisor.load_15{$Domain,$Hypervisor,$Keystone_Server_URL,$RegionId} by {hypervisor_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Hypervisor Load",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 2113318735504040,
+                        "layout": {
+                            "height": 2,
+                            "width": 4,
+                            "x": 2,
+                            "y": 17
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "is up?",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.hypervisor.up{$Domain,$Hypervisor,$Keystone_Server_URL,$RegionId} by {hypervisor_id,hypervisor_name,hypervisor_state,hypervisor_status,hypervisor_type}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": " ",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 5422663317276710,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 17
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Flavors",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 2883437765393604,
+                        "layout": {
+                            "height": 1,
+                            "width": 6,
+                            "x": 0,
+                            "y": 19
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Quotas",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 4466210427706886,
+                        "layout": {
+                            "height": 1,
+                            "width": 6,
+                            "x": 6,
+                            "y": 19
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "always",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "Virtual CPUs",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 50,
+                                                "order": "desc"
+                                            }
+                                        },
+                                        {
+                                            "alias": "RAM",
+                                            "cell_display_mode": "number",
+                                            "formula": "query2"
+                                        },
+                                        {
+                                            "alias": "Disk",
+                                            "cell_display_mode": "number",
+                                            "formula": "query3"
+                                        },
+                                        {
+                                            "alias": "Swap",
+                                            "cell_display_mode": "number",
+                                            "formula": "query4"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.flavor.vcpus{$Domain,$Flavor,$Keystone_Server_URL,$RegionId} by {flavor_name}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "avg:openstack.nova.flavor.ram{$Domain,$Flavor,$Keystone_Server_URL,$RegionId} by {flavor_name}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query3",
+                                            "query": "avg:openstack.nova.flavor.disk{$Domain,$Flavor,$Keystone_Server_URL,$RegionId} by {flavor_name}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query4",
+                                            "query": "avg:openstack.nova.flavor.swap{$Domain,$Flavor,$Keystone_Server_URL,$RegionId} by {flavor_name}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Flavors",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 5631263369283910,
+                        "layout": {
+                            "height": 4,
+                            "width": 6,
+                            "x": 0,
+                            "y": 20
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "always",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "instances",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        },
+                                        {
+                                            "alias": "vcpus",
+                                            "cell_display_mode": "number",
+                                            "formula": "query2"
+                                        },
+                                        {
+                                            "alias": "ram",
+                                            "cell_display_mode": "number",
+                                            "formula": "query3"
+                                        },
+                                        {
+                                            "alias": "metadata items",
+                                            "cell_display_mode": "number",
+                                            "formula": "query4"
+                                        },
+                                        {
+                                            "alias": "key pairs",
+                                            "cell_display_mode": "number",
+                                            "formula": "query5"
+                                        },
+                                        {
+                                            "alias": "server groups",
+                                            "cell_display_mode": "number",
+                                            "formula": "query6"
+                                        },
+                                        {
+                                            "alias": "server groups members",
+                                            "cell_display_mode": "number",
+                                            "formula": "query7"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.nova.quota_set.instances{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "avg:openstack.nova.quota_set.cores{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query3",
+                                            "query": "avg:openstack.nova.quota_set.ram{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query4",
+                                            "query": "avg:openstack.nova.quota_set.metadata_items{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query5",
+                                            "query": "avg:openstack.nova.quota_set.key_pairs{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query6",
+                                            "query": "avg:openstack.nova.quota_set.server_groups{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query7",
+                                            "query": "avg:openstack.nova.quota_set.server_group_members{$Domain,$Project,$Keystone_Server_URL,$RegionId} by {domain_id,project_name}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Quotas",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 5982142728955998,
+                        "layout": {
+                            "height": 4,
+                            "width": 6,
+                            "x": 6,
+                            "y": 20
+                        }
+                    }
+                ]
+            },
+            "id": 2104133510782750,
+            "layout": {
+                "height": 25,
+                "is_column_break": true,
+                "width": 12,
+                "x": 0,
+                "y": 27
+            }
+        },
+        {
+            "definition": {
+                "background_color": "orange",
+                "layout_type": "ordered",
+                "show_title": true,
+                "title": "Load Balancer",
+                "type": "group",
+                "widgets": [
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Load Balancers",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 2255925654349128,
+                        "layout": {
+                            "height": 1,
+                            "width": 12,
+                            "x": 0,
+                            "y": 0
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.loadbalancer.count{$Keystone_Server_URL,$Domain,$Project,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": true
+                                }
+                            },
+                            "title": "Number of Load Balancers",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 7757767715277774,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 0,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_green",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.loadbalancer.admin_state_up{$Keystone_Server_URL,$Domain,$Project,provisioning_status:active,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": false
+                                }
+                            },
+                            "title": "Load Balancers Up",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 6491119036069660,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 3,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Active Connections",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.loadbalancer.stats.active_connections{$Keystone_Server_URL,$Domain,$Project,$LoadBalancer,$Listener,$RegionId} by {loadbalancer_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Active Connections",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 6561854589315332,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 6,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Total Connections",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.loadbalancer.stats.total_connections{$Keystone_Server_URL,$Domain,$Project,$LoadBalancer,$Listener,$RegionId} by {loadbalancer_id}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Total Connections",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 572762662153126,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 9,
+                            "y": 1
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "admin_state_up",
+                                            "cell_display_mode": "number",
+                                            "conditional_formats": [
+                                                {
+                                                    "comparator": ">",
+                                                    "palette": "green_on_white",
+                                                    "value": 0
+                                                },
+                                                {
+                                                    "comparator": "<=",
+                                                    "palette": "red_on_white",
+                                                    "value": 0
+                                                }
+                                            ],
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.loadbalancer.admin_state_up{$Keystone_Server_URL,$Domain,$Project,$LoadBalancer,$Listener,$RegionId} by {domain_id,project_name,loadbalancer_name,loadbalancer_id,operating_status,provisioning_status}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Load Balancers Status",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 1356161490355352,
+                        "layout": {
+                            "height": 4,
+                            "width": 6,
+                            "x": 0,
+                            "y": 3
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Bytes In",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.loadbalancer.stats.bytes_in{$Keystone_Server_URL,$Domain,$Project,$LoadBalancer,$Listener,$RegionId} by {loadbalancer_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Bytes In",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 1619791752432374,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 6,
+                            "y": 3
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Bytes Out",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.loadbalancer.stats.bytes_out{$Keystone_Server_URL,$Domain,$Project,$LoadBalancer,$Listener,$RegionId} by {loadbalancer_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Bytes Out",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 556013271910974,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 9,
+                            "y": 3
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Request Errors",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.loadbalancer.stats.request_errors{$Keystone_Server_URL,$Domain,$Project,$LoadBalancer,$Listener,$RegionId} by {loadbalancer_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Request Errors",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 5119914898432598,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 5
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Listeners",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 6369849250103426,
+                        "layout": {
+                            "height": 1,
+                            "width": 12,
+                            "x": 0,
+                            "y": 7
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.listener.count{$Keystone_Server_URL,$Domain,$Project,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area"
+                            },
+                            "title": "Number of Listeners",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 1416655721863004,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 0,
+                            "y": 8
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "timeout_client_data",
+                                            "formula": "query1"
+                                        },
+                                        {
+                                            "alias": "timeout_member_connect",
+                                            "formula": "query2"
+                                        },
+                                        {
+                                            "alias": "timeout_member_data",
+                                            "formula": "query3"
+                                        },
+                                        {
+                                            "alias": "timeout_tcp_inspect",
+                                            "formula": "query4"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.listener.timeout_client_data{$Keystone_Server_URL,$Domain,$Project,$Listener,$LoadBalancer,$RegionId} by {listener_name}"
+                                        },
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "avg:openstack.octavia.listener.timeout_member_connect{$Keystone_Server_URL,$Domain,$Project,$Listener,$LoadBalancer,$RegionId} by {listener_name}"
+                                        },
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query3",
+                                            "query": "avg:openstack.octavia.listener.timeout_member_data{$Keystone_Server_URL,$Domain,$Project,$Listener,$LoadBalancer,$RegionId} by {listener_name}"
+                                        },
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query4",
+                                            "query": "avg:openstack.octavia.listener.timeout_tcp_inspect{$Keystone_Server_URL,$Domain,$Project,$Listener,$LoadBalancer,$RegionId} by {listener_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Timeouts",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 5643348677904636,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 3,
+                            "y": 8
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Active Connections",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.listener.stats.active_connections{$Keystone_Server_URL,$Domain,$Project,$Listener,$LoadBalancer,$RegionId} by {listener_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Active Connections",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 3548102753258584,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 6,
+                            "y": 8
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Total Connections",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.listener.stats.total_connections{$Keystone_Server_URL,$Domain,$Project,$Listener,$LoadBalancer,$RegionId} by {listener_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Total Connections",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 5069263049863320,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 9,
+                            "y": 8
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "active connections",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.listener.stats.active_connections{$Keystone_Server_URL,$Domain,$Project,$Listener,$LoadBalancer,$RegionId} by {domain_id,project_name,listener_name,listener_id,loadbalancer_id}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Listener Status",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 6772723017617438,
+                        "layout": {
+                            "height": 4,
+                            "width": 6,
+                            "x": 0,
+                            "y": 10
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Bytes In",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.listener.stats.bytes_in{$Keystone_Server_URL,$Domain,$Project,$Listener,$LoadBalancer,$RegionId} by {listener_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Bytes In",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 2085927973503200,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 6,
+                            "y": 10
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Bytes Out",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.listener.stats.bytes_out{$Keystone_Server_URL,$Domain,$Project,$Listener,$LoadBalancer,$RegionId} by {listener_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Bytes Out",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 3764637357664480,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 9,
+                            "y": 10
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Request Errors",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.listener.stats.request_errors{$Keystone_Server_URL,$Domain,$Project,$Listener,$LoadBalancer,$RegionId} by {listener_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Request Errors",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 8979452350439264,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 12
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Pools",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 7683695968939556,
+                        "layout": {
+                            "height": 1,
+                            "width": 12,
+                            "x": 0,
+                            "y": 14
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.pool.count{$Keystone_Server_URL,$Domain,$Project,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": true
+                                }
+                            },
+                            "title": "Number of Pools",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 3480255883501272,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 0,
+                            "y": 15
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.pool.admin_state_up{$Keystone_Server_URL,$Domain,$Project,operating_status:online,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": true
+                                }
+                            },
+                            "title": "Pools Online",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 6659286184367836,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 3,
+                            "y": 15
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_green",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.pool.admin_state_up{$Keystone_Server_URL,$Domain,$Project,provisioning_status:active,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": true
+                                }
+                            },
+                            "title": "Pools Provisioned",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 5840047080943002,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 6,
+                            "y": 15
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_red",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.pool.admin_state_up{$Keystone_Server_URL,$Domain,$Project,operating_status:error,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": true
+                                }
+                            },
+                            "title": "Pools Error",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 5270475664121098,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 9,
+                            "y": 15
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "admin_state_up",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.pool.admin_state_up{$Keystone_Server_URL,$Domain,$Project,$Pool,$Listener,$HealthMonitor,$RegionId} by {domain_id,project_name,pool_name,pool_id,provisioning_status,operating_status}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Pools Status",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 4177410870948212,
+                        "layout": {
+                            "height": 2,
+                            "width": 12,
+                            "x": 0,
+                            "y": 17
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Members",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 6672254956200492,
+                        "layout": {
+                            "height": 1,
+                            "width": 12,
+                            "x": 0,
+                            "y": 19
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.pool.member.count{$Keystone_Server_URL,$Domain,$Project,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": false
+                                }
+                            },
+                            "title": "Number of Members",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 8818690818726690,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 0,
+                            "y": 20
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_green",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.pool.member.admin_state_up{$Keystone_Server_URL,$Domain,$Project,operating_status:online,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "bars",
+                                "yaxis": {
+                                    "include_zero": false
+                                }
+                            },
+                            "title": "Members Online",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 3369275151650194,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 3,
+                            "y": 20
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "weight",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.pool.member.weight{$Keystone_Server_URL,$Domain,$Project,$Pool,$HealthMonitor,$RegionId} by {member_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Weight",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 2961908797604768,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 20
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "admin_state_up",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.pool.member.admin_state_up{$Keystone_Server_URL,$Domain,$Project,$Pool,$HealthMonitor,$RegionId} by {domain_id,project_name,pool_name,operating_status,provisioning_status,pool_id}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Members Status",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 3522233229713962,
+                        "layout": {
+                            "height": 2,
+                            "width": 12,
+                            "x": 0,
+                            "y": 22
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Health Monitors",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 7203366908545840,
+                        "layout": {
+                            "height": 1,
+                            "width": 12,
+                            "x": 0,
+                            "y": 24
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.healthmonitor.count{$Keystone_Server_URL,$Domain,$Project,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": true
+                                }
+                            },
+                            "title": "Number of Health Monitors",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 3250235307694230,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 0,
+                            "y": 25
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_green",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.healthmonitor.admin_state_up{$Keystone_Server_URL,$Domain,$Project,provisioning_status:active,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": false
+                                }
+                            },
+                            "title": "Health Monitors Up",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 1370920039260996,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 3,
+                            "y": 25
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "delay",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.healthmonitor.delay{$Keystone_Server_URL,$Domain,$Project,$HealthMonitor,$Pool,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Delay",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 3447066198225710,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 25
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "admin state up",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.healthmonitor.admin_state_up{$Keystone_Server_URL,$Domain,$Project,$HealthMonitor,$Pool,$RegionId} by {domain_id,project_name,healthmonitor_name,healthmonitor_id,type,operating_status,provisioning_status}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Health Monitors Status",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 7162659631259046,
+                        "layout": {
+                            "height": 4,
+                            "width": 6,
+                            "x": 0,
+                            "y": 27
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "max_retries",
+                                            "formula": "query1"
+                                        },
+                                        {
+                                            "alias": "max_retries_down",
+                                            "formula": "query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.healthmonitor.max_retries{$Keystone_Server_URL,$Domain,$Project,$HealthMonitor,$Pool,$RegionId} by {healthmonitor_name}"
+                                        },
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "avg:openstack.octavia.healthmonitor.max_retries_down{$Keystone_Server_URL,$Domain,$Project,$HealthMonitor,$Pool,$RegionId} by {healthmonitor_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Max Retries and Max Retries Down",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 6062158926337582,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 27
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "timeout",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.healthmonitor.timeout{$Keystone_Server_URL,$Domain,$Project,$HealthMonitor,$Pool,$RegionId} by {healthmonitor_name}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Timeout",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 4836555138112782,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 29
+                        }
+                    },
+                    {
+                        "definition": {
+                            "background_color": "gray",
+                            "content": "Amphorae",
+                            "font_size": "36",
+                            "has_padding": true,
+                            "show_tick": true,
+                            "text_align": "center",
+                            "tick_edge": "bottom",
+                            "tick_pos": "50%",
+                            "type": "note",
+                            "vertical_align": "center"
+                        },
+                        "id": 6361102061658310,
+                        "layout": {
+                            "height": 1,
+                            "width": 12,
+                            "x": 0,
+                            "y": 31
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.amphora.count{$Keystone_Server_URL,$Domain,$Project,$RegionId}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": true
+                                }
+                            },
+                            "title": "Number of Amphorae",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 5892971090600898,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 0,
+                            "y": 32
+                        }
+                    },
+                    {
+                        "definition": {
+                            "autoscale": true,
+                            "precision": 2,
+                            "requests": [
+                                {
+                                    "conditional_formats": [
+                                        {
+                                            "comparator": ">",
+                                            "palette": "white_on_green",
+                                            "value": 0
+                                        }
+                                    ],
+                                    "formulas": [
+                                        {
+                                            "formula": "query1 / query2"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "sum:openstack.octavia.amphora.count{$Keystone_Server_URL,$Domain,$Project,$RegionId, status:allocated}"
+                                        },
+                                        {
+                                            "aggregator": "last",
+                                            "data_source": "metrics",
+                                            "name": "query2",
+                                            "query": "sum:openstack.controller{$Keystone_Server_URL,$RegionId}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "timeseries_background": {
+                                "type": "area",
+                                "yaxis": {
+                                    "include_zero": true
+                                }
+                            },
+                            "title": "Amphorae Up",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_value"
+                        },
+                        "id": 5154793350721832,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 3,
+                            "y": 32
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Active Connections",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.amphora.stats.active_connections{$Keystone_Server_URL,$Domain,$Project,$RegionId} by {amphora_id}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Active Connections",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 5929582905258024,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 6,
+                            "y": 32
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Total Connections",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.amphora.stats.total_connections{$Keystone_Server_URL,$Domain,$Project,$RegionId} by {amphora_id}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Total Connections",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 2768524618497470,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 9,
+                            "y": 32
+                        }
+                    },
+                    {
+                        "definition": {
+                            "has_search_bar": "auto",
+                            "requests": [
+                                {
+                                    "formulas": [
+                                        {
+                                            "alias": "active ",
+                                            "cell_display_mode": "number",
+                                            "formula": "query1",
+                                            "limit": {
+                                                "count": 500,
+                                                "order": "desc"
+                                            }
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "aggregator": "avg",
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.amphora.stats.active_connections{$Keystone_Server_URL,$Domain,$Project,$RegionId} by {domain_id,project_name,amphora_id,status}"
+                                        }
+                                    ],
+                                    "response_format": "scalar"
+                                }
+                            ],
+                            "title": "Amphorae Status",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "query_table"
+                        },
+                        "id": 6776030543216082,
+                        "layout": {
+                            "height": 4,
+                            "width": 6,
+                            "x": 0,
+                            "y": 34
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Bytes In",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.amphora.stats.bytes_in{$Keystone_Server_URL,$Domain,$Project,$RegionId} by {amphora_id}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Bytes In",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 7756087337292500,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 6,
+                            "y": 34
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Bytes Out",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.amphora.stats.bytes_out{$Keystone_Server_URL,$Domain,$Project,$RegionId} by {amphora_id}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Bytes Out",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 1299657867908396,
+                        "layout": {
+                            "height": 2,
+                            "width": 3,
+                            "x": 9,
+                            "y": 34
+                        }
+                    },
+                    {
+                        "definition": {
+                            "legend_columns": [
+                                "avg",
+                                "min",
+                                "max",
+                                "value",
+                                "sum"
+                            ],
+                            "legend_layout": "auto",
+                            "requests": [
+                                {
+                                    "display_type": "line",
+                                    "formulas": [
+                                        {
+                                            "alias": "Request Errors",
+                                            "formula": "query1"
+                                        }
+                                    ],
+                                    "queries": [
+                                        {
+                                            "data_source": "metrics",
+                                            "name": "query1",
+                                            "query": "avg:openstack.octavia.amphora.stats.request_errors{$Keystone_Server_URL,$Domain,$Project,$RegionId} by {amphora_id}"
+                                        }
+                                    ],
+                                    "response_format": "timeseries",
+                                    "style": {
+                                        "line_type": "solid",
+                                        "line_width": "normal",
+                                        "palette": "dog_classic"
+                                    }
+                                }
+                            ],
+                            "show_legend": true,
+                            "title": "Request Errors",
+                            "title_align": "left",
+                            "title_size": "16",
+                            "type": "timeseries"
+                        },
+                        "id": 4613452524413160,
+                        "layout": {
+                            "height": 2,
+                            "width": 6,
+                            "x": 6,
+                            "y": 36
+                        }
+                    }
+                ]
+            },
+            "id": 374604610534690,
+            "layout": {
+                "height": 39,
+                "width": 12,
+                "x": 0,
+                "y": 52
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/openstack_controller/assets/service_checks.json b/openstack_controller/assets/service_checks.json
index 5a23b3844cb2d..de757f1e07ac5 100644
--- a/openstack_controller/assets/service_checks.json
+++ b/openstack_controller/assets/service_checks.json
@@ -11,9 +11,10 @@
         "name": "OpenStack Neutron API Up",
         "groups": [
             "host",
-            "keystone_server"
+            "keystone_server",
+            "region_id"
         ],
-        "description": "Returns `CRITICAL` if the Agent is unable to query the Neutron API, `UNKNOWN` if there is an issue with the Keystone API. Returns `OK` otherwise."
+        "description": "Returns `CRITICAL` if the Agent is unable to query the Neutron API and `UNKNOWN` if endpoint is not found in the catalog. Returns `OK` otherwise."
     },
     {
         "agent_version": "5.6.0",
@@ -27,9 +28,10 @@
         "name": "OpenStack Nova API Up",
         "groups": [
             "host",
-            "keystone_server"
+            "keystone_server",
+            "region_id"
         ],
-        "description": "Returns `CRITICAL` if the Agent is unable to query the Nova API, `UNKNOWN` if there is an issue with the Keystone API. Returns `OK` otherwise."
+        "description": "Returns `CRITICAL` if the Agent is unable to query the Nova API and `UNKNOWN` if endpoint is not found in the catalog Returns `OK` otherwise."
     },
     {
         "agent_version": "5.6.0",
@@ -42,9 +44,58 @@
         "name": "OpenStack Keystone API Up",
         "groups": [
             "host",
-            "keystone_server"
+            "keystone_server",
+            "region_id"
         ],
-        "description": "Returns `CRITICAL` if the Agent is unable to query the Keystone API. Returns `OK` otherwise."
+        "description": "Returns `CRITICAL` if the Agent is unable to query the Keystone API and `UNKNOWN` if endpoint is not found in the catalog. Returns `OK` otherwise."
+    },
+    {
+        "agent_version": "7.50.0",
+        "check": "openstack.ironic.api.up",
+        "statuses": [
+            "ok",
+            "critical"
+        ],
+        "integration": "OpenStack",
+        "name": "OpenStack Ironic API Up",
+        "groups": [
+            "host",
+            "keystone_server",
+            "region_id"
+        ],
+        "description": "Returns `CRITICAL` if the Agent is unable to query the Ironic API and `UNKNOWN` if endpoint is not found in the catalog. Returns `OK` otherwise."
+    },
+    {
+        "agent_version": "7.50.0",
+        "check": "openstack.cinder.api.up",
+        "statuses": [
+            "ok",
+            "critical"
+        ],
+        "integration": "OpenStack",
+        "name": "OpenStack Cinder API Up",
+        "groups": [
+            "host",
+            "keystone_server",
+            "region_id"
+        ],
+        "description": "Returns `CRITICAL` if the Agent is unable to query the Cinder API and `UNKNOWN` if endpoint is not found in the catalog. Returns `OK` otherwise."
+    },
+    {
+        "agent_version": "7.50.0",
+        "check": "openstack.octavia.api.up",
+        "statuses": [
+            "ok",
+            "critical"
+        ],
+        "integration": "OpenStack",
+        "name": "OpenStack Octavia API Up",
+        "groups": [
+            "host",
+            "keystone_server",
+            "region_id"
+        ],
+        "description": "Returns `CRITICAL` if the Agent is unable to query the Octavia API and `UNKNOWN` if endpoint is not found in the catalog. Returns `OK` otherwise."
     },
     {
         "agent_version": "5.6.0",
diff --git a/openstack_controller/datadog_checks/openstack_controller/__about__.py b/openstack_controller/datadog_checks/openstack_controller/__about__.py
index 56b7f4776acbd..83ebcac59b965 100644
--- a/openstack_controller/datadog_checks/openstack_controller/__about__.py
+++ b/openstack_controller/datadog_checks/openstack_controller/__about__.py
@@ -1,4 +1,4 @@
 # (C) Datadog, Inc. 2018-present
 # All rights reserved
 # Licensed under a 3-clause BSD style license (see LICENSE)
-__version__ = '5.0.0'
+__version__ = '6.0.0'
diff --git a/openstack_controller/datadog_checks/openstack_controller/api/__init__.py b/openstack_controller/datadog_checks/openstack_controller/api/__init__.py
new file mode 100644
index 0000000000000..e0cc3d0a7662c
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/api/__init__.py
@@ -0,0 +1,3 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
diff --git a/openstack_controller/datadog_checks/openstack_controller/api/api.py b/openstack_controller/datadog_checks/openstack_controller/api/api.py
new file mode 100644
index 0000000000000..f00895a3603f2
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/api/api.py
@@ -0,0 +1,99 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+from abc import ABC, abstractmethod
+
+
+class Api(ABC):
+    @abstractmethod
+    def auth_url(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def has_admin_role(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def authorize_user(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def authorize_system(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def authorize_project(self, project_id):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_identity_domains(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_identity_projects(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_identity_users(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_identity_groups(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_identity_group_users(self, group_id):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_identity_services(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_identity_limits(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_auth_projects(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_compute_limits(self, project_id):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_compute_quota_sets(self, project_id):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_compute_services(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_compute_servers(self, project_id):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_compute_flavors(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_compute_hypervisors(self, project, collect_hypervisor_load):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_network_quota(self, project):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_network_agents(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_baremetal_conductors(self):
+        pass  # pragma: no cover
+
+    @abstractmethod
+    def get_baremetal_nodes(self):
+        pass  # pragma: no cover
diff --git a/openstack_controller/datadog_checks/openstack_controller/api/api_rest.py b/openstack_controller/datadog_checks/openstack_controller/api/api_rest.py
new file mode 100644
index 0000000000000..f6924ea44b909
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/api/api_rest.py
@@ -0,0 +1,419 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+from datadog_checks.openstack_controller.api.api import Api
+from datadog_checks.openstack_controller.api.catalog import Catalog
+from datadog_checks.openstack_controller.components.component import Component
+
+
+class ApiRest(Api):
+    def __init__(self, config, logger, http):
+        super(ApiRest, self).__init__()
+        self.log = logger
+        self.config = config
+        self.http = http
+        self._add_microversion_headers()
+
+        self._interface = self.config.endpoint_interface if self.config.endpoint_interface else 'public'
+        self._region_id = self.config.endpoint_region_id
+        self._catalog = None
+        self._current_project_id = None
+        self._role_names = None
+
+    def auth_url(self):
+        return self.config.keystone_server_url
+
+    def has_admin_role(self):
+        return 'admin' in self._role_names
+
+    def component_in_catalog(self, component_types):
+        return self._catalog.has_component(component_types)
+
+    def get_response_time(self, endpoint_types):
+        endpoint = (
+            self._catalog.get_endpoint_by_type(endpoint_types).replace(self._current_project_id, "")
+            if self._current_project_id
+            else self._catalog.get_endpoint_by_type(endpoint_types)
+        )
+        response = self.http.get(endpoint)
+        response.raise_for_status()
+        return response.elapsed.total_seconds() * 1000
+
+    def get_auth_projects(self):
+        response = self.http.get('{}/v3/auth/projects'.format(self.config.keystone_server_url))
+        response.raise_for_status()
+        return response.json().get('projects', [])
+
+    def authorize_user(self):
+        data = {
+            "auth": {
+                "identity": {
+                    "methods": ["password"],
+                    "password": {
+                        "user": {
+                            "name": self.config.username,
+                            "password": self.config.password,
+                            "domain": {"id": self.config.domain_id},
+                        }
+                    },
+                },
+            }
+        }
+        # Testing purposes (we need this header to redirect requests correctly with caddy)
+        self.http.options['headers']['X-Auth-Type'] = "unscoped"
+        self._authorize_data(data)
+        self._current_project_id = None
+
+    def authorize_system(self):
+        data = {
+            "auth": {
+                "identity": {
+                    "methods": ["password"],
+                    "password": {
+                        "user": {
+                            "name": self.config.username,
+                            "password": self.config.password,
+                            "domain": {"id": self.config.domain_id},
+                        }
+                    },
+                },
+                "scope": {"system": {"all": True}},
+            }
+        }
+        # Testing purposes (we need this header to redirect requests correctly with caddy)
+        self.http.options['headers']['X-Auth-Type'] = "system"
+        self._authorize_data(data)
+        self._current_project_id = None
+
+    def authorize_project(self, project_id):
+        data = {
+            "auth": {
+                "identity": {
+                    "methods": ["password"],
+                    "password": {
+                        "user": {
+                            "name": self.config.username,
+                            "password": self.config.password,
+                            "domain": {"id": self.config.domain_id},
+                        }
+                    },
+                },
+                "scope": {"project": {"id": project_id}},
+            }
+        }
+        # Testing purposes (we need this header to redirect requests correctly with caddy)
+        self.http.options['headers']['X-Auth-Type'] = project_id
+        self._authorize_data(data)
+        self._current_project_id = project_id
+
+    def _authorize_data(self, data):
+        self.log.debug("creating auth token")
+        response = self.http.post('{}/v3/auth/tokens'.format(self.config.keystone_server_url), json=data)
+        response.raise_for_status()
+        response_json = response.json()
+        self.log.debug("response: %s", response_json)
+        self._catalog = Catalog(
+            response_json.get('token', {}).get('catalog', []),
+            self._interface,
+            self._region_id,
+        )
+        self._role_names = [role.get('name') for role in response_json.get('token', {}).get('roles', [])]
+        self.http.options['headers']['X-Auth-Token'] = response.headers['X-Subject-Token']
+
+    def _add_microversion_headers(self):
+        if self.config.nova_microversion:
+            self.log.debug("adding X-OpenStack-Nova-API-Version header to `%s`", self.config.nova_microversion)
+            self.http.options['headers']['X-OpenStack-Nova-API-Version'] = self.config.nova_microversion
+
+        if self.config.ironic_microversion:
+            self.log.debug("adding X-OpenStack-Ironic-API-Version header to `%s`", self.config.ironic_microversion)
+            self.http.options['headers']['X-OpenStack-Ironic-API-Version'] = self.config.ironic_microversion
+
+    def get_identity_regions(self):
+        response = self.http.get(
+            '{}/v3/regions'.format(self._catalog.get_endpoint_by_type(Component.Types.IDENTITY.value))
+        )
+        response.raise_for_status()
+        return response.json().get('regions', [])
+
+    def get_identity_domains(self):
+        response = self.http.get(
+            '{}/v3/domains'.format(self._catalog.get_endpoint_by_type(Component.Types.IDENTITY.value))
+        )
+        response.raise_for_status()
+        return response.json().get('domains', [])
+
+    def get_identity_projects(self):
+        response = self.http.get(
+            '{}/v3/projects'.format(self._catalog.get_endpoint_by_type(Component.Types.IDENTITY.value))
+        )
+        response.raise_for_status()
+        return response.json().get('projects', [])
+
+    def get_identity_users(self):
+        response = self.http.get(
+            '{}/v3/users'.format(self._catalog.get_endpoint_by_type(Component.Types.IDENTITY.value))
+        )
+        response.raise_for_status()
+        return response.json().get('users', [])
+
+    def get_identity_groups(self):
+        response = self.http.get(
+            '{}/v3/groups'.format(self._catalog.get_endpoint_by_type(Component.Types.IDENTITY.value))
+        )
+        response.raise_for_status()
+        return response.json().get('groups', [])
+
+    def get_identity_group_users(self, group_id):
+        response = self.http.get(
+            '{}/v3/groups/{}/users'.format(self._catalog.get_endpoint_by_type(Component.Types.IDENTITY.value), group_id)
+        )
+        response.raise_for_status()
+        return response.json().get('users', [])
+
+    def get_identity_services(self):
+        response = self.http.get(
+            '{}/v3/services'.format(self._catalog.get_endpoint_by_type(Component.Types.IDENTITY.value))
+        )
+        response.raise_for_status()
+        return response.json().get('services', [])
+
+    def get_identity_registered_limits(self):
+        response = self.http.get(
+            '{}/v3/registered_limits'.format(self._catalog.get_endpoint_by_type(Component.Types.IDENTITY.value))
+        )
+        response.raise_for_status()
+        return response.json().get('registered_limits', [])
+
+    def get_identity_limits(self):
+        response = self.http.get(
+            '{}/v3/limits'.format(self._catalog.get_endpoint_by_type(Component.Types.IDENTITY.value))
+        )
+        response.raise_for_status()
+        return response.json().get('limits', [])
+
+    def get_compute_limits(self, project_id):
+        response = self.http.get(
+            '{}/limits?tenant_id={}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.COMPUTE.value), project_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('limits', {})
+
+    def get_compute_aggregates(self):
+        response = self.http.get(
+            '{}/os-aggregates'.format(self._catalog.get_endpoint_by_type(Component.Types.COMPUTE.value))
+        )
+        response.raise_for_status()
+        return response.json().get('aggregates', [])
+
+    def get_compute_quota_sets(self, project_id):
+        response = self.http.get(
+            '{}/os-quota-sets/{}'.format(self._catalog.get_endpoint_by_type(Component.Types.COMPUTE.value), project_id)
+        )
+        response.raise_for_status()
+        return response.json().get('quota_set', {})
+
+    def get_compute_servers(self, project_id):
+        response = self.http.get(
+            '{}/servers/detail?project_id={}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.COMPUTE.value), project_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('servers', [])
+
+    def get_compute_server_diagnostics(self, server_id):
+        response = self.http.get(
+            '{}/servers/{}/diagnostics'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.COMPUTE.value), server_id
+            )
+        )
+        response.raise_for_status()
+        return response.json()
+
+    def get_compute_flavor(self, flavor_id):
+        response = self.http.get(
+            '{}/flavors/{}'.format(self._catalog.get_endpoint_by_type(Component.Types.COMPUTE.value), flavor_id)
+        )
+        response.raise_for_status()
+        return response.json().get('flavor', {})
+
+    def get_compute_services(self):
+        response = self.http.get(
+            '{}/os-services'.format(self._catalog.get_endpoint_by_type(Component.Types.COMPUTE.value))
+        )
+        response.raise_for_status()
+        return response.json().get('services', [])
+
+    def get_compute_flavors(self):
+        response = self.http.get(
+            '{}/flavors/detail'.format(self._catalog.get_endpoint_by_type(Component.Types.COMPUTE.value))
+        )
+        response.raise_for_status()
+        return response.json().get('flavors', [])
+
+    def get_compute_hypervisors(self):
+        response = self.http.get(
+            '{}/os-hypervisors/detail'.format(self._catalog.get_endpoint_by_type(Component.Types.COMPUTE.value))
+        )
+        response.raise_for_status()
+        return response.json().get('hypervisors', [])
+
+    def get_compute_hypervisor_uptime(self, hypervisor_id):
+        response = self.http.get(
+            '{}/os-hypervisors/{}/uptime'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.COMPUTE.value), hypervisor_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('hypervisor', {})
+
+    def get_network_agents(self):
+        response = self.http.get(
+            '{}/v2.0/agents'.format(self._catalog.get_endpoint_by_type(Component.Types.NETWORK.value))
+        )
+        response.raise_for_status()
+        return response.json().get('agents', [])
+
+    def get_network_networks(self, project_id):
+        response = self.http.get(
+            '{}/v2.0/networks?project_id={}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.NETWORK.value), project_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('networks', [])
+
+    def get_network_quota(self, project_id):
+        response = self.http.get(
+            '{}/v2.0/quotas/{}'.format(self._catalog.get_endpoint_by_type(Component.Types.NETWORK.value), project_id)
+        )
+        response.raise_for_status()
+        return response.json().get('quota', [])
+
+    def get_baremetal_nodes(self):
+        def use_legacy_nodes_resource(microversion):
+            self.log.debug("Configured ironic microversion: %s", microversion)
+            if not microversion:
+                return True
+            legacy_microversion = True
+            try:
+                legacy_microversion = float(microversion) < 1.43
+            except Exception as e:
+                if microversion.lower() == 'latest':
+                    legacy_microversion = False
+                else:
+                    raise Exception(f"Invalid ironic microversion, cannot collect baremetal nodes: {str(e)}")
+            self.log.debug("Collecting baremetal nodes with use_legacy_nodes_resource =%s", legacy_microversion)
+            return legacy_microversion
+
+        self.log.debug("getting baremetal nodes [microversion=%s]", self.config.ironic_microversion)
+        response = self.http.get(
+            '{}/v1/{}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.BAREMETAL.value),
+                ('nodes/detail' if use_legacy_nodes_resource(self.config.ironic_microversion) else 'nodes?detail=True'),
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('nodes', [])
+
+    def get_baremetal_conductors(self):
+        response = self.http.get(
+            '{}/v1/conductors'.format(self._catalog.get_endpoint_by_type(Component.Types.BAREMETAL.value))
+        )
+        response.raise_for_status()
+        return response.json().get('conductors', [])
+
+    def get_load_balancer_loadbalancers(self, project_id):
+        response = self.http.get(
+            '{}/v2/lbaas/loadbalancers?project_id={}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), project_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('loadbalancers', [])
+
+    def get_load_balancer_loadbalancer_stats(self, loadbalancer_id):
+        response = self.http.get(
+            '{}/v2/lbaas/loadbalancers/{}/stats'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), loadbalancer_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('stats', {})
+
+    def get_load_balancer_listeners(self, project_id):
+        response = self.http.get(
+            '{}/v2/lbaas/listeners?project_id={}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), project_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('listeners', [])
+
+    def get_load_balancer_listener_stats(self, listener_id):
+        response = self.http.get(
+            '{}/v2/lbaas/listeners/{}/stats'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), listener_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('stats', {})
+
+    def get_load_balancer_pools(self, project_id):
+        response = self.http.get(
+            '{}/v2/lbaas/pools?project_id={}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), project_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('pools', [])
+
+    def get_load_balancer_pool_members(self, pool_id, project_id):
+        response = self.http.get(
+            '{}/v2/lbaas/pools/{}/members?project_id={}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), pool_id, project_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('members', [])
+
+    def get_load_balancer_healthmonitors(self, project_id):
+        response = self.http.get(
+            '{}/v2/lbaas/healthmonitors?project_id={}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), project_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('healthmonitors', [])
+
+    def get_load_balancer_quotas(self, project_id):
+        response = self.http.get(
+            '{}/v2/lbaas/quotas?project_id={}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), project_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('quotas', [])
+
+    def get_load_balancer_amphorae(self, project_id):
+        response = self.http.get(
+            '{}/v2/octavia/amphorae?project_id={}'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), project_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('amphorae', [])
+
+    def get_load_balancer_amphora_stats(self, amphora_id):
+        response = self.http.get(
+            '{}/v2/octavia/amphorae/{}/stats'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), amphora_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('amphora_stats', [])
diff --git a/openstack_controller/datadog_checks/openstack_controller/api/api_sdk.py b/openstack_controller/datadog_checks/openstack_controller/api/api_sdk.py
new file mode 100644
index 0000000000000..d65a28d64f4ef
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/api/api_sdk.py
@@ -0,0 +1,268 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+from os import environ
+
+from keystoneauth1 import session
+from keystoneauth1.identity import v3
+from openstack import connection
+from openstack.config import loader
+
+from datadog_checks.openstack_controller.api.api import Api
+from datadog_checks.openstack_controller.api.catalog import Catalog
+from datadog_checks.openstack_controller.components.component import Component
+from datadog_checks.openstack_controller.defaults import DEFAULT_DOMAIN_ID
+
+
+class ApiSdk(Api):
+    def __init__(self, config, logger, http):
+        super(ApiSdk, self).__init__()
+        self.log = logger
+        self.config = config
+        self.http = http
+        self._add_microversion_headers()
+
+        # Set the environment variable to the path of the config file for openstacksdk to find it
+        environ["OS_CLIENT_CONFIG_FILE"] = self.config.openstack_config_file_path
+        self.cloud_config = loader.OpenStackConfig(config_files=[self.config.openstack_config_file_path]).get_one_cloud(
+            cloud=self.config.openstack_cloud_name
+        )
+        self._interface = (
+            self.config.endpoint_interface
+            if self.config.endpoint_interface
+            else self.cloud_config.get_auth_args().get('interface', 'public')
+        )
+        self._region_id = (
+            self.config.endpoint_region_id
+            if self.config.endpoint_region_id
+            else self.cloud_config.get_auth_args().get('region_name')
+        )
+
+        self.connection = None
+        self._access = None
+        self._catalog = None
+
+    def _add_microversion_headers(self):
+        if self.config.nova_microversion:
+            self.log.debug("adding X-OpenStack-Nova-API-Version header to `%s`", self.config.nova_microversion)
+            self.http.options['headers']['X-OpenStack-Nova-API-Version'] = self.config.nova_microversion
+
+        if self.config.ironic_microversion:
+            self.log.debug("adding X-OpenStack-Ironic-API-Version header to `%s`", self.config.ironic_microversion)
+            self.http.options['headers']['X-OpenStack-Ironic-API-Version'] = self.config.ironic_microversion
+
+    def auth_url(self):
+        return self.cloud_config.get_auth_args().get('auth_url')
+
+    def has_admin_role(self):
+        return 'admin' in self._access.role_names
+
+    def component_in_catalog(self, component_types):
+        return self._catalog.has_component(component_types)
+
+    def authorize_user(self):
+        v3_auth = v3.Password(
+            auth_url=self.cloud_config.get_auth_args().get('auth_url'),
+            username=self.cloud_config.get_auth_args().get('username'),
+            password=self.cloud_config.get_auth_args().get('password'),
+            user_domain_name=self.cloud_config.get_auth_args().get('user_domain_name', DEFAULT_DOMAIN_ID),
+        )
+        keystone_session = session.Session(auth=v3_auth, session=self.http.session)
+        self.connection = connection.Connection(
+            cloud=self.config.openstack_cloud_name, session=keystone_session, region_name=self._region_id
+        )
+        self._access = self.connection.session.auth.get_access(self.connection.session)
+        self._catalog = Catalog(self._access.service_catalog.catalog, self._interface, self._region_id)
+        self.connection.authorize()
+        self.http.options['headers']['X-Auth-Token'] = self.connection.session.auth.get_token(self.connection.session)
+
+    def authorize_system(self):
+        v3_auth = v3.Password(
+            auth_url=self.cloud_config.get_auth_args().get('auth_url'),
+            username=self.cloud_config.get_auth_args().get('username'),
+            password=self.cloud_config.get_auth_args().get('password'),
+            user_domain_name=self.cloud_config.get_auth_args().get('user_domain_name', DEFAULT_DOMAIN_ID),
+            system_scope="all",
+        )
+        keystone_session = session.Session(auth=v3_auth, session=self.http.session)
+        self.connection = connection.Connection(
+            cloud=self.config.openstack_cloud_name, session=keystone_session, region_name=self._region_id
+        )
+        self._access = self.connection.session.auth.get_access(self.connection.session)
+        self._catalog = Catalog(self._access.service_catalog.catalog, self._interface, self._region_id)
+        self.connection.authorize()
+        self.http.options['headers']['X-Auth-Token'] = self.connection.session.auth.get_token(self.connection.session)
+
+    def authorize_project(self, project_id):
+        v3_auth = v3.Password(
+            auth_url=self.cloud_config.get_auth_args().get('auth_url'),
+            username=self.cloud_config.get_auth_args().get('username'),
+            password=self.cloud_config.get_auth_args().get('password'),
+            user_domain_name=self.cloud_config.get_auth_args().get('user_domain_name', DEFAULT_DOMAIN_ID),
+            project_id=project_id,
+            project_domain_name=self.cloud_config.get_auth_args().get('project_domain_name', DEFAULT_DOMAIN_ID),
+        )
+        keystone_session = session.Session(auth=v3_auth, session=self.http.session)
+        self.connection = connection.Connection(
+            cloud=self.config.openstack_cloud_name, session=keystone_session, region_name=self._region_id
+        )
+        self._access = self.connection.session.auth.get_access(self.connection.session)
+        self._catalog = Catalog(self._access.service_catalog.catalog, self._interface, self._region_id)
+        self.connection.authorize()
+        self.http.options['headers']['X-Auth-Token'] = self.connection.session.auth.get_token(self.connection.session)
+
+    def get_response_time(self, endpoint_types):
+        endpoint = self._catalog.get_endpoint_by_type(endpoint_types)
+        endpoint = endpoint.replace(self._access.project_id, "") if self._access.project_id else endpoint
+        response = self.http.get(endpoint)
+        response.raise_for_status()
+        return response.elapsed.total_seconds() * 1000
+
+    def get_identity_regions(self):
+        return [region.to_dict(original_names=True) for region in self.connection.identity.regions()]
+
+    def get_identity_domains(self):
+        return [domain.to_dict(original_names=True) for domain in self.connection.identity.domains()]
+
+    def get_identity_projects(self):
+        return [project.to_dict(original_names=True) for project in self.connection.identity.projects()]
+
+    def get_identity_users(self):
+        return [user.to_dict(original_names=True) for user in self.connection.identity.users()]
+
+    def get_identity_groups(self):
+        return [group.to_dict(original_names=True) for group in self.connection.identity.groups()]
+
+    def get_identity_group_users(self, group_id):
+        return [user.to_dict(original_names=True) for user in self.connection.identity.group_users(group_id)]
+
+    def get_identity_services(self):
+        return [service.to_dict(original_names=True) for service in self.connection.identity.services()]
+
+    def get_identity_registered_limits(self):
+        return [
+            registered_limit.to_dict(original_names=True)
+            for registered_limit in self.connection.identity.registered_limits()
+        ]
+
+    def get_identity_limits(self):
+        return [limit.to_dict(original_names=True) for limit in self.connection.identity.limits()]
+
+    def get_compute_limits(self, project_id):
+        return self.connection.compute.get_limits(tenant_id=project_id).to_dict(original_names=True)
+
+    def get_compute_aggregates(self):
+        return [aggregate.to_dict(original_names=True) for aggregate in self.connection.compute.aggregates()]
+
+    def get_compute_services(self):
+        return [service.to_dict(original_names=True) for service in self.connection.compute.services()]
+
+    def get_compute_flavors(self):
+        return [flavor.to_dict(original_names=True) for flavor in self.connection.compute.flavors(details=True)]
+
+    def get_compute_hypervisors(self):
+        return [
+            hypervisor.to_dict(original_names=True) for hypervisor in self.connection.compute.hypervisors(details=True)
+        ]
+
+    def get_compute_hypervisor_uptime(self, hypervisor_id):
+        return self.connection.compute.get_hypervisor_uptime(
+            hypervisor_id,
+        ).to_dict(original_names=True)
+
+    def get_compute_quota_sets(self, project_id):
+        return self.connection.compute.get_quota_set(
+            project_id,
+        ).to_dict(original_names=True)
+
+    def get_compute_servers(self, project_id):
+        return [
+            server.to_dict(original_names=True)
+            for server in self.connection.compute.servers(
+                details=True,
+                project_id=project_id,
+            )
+        ]
+
+    def get_compute_server_diagnostics(self, server_id):
+        return self.connection.compute.get_server_diagnostics(server_id).to_dict(original_names=True)
+
+    def get_compute_flavor(self, flavor_id):
+        return self.connection.compute.get_flavor(flavor_id).to_dict(original_names=True)
+
+    def get_network_agents(self):
+        return [agent.to_dict(original_names=True) for agent in self.connection.network.agents()]
+
+    def get_network_networks(self, project_id):
+        return [
+            network.to_dict(original_names=True) for network in self.connection.network.networks(project_id=project_id)
+        ]
+
+    def get_network_quota(self, project_id):
+        return self.connection.network.get_quota(project_id, details=True).to_dict(original_names=True)
+
+    def get_baremetal_nodes(self):
+        return [node.to_dict(original_names=True) for node in self.connection.baremetal.nodes(details=True)]
+
+    def get_baremetal_conductors(self):
+        return [conductor.to_dict(original_names=True) for conductor in self.connection.baremetal.conductors()]
+
+    def get_auth_projects(self):
+        response = self.http.get('{}/v3/auth/projects'.format(self.cloud_config.get_auth_args().get('auth_url')))
+        response.raise_for_status()
+        return response.json().get('projects', [])
+
+    def get_load_balancer_loadbalancers(self, project_id):
+        return [
+            load_balancer.to_dict(original_names=True)
+            for load_balancer in self.connection.load_balancer.load_balancers(project_id=project_id)
+        ]
+
+    def get_load_balancer_loadbalancer_stats(self, loadbalancer_id):
+        return self.connection.load_balancer.get_load_balancer_statistics(loadbalancer_id).to_dict(original_names=True)
+
+    def get_load_balancer_listeners(self, project_id):
+        return [
+            listener.to_dict(original_names=True)
+            for listener in self.connection.load_balancer.listeners(project_id=project_id)
+        ]
+
+    def get_load_balancer_listener_stats(self, listener_id):
+        return self.connection.load_balancer.get_listener_statistics(listener_id).to_dict(original_names=True)
+
+    def get_load_balancer_pools(self, project_id):
+        return [
+            pool.to_dict(original_names=True) for pool in self.connection.load_balancer.pools(project_id=project_id)
+        ]
+
+    def get_load_balancer_pool_members(self, pool_id, project_id):
+        return [
+            member.to_dict(original_names=True)
+            for member in self.connection.load_balancer.members(pool_id, project_id=project_id)
+        ]
+
+    def get_load_balancer_healthmonitors(self, project_id):
+        return [
+            healthmonitor.to_dict(original_names=True)
+            for healthmonitor in self.connection.load_balancer.health_monitors(project_id=project_id)
+        ]
+
+    def get_load_balancer_quotas(self, project_id):
+        return [
+            quota.to_dict(original_names=True) for quota in self.connection.load_balancer.quotas(project_id=project_id)
+        ]
+
+    def get_load_balancer_amphorae(self, project_id):
+        return [
+            amphora.to_dict(original_names=True)
+            for amphora in self.connection.load_balancer.amphorae(project_id=project_id)
+        ]
+
+    def get_load_balancer_amphora_stats(self, amphora_id):
+        response = self.http.get(
+            '{}/v2/octavia/amphorae/{}/stats'.format(
+                self._catalog.get_endpoint_by_type(Component.Types.LOAD_BALANCER.value), amphora_id
+            )
+        )
+        response.raise_for_status()
+        return response.json().get('amphora_stats', [])
diff --git a/openstack_controller/datadog_checks/openstack_controller/api/catalog.py b/openstack_controller/datadog_checks/openstack_controller/api/catalog.py
new file mode 100644
index 0000000000000..ae21a48832ca0
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/api/catalog.py
@@ -0,0 +1,41 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+class CatalogEndPointFailure(Exception):
+    def __init__(self, service_types, interface, region_id):
+        self.message = (
+            f'No endpoint found in catalog for services={service_types} interface={interface} region_id={region_id}'
+        )
+        super().__init__(self.message)
+
+
+class Catalog:
+    def __init__(self, catalog, endpoint_interface, endpoint_region_id):
+        self.catalog = catalog
+        self.endpoint_interface = endpoint_interface
+        self.endpoint_region_id = endpoint_region_id
+
+    def has_component(self, component_types):
+        for service in self.catalog:
+            if service['type'] in component_types:
+                return True
+        return False
+
+    def get_endpoint_by_type(self, service_types):
+        for service_type in service_types:
+            for service in self.catalog:
+                if service.get('type') == service_type:
+                    for endpoint in service.get('endpoints', []):
+                        endpoint_interface = endpoint.get('interface')
+                        endpoint_region_id = endpoint.get('region_id')
+                        matched_interface = (
+                            endpoint_interface == 'public'
+                            if not self.endpoint_interface
+                            else endpoint_interface == self.endpoint_interface
+                        )
+                        matched_region_id = not self.endpoint_region_id or endpoint_region_id == self.endpoint_region_id
+                        if matched_interface and matched_region_id:
+                            return endpoint['url']
+        raise CatalogEndPointFailure(service_types, self.endpoint_interface, self.endpoint_region_id)
diff --git a/openstack_controller/datadog_checks/openstack_controller/api/factory.py b/openstack_controller/datadog_checks/openstack_controller/api/factory.py
new file mode 100644
index 0000000000000..7e65f2833c88b
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/api/factory.py
@@ -0,0 +1,19 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+from datadog_checks.openstack_controller.api.api import Api
+from datadog_checks.openstack_controller.api.api_rest import ApiRest
+from datadog_checks.openstack_controller.api.api_sdk import ApiSdk
+from datadog_checks.openstack_controller.api.type import ApiType
+
+apis = {
+    ApiType.REST: lambda config, logger, http: ApiRest(config, logger, http),
+    ApiType.SDK: lambda config, logger, http: ApiSdk(config, logger, http),
+}
+
+
+def make_api(config, logger, http) -> Api:
+    logger.debug('creating api object of type `%s`', config.api_type.name)
+    return apis[config.api_type](config, logger, http)
diff --git a/openstack_controller/datadog_checks/openstack_controller/api/type.py b/openstack_controller/datadog_checks/openstack_controller/api/type.py
new file mode 100644
index 0000000000000..1ebae5b1bd1eb
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/api/type.py
@@ -0,0 +1,9 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+from enum import Enum
+
+
+class ApiType(Enum):
+    SDK = 1
+    REST = 2
diff --git a/openstack_controller/datadog_checks/openstack_controller/components/bare_metal.py b/openstack_controller/datadog_checks/openstack_controller/components/bare_metal.py
new file mode 100644
index 0000000000000..5c0266870e6a6
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/components/bare_metal.py
@@ -0,0 +1,105 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+from datadog_checks.base.utils.discovery import Discovery
+from datadog_checks.openstack_controller.components.component import Component
+from datadog_checks.openstack_controller.config import normalize_discover_config_include
+from datadog_checks.openstack_controller.metrics import (
+    IRONIC_CONDUCTOR_COUNT,
+    IRONIC_CONDUCTOR_METRICS,
+    IRONIC_CONDUCTOR_METRICS_PREFIX,
+    IRONIC_CONDUCTOR_TAGS,
+    IRONIC_NODE_COUNT,
+    IRONIC_NODE_METRICS,
+    IRONIC_NODE_METRICS_PREFIX,
+    IRONIC_NODE_TAGS,
+    IRONIC_RESPONSE_TIME,
+    IRONIC_SERVICE_CHECK,
+    get_metrics_and_tags,
+)
+
+
+class BareMetal(Component):
+    ID = Component.Id.BAREMETAL
+    TYPES = Component.Types.BAREMETAL
+    SERVICE_CHECK = IRONIC_SERVICE_CHECK
+
+    def __init__(self, check):
+        super(BareMetal, self).__init__(check)
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error(report_service_check=True)
+    def _report_response_time(self, global_components_config, tags):
+        self.check.log.debug("reporting `%s` response time", BareMetal.ID.value)
+        response_time = self.check.api.get_response_time(BareMetal.TYPES.value)
+        self.check.log.debug("`%s` response time: %s", BareMetal.ID.value, response_time)
+        self.check.gauge(IRONIC_RESPONSE_TIME, response_time, tags=tags)
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_nodes(self, config, tags):
+        report_nodes = True
+        config_nodes = config.get('nodes', {})
+        if isinstance(config_nodes, bool):
+            report_nodes = config_nodes
+            config_nodes = {}
+        if report_nodes:
+            nodes_discovery = None
+            if config_nodes:
+                config_nodes_include = normalize_discover_config_include(config_nodes, ["name"])
+                self.check.log.debug("config_nodes_include: %s", config_nodes_include)
+                if config_nodes_include:
+                    nodes_discovery = Discovery(
+                        lambda: self.check.api.get_baremetal_nodes(),
+                        limit=config_nodes.get('limit'),
+                        include=config_nodes_include,
+                        exclude=config_nodes.get('exclude'),
+                        interval=config_nodes.get('interval'),
+                        key=lambda server: server.get('name'),
+                    )
+            if nodes_discovery:
+                discovered_nodes = list(nodes_discovery.get_items())
+            else:
+                discovered_nodes = [
+                    (None, node.get('name'), node, None) for node in self.check.api.get_baremetal_nodes()
+                ]
+        for _pattern, _item_name, item, item_config in discovered_nodes:
+            self.check.log.debug("item: %s", item)
+            self.check.log.debug("item_config: %s", item_config)
+            node = get_metrics_and_tags(
+                item,
+                tags=IRONIC_NODE_TAGS,
+                prefix=IRONIC_NODE_METRICS_PREFIX,
+                metrics=IRONIC_NODE_METRICS,
+                lambda_name=lambda key: 'up' if key == 'power_state' else key,
+                lambda_value=lambda key, value, item=item: (
+                    item.get('power_state') == 'power on' and item.get('maintenance') is False
+                )
+                if key == 'power_state'
+                else value,
+            )
+            self.check.log.debug("node: %s", node)
+            self.check.gauge(IRONIC_NODE_COUNT, 1, tags=tags + node['tags'], hostname=item['uuid'])
+            for metric, value in node['metrics'].items():
+                self.check.gauge(metric, value, tags=tags + node['tags'], hostname=item['uuid'])
+            self.check.external_tags.append((item['uuid'], {'openstack': ['host_type:baremetal']}))
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_conductors(self, config, tags):
+        report_conductors = config.get('conductors', True)
+        if report_conductors:
+            data = self.check.api.get_baremetal_conductors()
+            for item in data:
+                conductor = get_metrics_and_tags(
+                    item,
+                    tags=IRONIC_CONDUCTOR_TAGS,
+                    prefix=IRONIC_CONDUCTOR_METRICS_PREFIX,
+                    metrics=IRONIC_CONDUCTOR_METRICS,
+                    lambda_name=lambda key: 'up' if key == 'alive' else key,
+                )
+                self.check.log.debug("conductor: %s", conductor)
+                self.check.gauge(IRONIC_CONDUCTOR_COUNT, 1, tags=tags + conductor['tags'])
+                for metric, value in conductor['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + conductor['tags'])
diff --git a/openstack_controller/datadog_checks/openstack_controller/components/block_storage.py b/openstack_controller/datadog_checks/openstack_controller/components/block_storage.py
new file mode 100644
index 0000000000000..7f6e144440b74
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/components/block_storage.py
@@ -0,0 +1,27 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+from datadog_checks.openstack_controller.components.component import Component
+from datadog_checks.openstack_controller.metrics import (
+    CINDER_RESPONSE_TIME,
+    CINDER_SERVICE_CHECK,
+)
+
+
+class BlockStorage(Component):
+    ID = Component.Id.BLOCK_STORAGE
+    TYPES = Component.Types.BLOCK_STORAGE
+    SERVICE_CHECK = CINDER_SERVICE_CHECK
+
+    def __init__(self, check):
+        super(BlockStorage, self).__init__(check)
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error(report_service_check=True)
+    def _report_response_time(self, global_components_config, tags):
+        self.check.log.debug("reporting `%s` response time", BlockStorage.ID.value)
+        response_time = self.check.api.get_response_time(BlockStorage.TYPES.value)
+        self.check.log.debug("`%s` response time: %s", BlockStorage.ID.value, response_time)
+        self.check.gauge(CINDER_RESPONSE_TIME, response_time, tags=tags)
diff --git a/openstack_controller/datadog_checks/openstack_controller/components/component.py b/openstack_controller/datadog_checks/openstack_controller/components/component.py
new file mode 100644
index 0000000000000..e105e3bf18171
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/components/component.py
@@ -0,0 +1,157 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+import inspect
+from enum import Enum, unique
+from functools import wraps
+
+from requests.exceptions import HTTPError
+
+from datadog_checks.base import AgentCheck
+
+
+def argument_value(arg_name, func, *args, **kwargs):
+    # Get the position of target_arg in function's signature
+    params = list(inspect.signature(func).parameters)
+    try:
+        position = params.index(arg_name) - (1 if 'self' in params else 0)
+    except ValueError:
+        position = None
+    # If argument passed positionally
+    if position is not None and position < len(args):
+        return args[position]
+    # If argument passed by name
+    elif arg_name in kwargs:
+        return kwargs[arg_name]
+    return None
+
+
+def generate_hash(func, *args, **kwargs):
+    name = func.__name__
+    args_str = ','.join(map(str, args))
+    kwargs_str = ','.join(f"{k}={v}" for k, v in sorted(kwargs.items()))
+    combined = f"{name}({args_str},{kwargs_str})"
+    return hash(combined)
+
+
+class Component:
+    registered_global_metric_methods = {}
+    registered_project_metric_methods = {}
+
+    @unique
+    class Id(str, Enum):
+        IDENTITY = 'identity'
+        COMPUTE = 'compute'
+        NETWORK = 'network'
+        BLOCK_STORAGE = 'block-storage'
+        BAREMETAL = 'baremetal'
+        LOAD_BALANCER = 'load-balancer'
+
+    @unique
+    class Types(list, Enum):
+        IDENTITY = ['identity']
+        COMPUTE = ['compute']
+        NETWORK = ['network']
+        BLOCK_STORAGE = ['block-storage', 'volumev3']
+        BAREMETAL = ['baremetal']
+        LOAD_BALANCER = ['load-balancer']
+
+    def http_error(report_service_check=False):
+        def decorator_http_error(func):
+            @wraps(func)  # Preserve function metadata
+            def wrapper(self, *args, **kwargs):
+                if report_service_check:
+                    tags = argument_value('tags', func, *args, **kwargs)
+                try:
+                    result = func(self, *args, **kwargs)
+                    if report_service_check:
+                        tags = argument_value('tags', func, *args, **kwargs)
+                        self.check.service_check(self.SERVICE_CHECK, AgentCheck.OK, tags=tags)
+                    return result if result is not None else True
+                except HTTPError as e:
+                    self.check.log.error("HTTPError: %s", e.response)
+                    if report_service_check:
+                        self.check.service_check(self.SERVICE_CHECK, AgentCheck.CRITICAL, tags=tags)
+                except Exception as e:
+                    self.check.log.error("Exception: %s", e)
+                return None
+
+            return wrapper
+
+        return decorator_http_error
+
+    @classmethod
+    def register_global_metrics(cls, component_id):
+        def decorator_register_metrics_method(func):
+            @wraps(func)  # Preserve function metadata
+            def wrapper(self, *args, **kwargs):
+                func_hash = generate_hash(func, *args, **kwargs)
+                if func_hash not in self.reported_global_metrics:
+                    if func(self, *args, **kwargs):
+                        self.reported_global_metrics.append(func_hash)
+
+            if component_id not in cls.registered_global_metric_methods:
+                cls.registered_global_metric_methods[component_id] = []
+            cls.registered_global_metric_methods[component_id].append(wrapper)
+            return wrapper
+
+        return decorator_register_metrics_method
+
+    @classmethod
+    def register_project_metrics(cls, component_id):
+        def decorator_register_metrics_method(func):
+            @wraps(func)  # Preserve function metadata
+            def wrapper(self, *args, **kwargs):
+                func_hash = generate_hash(func, *args, **kwargs)
+                if func_hash not in self.reported_project_metrics:
+                    if func(self, *args, **kwargs):
+                        self.reported_project_metrics.append(func_hash)
+
+            if component_id not in cls.registered_project_metric_methods:
+                cls.registered_project_metric_methods[component_id] = []
+            cls.registered_project_metric_methods[component_id].append(wrapper)
+            return wrapper
+
+        return decorator_register_metrics_method
+
+    def __init__(self, check):
+        self.check = check
+        self.found_in_catalog = False
+        self.reported_global_metrics = []
+        self.reported_project_metrics = []
+        self.check.log.debug("created `%s` component", self.ID.value)
+
+    def start_report(self):
+        self.found_in_catalog = False
+        self.reported_global_metrics.clear()
+        self.reported_project_metrics.clear()
+
+    def finish_report(self, tags):
+        if not self.found_in_catalog:
+            self.check.service_check(self.SERVICE_CHECK, AgentCheck.UNKNOWN, tags=tags)
+
+    def report_global_metrics(self, config, tags):
+        if self.ID not in Component.registered_global_metric_methods:
+            self.check.log.debug("`%s` component has not registered methods for global metrics", self.ID.value)
+            return
+        self.check.log.debug("reporting `%s` component global metrics", self.ID.value)
+        if self.check.api.component_in_catalog(self.TYPES.value):
+            self.found_in_catalog = True
+            self.check.log.debug("`%s` component found in catalog", self.ID.value)
+            for registered_method in Component.registered_global_metric_methods[self.ID]:
+                registered_method(self, config, tags)
+        else:
+            self.check.log.debug("`%s` component not found in catalog", self.ID.value)
+
+    def report_project_metrics(self, project, config, project_tags):
+        if self.ID not in Component.registered_project_metric_methods:
+            self.check.log.debug("`%s` component has not registered methods for project metrics", self.ID.value)
+            return
+        if self.check.api.component_in_catalog(self.TYPES.value):
+            self.found_in_catalog = True
+            self.check.log.debug("`%s` component found in catalog for project %s", self.ID.value, project['name'])
+            for registered_method in Component.registered_project_metric_methods[self.ID]:
+                registered_method(self, project['id'], project_tags, config)
+        else:
+            self.check.log.debug("`%s` component not found in catalog for project %s", self.ID.value, project['name'])
diff --git a/openstack_controller/datadog_checks/openstack_controller/components/compute.py b/openstack_controller/datadog_checks/openstack_controller/components/compute.py
new file mode 100644
index 0000000000000..91ee409912f91
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/components/compute.py
@@ -0,0 +1,401 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+import re
+
+from datadog_checks.base.utils.discovery import Discovery
+from datadog_checks.openstack_controller.components.component import Component
+from datadog_checks.openstack_controller.config import normalize_discover_config_include
+from datadog_checks.openstack_controller.metrics import (
+    NOVA_FLAVORS_METRICS,
+    NOVA_FLAVORS_METRICS_PREFIX,
+    NOVA_FLAVORS_TAGS,
+    NOVA_HYPERVISOR_COUNT,
+    NOVA_HYPERVISOR_METRICS,
+    NOVA_HYPERVISOR_METRICS_PREFIX,
+    NOVA_HYPERVISOR_TAGS,
+    NOVA_HYPERVISOR_UPTIME_METRICS,
+    NOVA_LIMITS_METRICS,
+    NOVA_LIMITS_METRICS_PREFIX,
+    NOVA_LIMITS_TAGS,
+    NOVA_QUOTA_SET_METRICS,
+    NOVA_QUOTA_SET_METRICS_PREFIX,
+    NOVA_QUOTA_SET_TAGS,
+    NOVA_RESPONSE_TIME,
+    NOVA_SERVER_COUNT,
+    NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_METRICS,
+    NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_METRICS_PREFIX,
+    NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_TAGS,
+    NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS,
+    NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS_PREFIX,
+    NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_TAGS,
+    NOVA_SERVER_DIAGNOSTIC_METRICS,
+    NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX,
+    NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS,
+    NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX,
+    NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_TAGS,
+    NOVA_SERVER_DIAGNOSTIC_TAGS,
+    NOVA_SERVER_FLAVOR_METRICS,
+    NOVA_SERVER_FLAVOR_METRICS_PREFIX,
+    NOVA_SERVER_FLAVOR_TAGS,
+    NOVA_SERVER_METRICS,
+    NOVA_SERVER_METRICS_PREFIX,
+    NOVA_SERVER_TAGS,
+    NOVA_SERVICE_CHECK,
+    NOVA_SERVICES_COUNT,
+    NOVA_SERVICES_METRICS,
+    NOVA_SERVICES_METRICS_PREFIX,
+    NOVA_SERVICES_TAGS,
+    get_metrics_and_tags,
+    is_interface_metric,
+)
+
+
+class Compute(Component):
+    ID = Component.Id.COMPUTE
+    TYPES = Component.Types.COMPUTE
+    SERVICE_CHECK = NOVA_SERVICE_CHECK
+
+    def __init__(self, check):
+        super(Compute, self).__init__(check)
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error(report_service_check=True)
+    def _report_response_time(self, global_components_config, tags):
+        self.check.log.debug("reporting `%s` response time", Compute.ID.value)
+        response_time = self.check.api.get_response_time(Compute.TYPES.value)
+        self.check.log.debug("`%s` response time: %s", Compute.ID.value, response_time)
+        self.check.gauge(NOVA_RESPONSE_TIME, response_time, tags=tags)
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_limits(self, project_id, tags, config):
+        report_limits = config.get('limits', True)
+        if report_limits:
+            item = self.check.api.get_compute_limits(project_id)
+
+            limits = get_metrics_and_tags(
+                item,
+                tags=NOVA_LIMITS_TAGS,
+                prefix=NOVA_LIMITS_METRICS_PREFIX,
+                metrics=NOVA_LIMITS_METRICS,
+            )
+            self.check.log.debug("limits: %s", limits)
+            for metric, value in limits['metrics'].items():
+                self.check.gauge(metric, value, tags=tags + limits['tags'])
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_services(self, config, tags):
+        report_services = config.get('services', True)
+        if report_services:
+            data = self.check.api.get_compute_services()
+            self.check.log.debug("compute services: %s", data)
+            for item in data:
+                service = get_metrics_and_tags(
+                    item,
+                    tags=NOVA_SERVICES_TAGS,
+                    prefix=NOVA_SERVICES_METRICS_PREFIX,
+                    metrics=NOVA_SERVICES_METRICS,
+                    lambda_name=lambda key: 'up' if key == 'state' else key,
+                    lambda_value=lambda key, value, item=item: (item['state'] == 'up' and item['status'] == 'enabled')
+                    if key == 'state'
+                    else value,
+                )
+                self.check.log.debug("service: %s", service)
+                self.check.gauge(NOVA_SERVICES_COUNT, 1, tags=tags + service['tags'])
+                for metric, value in service['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + service['tags'])
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_flavors(self, config, tags):
+        report_flavors = config.get('flavors', True)
+        if report_flavors:
+            data = self.check.api.get_compute_flavors()
+            self.check.log.debug("flavors: %s", data)
+            for item in data:
+                flavor = get_metrics_and_tags(
+                    item,
+                    tags=NOVA_FLAVORS_TAGS,
+                    prefix=NOVA_FLAVORS_METRICS_PREFIX,
+                    metrics=NOVA_FLAVORS_METRICS,
+                )
+                self.check.log.debug("flavor: %s", flavor)
+                for metric, value in flavor['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + flavor['tags'])
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_hypervisors(self, config, tags):
+        report_hypervisors = True
+        config_hypervisors = config.get('hypervisors', {})
+        if isinstance(config_hypervisors, bool):
+            report_hypervisors = config_hypervisors
+            config_hypervisors = {}
+        if report_hypervisors:
+            hypervisors_discovery = None
+            config_hypervisors_include = normalize_discover_config_include(config_hypervisors, ["hypervisor_hostname"])
+            if config_hypervisors_include:
+                hypervisors_discovery = Discovery(
+                    lambda: self.check.api.get_compute_hypervisors(),
+                    limit=config_hypervisors.get('limit'),
+                    include=config_hypervisors_include,
+                    exclude=config_hypervisors.get('exclude'),
+                    interval=config_hypervisors.get('interval'),
+                    key=lambda hypervisor: hypervisor.get('hypervisor_hostname'),
+                )
+            if hypervisors_discovery:
+                discovered_hypervisors = list(hypervisors_discovery.get_items())
+            else:
+                discovered_hypervisors = [
+                    (None, hypervisor.get('hypervisor_hostname'), hypervisor, None)
+                    for hypervisor in self.check.api.get_compute_hypervisors()
+                ]
+            for _pattern, _item_name, item, item_config in discovered_hypervisors:
+                self.check.log.debug("item: %s", item)
+                self.check.log.debug("item_config: %s", item_config)
+                hypervisor = get_metrics_and_tags(
+                    item,
+                    tags=NOVA_HYPERVISOR_TAGS,
+                    prefix=NOVA_HYPERVISOR_METRICS_PREFIX,
+                    metrics=NOVA_HYPERVISOR_METRICS,
+                    lambda_name=lambda key: 'up' if key == 'state' else key,
+                    lambda_value=lambda key, value, item=item: (item['state'] == 'up' and item['status'] == 'enabled')
+                    if key == 'state'
+                    else value,
+                )
+                self.check.log.debug("hypervisor: %s", hypervisor)
+                hypervisor_hostname = item['hypervisor_hostname']
+                hypervisor_tags = hypervisor['tags']
+                self.check.gauge(NOVA_HYPERVISOR_COUNT, 1, tags=tags + hypervisor_tags, hostname=hypervisor_hostname)
+                for metric, value in hypervisor['metrics'].items():
+                    self.check.gauge(
+                        metric,
+                        value,
+                        tags=tags + hypervisor_tags,
+                        hostname=hypervisor_hostname,
+                    )
+                collect_uptime = item_config.get('uptime', True) if item_config else True
+                if collect_uptime:
+                    if item['hypervisor_type'] != 'ironic':
+                        self._report_hypervisor_uptime(item, tags + hypervisor['tags'])
+                    else:
+                        self.check.log.debug(
+                            "Skipping uptime metrics for bare metal hypervisor `%s`", item['hypervisor_hostname']
+                        )
+                self.check.external_tags.append((item['hypervisor_hostname'], {'openstack': ['host_type:hypervisor']}))
+
+    @Component.http_error()
+    def _report_hypervisor_uptime(self, hypervisor, tags):
+        hypervisor_id = hypervisor['id']
+        hypervisor_hostname = hypervisor['hypervisor_hostname']
+        uptime = hypervisor.get('uptime')
+
+        def _load_averages_from_uptime(uptime):
+            load_averages = []
+            if uptime:
+                """Parse u' 16:53:48 up 1 day, 21:34,  3 users,  load average: 0.04, 0.14, 0.19\n'"""
+                uptime = uptime.strip()
+                load_averages = uptime[uptime.find('load average:') :].split(':')[1].strip().split(',')
+                load_averages = [float(load_avg) for load_avg in load_averages]
+            return load_averages
+
+        if uptime is None:
+            uptime = self.check.api.get_compute_hypervisor_uptime(hypervisor_id).get("uptime")
+        uptime_metrics = {}
+        load_averages = _load_averages_from_uptime(uptime)
+        if load_averages and len(load_averages) == 3:
+            for i, avg in enumerate([1, 5, 15]):
+                uptime_metrics[f"load_{avg}"] = load_averages[i]
+        uptime_metrics_and_tags = get_metrics_and_tags(
+            uptime_metrics,
+            tags=NOVA_HYPERVISOR_TAGS,
+            prefix=NOVA_HYPERVISOR_METRICS_PREFIX,
+            metrics=NOVA_HYPERVISOR_UPTIME_METRICS,
+        )
+        for metric, value in uptime_metrics_and_tags['metrics'].items():
+            self.check.gauge(metric, value, tags=tags + uptime_metrics_and_tags['tags'], hostname=hypervisor_hostname)
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_quota_sets(self, project_id, tags, config):
+        report_quota_sets = config.get('quota_sets', True)
+        if report_quota_sets:
+            item = self.check.api.get_compute_quota_sets(project_id)
+            quota_set = get_metrics_and_tags(
+                item,
+                tags=NOVA_QUOTA_SET_TAGS,
+                prefix=NOVA_QUOTA_SET_METRICS_PREFIX,
+                metrics=NOVA_QUOTA_SET_METRICS,
+            )
+            self.check.log.debug("quota_set: %s", quota_set)
+            for metric, value in quota_set['metrics'].items():
+                self.check.gauge(metric, value, tags=tags + quota_set['tags'])
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_servers(self, project_id, tags, config):
+        report_servers = True
+        config_servers = config.get('servers', {})
+        if isinstance(config_servers, bool):
+            report_servers = config_servers
+            config_servers = {}
+        if report_servers:
+            servers_discovery = None
+            if config_servers:
+                config_servers_include = normalize_discover_config_include(config_servers, ["name"])
+                self.check.log.debug("config_servers_include: %s", config_servers_include)
+                if config_servers_include:
+                    servers_discovery = Discovery(
+                        lambda: self.check.api.get_compute_servers(project_id),
+                        limit=config_servers.get('limit'),
+                        include=config_servers_include,
+                        exclude=config_servers.get('exclude'),
+                        interval=config_servers.get('interval'),
+                        key=lambda server: server.get('name'),
+                    )
+            if servers_discovery:
+                discovered_servers = list(servers_discovery.get_items())
+            else:
+                discovered_servers = [
+                    (None, server.get('name'), server, None)
+                    for server in self.check.api.get_compute_servers(project_id)
+                ]
+            aggregates = self.check.api.get_compute_aggregates()
+            self.check.log.debug("aggregates: %s", aggregates)
+            for _pattern, _item_name, item, item_config in discovered_servers:
+                self.check.log.debug("item: %s", item)
+                self.check.log.debug("item_config: %s", item_config)
+                server = get_metrics_and_tags(
+                    item,
+                    tags=NOVA_SERVER_TAGS,
+                    prefix=NOVA_SERVER_METRICS_PREFIX,
+                    metrics=NOVA_SERVER_METRICS,
+                    lambda_name=lambda key, item=item: 'active'
+                    if key == 'status' and item['status'] == 'ACTIVE'
+                    else 'error'
+                    if key == 'status' and item['status'] == 'ERROR'
+                    else key,
+                    lambda_value=lambda key, value, item=item: 1
+                    if key == 'status' and (item['status'] == 'ACTIVE' or item['status'] == 'ERROR')
+                    else value,
+                )
+                self.check.log.debug("server: %s", server)
+                self.check.gauge(NOVA_SERVER_COUNT, 1, tags=tags + server['tags'], hostname=item['id'])
+                for metric, value in server['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + server['tags'], hostname=item['id'])
+                collect_flavors = item_config.get('flavors', True) if item_config else True
+                if collect_flavors:
+                    self._report_server_flavor(item, tags + server['tags'])
+                collect_diagnostics = item_config.get('diagnostics', True) if item_config else True
+                if collect_diagnostics:
+                    self._report_server_diagnostics(item, tags + server['tags'])
+                report_external_tags = item_config.get('external_tags', True) if item_config else True
+                if report_external_tags:
+                    self._report_external_tags(item, aggregates)
+
+    @Component.http_error()
+    def _report_server_flavor(self, server, tags):
+        flavor_id = server.get('flavor', {}).get('id')
+        flavor_original_name = server.get('flavor', {}).get('original_name')
+        flavor_metrics = {}
+        if flavor_id and flavor_original_name is None:
+            flavor_metrics = self.check.api.get_compute_flavor(flavor_id)
+        else:
+            flavor_metrics = server.get('flavor')
+        self.check.log.debug("flavor_metrics: %s", flavor_metrics)
+        flavor_metrics_and_tags = get_metrics_and_tags(
+            flavor_metrics,
+            tags=NOVA_SERVER_FLAVOR_TAGS,
+            prefix=NOVA_SERVER_FLAVOR_METRICS_PREFIX,
+            metrics=NOVA_SERVER_FLAVOR_METRICS,
+        )
+        self.check.log.debug("flavor_metrics_and_tags: %s", flavor_metrics_and_tags)
+        for metric, value in flavor_metrics_and_tags['metrics'].items():
+            self.check.gauge(metric, value, tags=tags + flavor_metrics_and_tags['tags'], hostname=server['id'])
+
+    @Component.http_error()
+    def _report_server_diagnostics(self, server, tags):
+        server_id = server['id']
+        item_diagnostic = self.check.api.get_compute_server_diagnostics(server_id)
+        self.check.log.debug("server_diagnostics: %s", item_diagnostic)
+        diagnostic = get_metrics_and_tags(
+            item_diagnostic,
+            tags=NOVA_SERVER_DIAGNOSTIC_TAGS,
+            prefix=NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX,
+            metrics=NOVA_SERVER_DIAGNOSTIC_METRICS,
+        )
+        self.check.log.debug("diagnostic: %s", diagnostic)
+        for metric, value in diagnostic['metrics'].items():
+
+            if is_interface_metric(metric):
+                metric_pre = re.split("(_rx|_tx)", metric)
+
+                interface = "interface:{}".format(metric_pre[0])
+                self.check.gauge(
+                    "{}.{}{}".format(
+                        NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX, metric_pre[1].replace("_", ""), metric_pre[2]
+                    ),
+                    value,
+                    tags=tags + diagnostic['tags'] + [interface],
+                    hostname=server['id'],
+                )
+            else:
+                self.check.gauge(metric, value, tags=tags + diagnostic['tags'], hostname=server['id'])
+        for item_disk_details in item_diagnostic.get('disk_details', []):
+            disk_detail = get_metrics_and_tags(
+                item_disk_details,
+                tags=NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_TAGS,
+                prefix=NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS_PREFIX,
+                metrics=NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS,
+            )
+            for metric, value in disk_detail['metrics'].items():
+                self.check.gauge(
+                    metric,
+                    value,
+                    tags=tags + diagnostic['tags'] + disk_detail['tags'],
+                    hostname=server['id'],
+                )
+        for item_cpu_details in item_diagnostic.get('cpu_details', []):
+            cpu_detail = get_metrics_and_tags(
+                item_cpu_details,
+                tags=NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_TAGS,
+                prefix=NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_METRICS_PREFIX,
+                metrics=NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_METRICS,
+            )
+            for metric, value in cpu_detail['metrics'].items():
+                self.check.gauge(
+                    metric,
+                    value,
+                    tags=tags + diagnostic['tags'] + cpu_detail['tags'],
+                    hostname=server['id'],
+                )
+        for item_nic_details in item_diagnostic.get('nic_details', []):
+            nic_detail = get_metrics_and_tags(
+                item_nic_details,
+                tags=NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_TAGS,
+                prefix=NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX,
+                metrics=NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS,
+            )
+            for metric, value in nic_detail['metrics'].items():
+                self.check.gauge(
+                    metric,
+                    value,
+                    tags=tags + diagnostic['tags'] + nic_detail['tags'],
+                    hostname=server['id'],
+                )
+
+    def _report_external_tags(self, server, aggregates):
+        external_tags = ['host_type:server']
+        hypervisor_hostname = server.get('OS-EXT-SRV-ATTR:hypervisor_hostname')
+        external_tags.append(f"availability_zone:{server['OS-EXT-AZ:availability_zone']}")
+        if hypervisor_hostname:
+            for aggregate in aggregates:
+                self.check.log.debug("aggregate: %s", aggregate)
+                if hypervisor_hostname in aggregate['hosts']:
+                    external_tags.append(f"aggregate:{aggregate['name']}")
+                    availability_zone_tag = f"availability_zone:{aggregate['availability_zone']}"
+                    if availability_zone_tag not in external_tags:
+                        external_tags.append(availability_zone_tag)
+        self.check.external_tags.append((server['id'], {'openstack': external_tags}))
diff --git a/openstack_controller/datadog_checks/openstack_controller/components/identity.py b/openstack_controller/datadog_checks/openstack_controller/components/identity.py
new file mode 100644
index 0000000000000..9a16f54185455
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/components/identity.py
@@ -0,0 +1,229 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+from datadog_checks.openstack_controller.components.component import Component
+from datadog_checks.openstack_controller.metrics import (
+    KEYSTONE_DOMAIN_COUNT,
+    KEYSTONE_DOMAIN_METRICS,
+    KEYSTONE_DOMAIN_METRICS_PREFIX,
+    KEYSTONE_DOMAIN_TAGS,
+    KEYSTONE_GROUP_COUNT,
+    KEYSTONE_GROUP_METRICS,
+    KEYSTONE_GROUP_METRICS_PREFIX,
+    KEYSTONE_GROUP_TAGS,
+    KEYSTONE_GROUP_USERS,
+    KEYSTONE_LIMIT_METRICS,
+    KEYSTONE_LIMIT_METRICS_PREFIX,
+    KEYSTONE_LIMIT_TAGS,
+    KEYSTONE_PROJECT_COUNT,
+    KEYSTONE_PROJECT_METRICS,
+    KEYSTONE_PROJECT_METRICS_PREFIX,
+    KEYSTONE_PROJECT_TAGS,
+    KEYSTONE_REGION_COUNT,
+    KEYSTONE_REGION_METRICS,
+    KEYSTONE_REGION_METRICS_PREFIX,
+    KEYSTONE_REGION_TAGS,
+    KEYSTONE_REGISTERED_LIMIT_METRICS,
+    KEYSTONE_REGISTERED_LIMIT_METRICS_PREFIX,
+    KEYSTONE_REGISTERED_LIMIT_TAGS,
+    KEYSTONE_RESPONSE_TIME,
+    KEYSTONE_SERVICE_CHECK,
+    KEYSTONE_SERVICE_COUNT,
+    KEYSTONE_SERVICE_METRICS,
+    KEYSTONE_SERVICE_METRICS_PREFIX,
+    KEYSTONE_SERVICE_TAGS,
+    KEYSTONE_USER_COUNT,
+    KEYSTONE_USER_METRICS,
+    KEYSTONE_USER_METRICS_PREFIX,
+    KEYSTONE_USER_TAGS,
+    get_metrics_and_tags,
+)
+
+
+class Identity(Component):
+    ID = Component.Id.IDENTITY
+    TYPES = Component.Types.IDENTITY
+    SERVICE_CHECK = KEYSTONE_SERVICE_CHECK
+
+    def __init__(self, check):
+        super(Identity, self).__init__(check)
+
+    @Component.http_error()
+    def authorize_user(self):
+        self.check.api.authorize_user()
+
+    @Component.http_error()
+    def authorize_system(self):
+        self.check.api.authorize_system()
+
+    @Component.http_error()
+    def authorize_project(self, project_id):
+        self.check.api.authorize_project(project_id)
+
+    @Component.http_error()
+    def get_auth_projects(self):
+        return self.check.api.get_auth_projects()
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error(report_service_check=True)
+    def _report_response_time(self, global_components_config, tags):
+        self.check.log.debug("reporting `%s` response time", Identity.ID.value)
+        response_time = self.check.api.get_response_time(Identity.TYPES.value)
+        self.check.log.debug("`%s` response time: %s", Identity.ID.value, response_time)
+        self.check.gauge(KEYSTONE_RESPONSE_TIME, response_time, tags=tags)
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_regions(self, config, tags):
+        report_regions = config.get('regions', True)
+        if report_regions:
+            data = self.check.api.get_identity_regions()
+            self.check.log.debug("regions: %s", data)
+            for item in data:
+                region = get_metrics_and_tags(
+                    item,
+                    tags=KEYSTONE_REGION_TAGS,
+                    prefix=KEYSTONE_REGION_METRICS_PREFIX,
+                    metrics=KEYSTONE_REGION_METRICS,
+                )
+                self.check.log.debug("region: %s", region)
+                self.check.gauge(KEYSTONE_REGION_COUNT, 1, tags=tags + region['tags'])
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_domains(self, config, tags):
+        report_domains = config.get('domains', True)
+        if report_domains:
+            data = self.check.api.get_identity_domains()
+            self.check.log.debug("domains: %s", data)
+            for item in data:
+                domain = get_metrics_and_tags(
+                    item,
+                    tags=KEYSTONE_DOMAIN_TAGS,
+                    prefix=KEYSTONE_DOMAIN_METRICS_PREFIX,
+                    metrics=KEYSTONE_DOMAIN_METRICS,
+                )
+                self.check.log.debug("domain: %s", domain)
+                self.check.gauge(KEYSTONE_DOMAIN_COUNT, 1, tags=tags + domain['tags'])
+                for metric, value in domain['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + domain['tags'])
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_projects(self, config, tags):
+        report_projects = config.get('projects', True)
+        if report_projects:
+            data = self.check.api.get_identity_projects()
+            self.check.log.debug("projects: %s", data)
+            for item in data:
+                project = get_metrics_and_tags(
+                    item,
+                    tags=KEYSTONE_PROJECT_TAGS,
+                    prefix=KEYSTONE_PROJECT_METRICS_PREFIX,
+                    metrics=KEYSTONE_PROJECT_METRICS,
+                )
+                self.check.log.debug("project: %s", project)
+                self.check.gauge(KEYSTONE_PROJECT_COUNT, 1, tags=tags + project['tags'])
+                for metric, value in project['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + project['tags'])
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_users(self, config, tags):
+        report_users = config.get('users', True)
+        if report_users:
+            data = self.check.api.get_identity_users()
+            self.check.log.debug("users: %s", data)
+            for item in data:
+                user = get_metrics_and_tags(
+                    item,
+                    tags=KEYSTONE_USER_TAGS,
+                    prefix=KEYSTONE_USER_METRICS_PREFIX,
+                    metrics=KEYSTONE_USER_METRICS,
+                )
+                self.check.log.debug("user: %s", user)
+                self.check.gauge(KEYSTONE_USER_COUNT, 1, tags=tags + user['tags'])
+                for metric, value in user['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + user['tags'])
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_groups(self, config, tags):
+        report_groups = config.get('groups', True)
+        if report_groups:
+            data = self.check.api.get_identity_groups()
+            self.check.log.debug("groups: %s", data)
+            for item in data:
+                group = get_metrics_and_tags(
+                    item,
+                    tags=KEYSTONE_GROUP_TAGS,
+                    prefix=KEYSTONE_GROUP_METRICS_PREFIX,
+                    metrics=KEYSTONE_GROUP_METRICS,
+                )
+                self.check.log.debug("group: %s", group)
+                self.check.gauge(KEYSTONE_GROUP_COUNT, 1, tags=tags + group['tags'])
+                self._report_group_users(item['id'], tags + group['tags'])
+
+    @Component.http_error()
+    def _report_group_users(self, group_id, tags):
+        users = self.check.api.get_identity_group_users(group_id)
+        self.check.log.debug("users: %s", users)
+        self.check.gauge(KEYSTONE_GROUP_USERS, len(users), tags=tags)
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_services(self, config, tags):
+        report_services = config.get('services', True)
+        if report_services:
+            data = self.check.api.get_identity_services()
+            self.check.log.debug("identity services: %s", data)
+            for item in data:
+                service = get_metrics_and_tags(
+                    item,
+                    tags=KEYSTONE_SERVICE_TAGS,
+                    prefix=KEYSTONE_SERVICE_METRICS_PREFIX,
+                    metrics=KEYSTONE_SERVICE_METRICS,
+                )
+                self.check.log.debug("service: %s", service)
+                self.check.gauge(KEYSTONE_SERVICE_COUNT, 1, tags=tags + service['tags'])
+                for metric, value in service['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + service['tags'])
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_registered_limits(self, config, tags):
+        report_limits = config.get('limits', True)
+        if report_limits:
+            data = self.check.api.get_identity_registered_limits()
+            self.check.log.debug("registered limits: %s", data)
+            for item in data:
+                registered_limit = get_metrics_and_tags(
+                    item,
+                    tags=KEYSTONE_REGISTERED_LIMIT_TAGS,
+                    prefix=KEYSTONE_REGISTERED_LIMIT_METRICS_PREFIX,
+                    metrics=KEYSTONE_REGISTERED_LIMIT_METRICS,
+                    lambda_name=lambda key: 'limit' if key == 'default_limit' else key,
+                )
+                self.check.log.debug("registered limit: %s", registered_limit)
+                for metric, value in registered_limit['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + registered_limit['tags'])
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_limits(self, config, tags):
+        report_limits = config.get('limits', True)
+        if report_limits:
+            data = self.check.api.get_identity_limits()
+            self.check.log.debug("limits: %s", data)
+            for item in data:
+                limit = get_metrics_and_tags(
+                    item,
+                    tags=KEYSTONE_LIMIT_TAGS,
+                    prefix=KEYSTONE_LIMIT_METRICS_PREFIX,
+                    metrics=KEYSTONE_LIMIT_METRICS,
+                    lambda_name=lambda key: 'limit' if key == 'resource_limit' else key,
+                )
+                self.check.log.debug("limit: %s", limit)
+                for metric, value in limit['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + limit['tags'])
diff --git a/openstack_controller/datadog_checks/openstack_controller/components/load_balancer.py b/openstack_controller/datadog_checks/openstack_controller/components/load_balancer.py
new file mode 100644
index 0000000000000..c9d41f3f19d15
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/components/load_balancer.py
@@ -0,0 +1,389 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+from datadog_checks.base.utils.discovery import Discovery
+from datadog_checks.openstack_controller.components.component import Component
+from datadog_checks.openstack_controller.config import normalize_discover_config_include
+from datadog_checks.openstack_controller.metrics import (
+    OCTAVIA_AMPHORA_COUNT,
+    OCTAVIA_AMPHORA_METRICS,
+    OCTAVIA_AMPHORA_METRICS_PREFIX,
+    OCTAVIA_AMPHORA_STATS_METRICS,
+    OCTAVIA_AMPHORA_STATS_METRICS_PREFIX,
+    OCTAVIA_AMPHORA_STATS_TAGS,
+    OCTAVIA_AMPHORA_TAGS,
+    OCTAVIA_HEALTHMONITOR_COUNT,
+    OCTAVIA_HEALTHMONITOR_METRICS,
+    OCTAVIA_HEALTHMONITOR_METRICS_PREFIX,
+    OCTAVIA_HEALTHMONITOR_TAGS,
+    OCTAVIA_LISTENER_COUNT,
+    OCTAVIA_LISTENER_METRICS,
+    OCTAVIA_LISTENER_METRICS_PREFIX,
+    OCTAVIA_LISTENER_STATS_METRICS,
+    OCTAVIA_LISTENER_STATS_METRICS_PREFIX,
+    OCTAVIA_LISTENER_TAGS,
+    OCTAVIA_LOAD_BALANCER_COUNT,
+    OCTAVIA_LOAD_BALANCER_METRICS,
+    OCTAVIA_LOAD_BALANCER_METRICS_PREFIX,
+    OCTAVIA_LOAD_BALANCER_STATS_METRICS,
+    OCTAVIA_LOAD_BALANCER_STATS_METRICS_PREFIX,
+    OCTAVIA_LOAD_BALANCER_TAGS,
+    OCTAVIA_POOL_COUNT,
+    OCTAVIA_POOL_MEMBERS_COUNT,
+    OCTAVIA_POOL_MEMBERS_METRICS,
+    OCTAVIA_POOL_MEMBERS_METRICS_PREFIX,
+    OCTAVIA_POOL_MEMBERS_TAGS,
+    OCTAVIA_POOL_METRICS,
+    OCTAVIA_POOL_METRICS_PREFIX,
+    OCTAVIA_POOL_TAGS,
+    OCTAVIA_QUOTA_COUNT,
+    OCTAVIA_QUOTA_METRICS,
+    OCTAVIA_QUOTA_METRICS_PREFIX,
+    OCTAVIA_QUOTA_TAGS,
+    OCTAVIA_RESPONSE_TIME,
+    OCTAVIA_SERVICE_CHECK,
+    get_metrics_and_tags,
+)
+
+
+class LoadBalancer(Component):
+    ID = Component.Id.LOAD_BALANCER
+    TYPES = Component.Types.LOAD_BALANCER
+    SERVICE_CHECK = OCTAVIA_SERVICE_CHECK
+
+    def __init__(self, check):
+        super(LoadBalancer, self).__init__(check)
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error(report_service_check=True)
+    def _report_response_time(self, global_components_config, tags):
+        self.check.log.debug("reporting `%s` response time", LoadBalancer.ID.value)
+        response_time = self.check.api.get_response_time(LoadBalancer.TYPES.value)
+        self.check.log.debug("`%s` response time: %s", LoadBalancer.ID.value, response_time)
+        self.check.gauge(OCTAVIA_RESPONSE_TIME, response_time, tags=tags)
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_loadbalancers(self, project_id, tags, config):
+        report_loadbalancers = True
+        config_loadbalancers = config.get('loadbalancers', {})
+        if isinstance(config_loadbalancers, bool):
+            report_loadbalancers = config_loadbalancers
+            config_loadbalancers = {}
+        if report_loadbalancers:
+            loadbalancers_discovery = None
+            if config_loadbalancers:
+                config_loadbalancers_include = normalize_discover_config_include(config_loadbalancers, ["name"])
+                if config_loadbalancers_include:
+                    loadbalancers_discovery = Discovery(
+                        lambda: self.check.api.get_load_balancer_loadbalancers(project_id),
+                        limit=config_loadbalancers.get('limit'),
+                        include=config_loadbalancers_include,
+                        exclude=config_loadbalancers.get('exclude'),
+                        interval=config_loadbalancers.get('interval'),
+                        key=lambda loadbalancer: loadbalancer.get('name'),
+                    )
+            if loadbalancers_discovery:
+                discovered_loadbalancers = list(loadbalancers_discovery.get_items())
+            else:
+                discovered_loadbalancers = [
+                    (None, loadbalancer.get('name'), loadbalancer, None)
+                    for loadbalancer in self.check.api.get_load_balancer_loadbalancers(project_id)
+                ]
+            for _pattern, _item_name, item, item_config in discovered_loadbalancers:
+                self.check.log.debug("item: %s", item)
+                self.check.log.debug("item_config: %s", item_config)
+                loadbalancer = get_metrics_and_tags(
+                    item,
+                    tags=OCTAVIA_LOAD_BALANCER_TAGS,
+                    prefix=OCTAVIA_LOAD_BALANCER_METRICS_PREFIX,
+                    metrics=OCTAVIA_LOAD_BALANCER_METRICS,
+                )
+                self.check.log.debug("loadbalancer: %s", loadbalancer)
+                self.check.gauge(OCTAVIA_LOAD_BALANCER_COUNT, 1, tags=tags + loadbalancer['tags'])
+                for metric, value in loadbalancer['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + loadbalancer['tags'])
+                report_stats = item_config.get('stats', True) if item_config else True
+                if report_stats:
+                    self._report_loadbalancer_stats(item['id'], tags + loadbalancer['tags'])
+
+    @Component.http_error()
+    def _report_loadbalancer_stats(self, loadbalancer_id, tags):
+        data = self.check.api.get_load_balancer_loadbalancer_stats(loadbalancer_id)
+        self.check.log.debug("data: %s", data)
+        loadbalancer_stats = get_metrics_and_tags(
+            data,
+            tags=OCTAVIA_LOAD_BALANCER_TAGS,
+            prefix=OCTAVIA_LOAD_BALANCER_STATS_METRICS_PREFIX,
+            metrics=OCTAVIA_LOAD_BALANCER_STATS_METRICS,
+        )
+        self.check.log.debug("loadbalancer_stats: %s", loadbalancer_stats)
+        for metric, value in loadbalancer_stats['metrics'].items():
+            self.check.gauge(metric, value, tags=tags + loadbalancer_stats['tags'])
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_listeners(self, project_id, tags, config):
+        report_listeners = True
+        config_listeners = config.get('listeners', {})
+        if isinstance(config_listeners, bool):
+            report_listeners = config_listeners
+            config_listeners = {}
+        if report_listeners:
+            listeners_discovery = None
+            if config_listeners:
+                config_listeners_include = normalize_discover_config_include(config_listeners, ["name"])
+                if config_listeners_include:
+                    listeners_discovery = Discovery(
+                        lambda: self.check.api.get_load_balancer_listeners(project_id),
+                        limit=config_listeners.get('limit'),
+                        include=config_listeners_include,
+                        exclude=config_listeners.get('exclude'),
+                        interval=config_listeners.get('interval'),
+                        key=lambda listener: listener.get('name'),
+                    )
+            if listeners_discovery:
+                discovered_listeners = list(listeners_discovery.get_items())
+            else:
+                discovered_listeners = [
+                    (None, listener.get('name'), listener, None)
+                    for listener in self.check.api.get_load_balancer_listeners(project_id)
+                ]
+            for _pattern, _item_name, item, item_config in discovered_listeners:
+                self.check.log.debug("item: %s", item)
+                self.check.log.debug("item_config: %s", item_config)
+                listener = get_metrics_and_tags(
+                    item,
+                    tags=OCTAVIA_LISTENER_TAGS,
+                    prefix=OCTAVIA_LISTENER_METRICS_PREFIX,
+                    metrics=OCTAVIA_LISTENER_METRICS,
+                )
+                self.check.log.debug("listener: %s", listener)
+                self.check.gauge(OCTAVIA_LISTENER_COUNT, 1, tags=tags + listener['tags'])
+                for metric, value in listener['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + listener['tags'])
+                report_stats = item_config.get('stats', True) if item_config else True
+                if report_stats:
+                    self._report_listener_stats(item['id'], tags + listener['tags'])
+
+    @Component.http_error()
+    def _report_listener_stats(self, listener_id, tags):
+        data = self.check.api.get_load_balancer_listener_stats(listener_id)
+        self.check.log.debug("data: %s", data)
+        listener_stats = get_metrics_and_tags(
+            data,
+            tags=OCTAVIA_LISTENER_TAGS,
+            prefix=OCTAVIA_LISTENER_STATS_METRICS_PREFIX,
+            metrics=OCTAVIA_LISTENER_STATS_METRICS,
+        )
+        self.check.log.debug("listener_stats: %s", listener_stats)
+        for metric, value in listener_stats['metrics'].items():
+            self.check.gauge(metric, value, tags=tags + listener_stats['tags'])
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_pools(self, project_id, tags, config):
+        report_pools = True
+        config_pools = config.get('pools', {})
+        if isinstance(config_pools, bool):
+            report_pools = config_pools
+            config_pools = {}
+        if report_pools:
+            pools_discovery = None
+            if config_pools:
+                config_pools_include = normalize_discover_config_include(config_pools, ["name"])
+                if config_pools_include:
+                    pools_discovery = Discovery(
+                        lambda: self.check.api.get_load_balancer_pools(project_id),
+                        limit=config_pools.get('limit'),
+                        include=config_pools_include,
+                        exclude=config_pools.get('exclude'),
+                        interval=config_pools.get('interval'),
+                        key=lambda pool: pool.get('name'),
+                    )
+            if pools_discovery:
+                discovered_pools = list(pools_discovery.get_items())
+            else:
+                discovered_pools = [
+                    (None, pool.get('name'), pool, None) for pool in self.check.api.get_load_balancer_pools(project_id)
+                ]
+            for _pattern, _item_name, item, item_config in discovered_pools:
+                self.check.log.debug("item: %s", item)
+                self.check.log.debug("item_config: %s", item_config)
+                pool = get_metrics_and_tags(
+                    item,
+                    tags=OCTAVIA_POOL_TAGS,
+                    prefix=OCTAVIA_POOL_METRICS_PREFIX,
+                    metrics=OCTAVIA_POOL_METRICS,
+                )
+                self.check.log.debug("pool: %s", pool)
+                self.check.gauge(OCTAVIA_POOL_COUNT, 1, tags=tags + pool['tags'])
+                for metric, value in pool['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + pool['tags'])
+                report_members = item_config.get('members', True) if item_config else True
+                if report_members:
+                    self._report_pool_members(item['id'], project_id, tags)
+
+    @Component.http_error()
+    def _report_pool_members(self, pool_id, project_id, tags):
+        data = self.check.api.get_load_balancer_pool_members(pool_id, project_id)
+        self.check.log.debug("data: %s", data)
+        for item in data:
+            pool = get_metrics_and_tags(
+                item,
+                tags=OCTAVIA_POOL_MEMBERS_TAGS,
+                prefix=OCTAVIA_POOL_MEMBERS_METRICS_PREFIX,
+                metrics=OCTAVIA_POOL_MEMBERS_METRICS,
+            )
+            self.check.log.debug("pool: %s", pool)
+            self.check.gauge(OCTAVIA_POOL_MEMBERS_COUNT, 1, tags=tags + pool['tags'])
+            for metric, value in pool['metrics'].items():
+                self.check.gauge(metric, value, tags=tags + pool['tags'])
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_healthmonitors(self, project_id, tags, config):
+        report_healthmonitors = True
+        config_healthmonitors = config.get('healthmonitors', {})
+        if isinstance(config_healthmonitors, bool):
+            report_healthmonitors = config_healthmonitors
+            config_healthmonitors = {}
+        if report_healthmonitors:
+            healthmonitors_discovery = None
+            if config_healthmonitors:
+                config_healthmonitors_include = normalize_discover_config_include(config_healthmonitors, ["name"])
+                if config_healthmonitors_include:
+                    healthmonitors_discovery = Discovery(
+                        lambda: self.check.api.get_load_balancer_healthmonitors(project_id),
+                        limit=config_healthmonitors.get('limit'),
+                        include=config_healthmonitors_include,
+                        exclude=config_healthmonitors.get('exclude'),
+                        interval=config_healthmonitors.get('interval'),
+                        key=lambda healthmonitor: healthmonitor.get('name'),
+                    )
+            if healthmonitors_discovery:
+                discovered_healthmonitors = list(healthmonitors_discovery.get_items())
+            else:
+                discovered_healthmonitors = [
+                    (None, healthmonitor.get('name'), healthmonitor, None)
+                    for healthmonitor in self.check.api.get_load_balancer_healthmonitors(project_id)
+                ]
+            for _pattern, _item_name, item, item_config in discovered_healthmonitors:
+                self.check.log.debug("item: %s", item)
+                self.check.log.debug("item_config: %s", item_config)
+                healthmonitor = get_metrics_and_tags(
+                    item,
+                    tags=OCTAVIA_HEALTHMONITOR_TAGS,
+                    prefix=OCTAVIA_HEALTHMONITOR_METRICS_PREFIX,
+                    metrics=OCTAVIA_HEALTHMONITOR_METRICS,
+                )
+                self.check.log.debug("healthmonitor: %s", healthmonitor)
+                self.check.gauge(OCTAVIA_HEALTHMONITOR_COUNT, 1, tags=tags + healthmonitor['tags'])
+                for metric, value in healthmonitor['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + healthmonitor['tags'])
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_quotas(self, project_id, tags, config):
+        report_quotas = True
+        config_quotas = config.get('quotas', {})
+        if isinstance(config_quotas, bool):
+            report_quotas = config_quotas
+            config_quotas = {}
+        if report_quotas:
+            quotas_discovery = None
+            if config_quotas:
+                config_quotas_include = normalize_discover_config_include(config_quotas, ["name"])
+                if config_quotas_include:
+                    quotas_discovery = Discovery(
+                        lambda: self.check.api.get_load_balancer_quotas(project_id),
+                        limit=config_quotas.get('limit'),
+                        include=config_quotas_include,
+                        exclude=config_quotas.get('exclude'),
+                        interval=config_quotas.get('interval'),
+                        key=lambda quota: quota.get('name'),
+                    )
+            if quotas_discovery:
+                discovered_quotas = list(quotas_discovery.get_items())
+            else:
+                discovered_quotas = [
+                    (None, quota.get('name'), quota, None)
+                    for quota in self.check.api.get_load_balancer_quotas(project_id)
+                ]
+            for _pattern, _item_name, item, item_config in discovered_quotas:
+                self.check.log.debug("item: %s", item)
+                self.check.log.debug("item_config: %s", item_config)
+                quota = get_metrics_and_tags(
+                    item,
+                    tags=OCTAVIA_QUOTA_TAGS,
+                    prefix=OCTAVIA_QUOTA_METRICS_PREFIX,
+                    metrics=OCTAVIA_QUOTA_METRICS,
+                    lambda_value=lambda key, value, item=item: -1 if value is None else value,
+                )
+                self.check.log.debug("quota: %s", quota)
+                self.check.gauge(OCTAVIA_QUOTA_COUNT, 1, tags=tags + quota['tags'])
+                for metric, value in quota['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + quota['tags'])
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_amphorae(self, project_id, tags, config):
+        report_amphorae = True
+        config_amphorae = config.get('amphorae', {})
+        if isinstance(config_amphorae, bool):
+            report_amphorae = config_amphorae
+            config_amphorae = {}
+        if report_amphorae:
+            amphorae_discovery = None
+            if config_amphorae:
+                config_amphorae_include = normalize_discover_config_include(config_amphorae, ["id"])
+                if config_amphorae_include:
+                    amphorae_discovery = Discovery(
+                        lambda: self.check.api.get_load_balancer_amphorae(project_id),
+                        limit=config_amphorae.get('limit'),
+                        include=config_amphorae_include,
+                        exclude=config_amphorae.get('exclude'),
+                        interval=config_amphorae.get('interval'),
+                        key=lambda amphora: amphora.get('id'),
+                    )
+            if amphorae_discovery:
+                discovered_amphorae = list(amphorae_discovery.get_items())
+            else:
+                discovered_amphorae = [
+                    (None, amphora.get('id'), amphora, None)
+                    for amphora in self.check.api.get_load_balancer_amphorae(project_id)
+                ]
+            for _pattern, _item_id, item, item_config in discovered_amphorae:
+                self.check.log.debug("item: %s", item)
+                self.check.log.debug("item_config: %s", item_config)
+                amphora = get_metrics_and_tags(
+                    item,
+                    tags=OCTAVIA_AMPHORA_TAGS,
+                    prefix=OCTAVIA_AMPHORA_METRICS_PREFIX,
+                    metrics=OCTAVIA_AMPHORA_METRICS,
+                    lambda_value=lambda key, value, item=item: -1 if value is None else value,
+                )
+                self.check.log.debug("amphora: %s", amphora)
+                self.check.gauge(OCTAVIA_AMPHORA_COUNT, 1, tags=tags + amphora['tags'])
+                for metric, value in amphora['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + amphora['tags'])
+                report_stats = item_config.get('stats', True) if item_config else True
+                if report_stats:
+                    self._report_amphora_stats(item['id'], tags + amphora['tags'])
+
+    @Component.http_error()
+    def _report_amphora_stats(self, amphora_id, tags):
+        data = self.check.api.get_load_balancer_amphora_stats(amphora_id)
+        self.check.log.debug("data: %s", data)
+        for item in data:
+            amphora_stat = get_metrics_and_tags(
+                item,
+                tags=OCTAVIA_AMPHORA_STATS_TAGS,
+                prefix=OCTAVIA_AMPHORA_STATS_METRICS_PREFIX,
+                metrics=OCTAVIA_AMPHORA_STATS_METRICS,
+            )
+            self.check.log.debug("amphora_stat: %s", amphora_stat)
+            for metric, value in amphora_stat['metrics'].items():
+                self.check.gauge(metric, value, tags=tags + amphora_stat['tags'])
diff --git a/openstack_controller/datadog_checks/openstack_controller/components/network.py b/openstack_controller/datadog_checks/openstack_controller/components/network.py
new file mode 100644
index 0000000000000..133f8a32eae8b
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/components/network.py
@@ -0,0 +1,117 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+from datadog_checks.base.utils.discovery import Discovery
+from datadog_checks.openstack_controller.components.component import Component
+from datadog_checks.openstack_controller.config import normalize_discover_config_include
+from datadog_checks.openstack_controller.metrics import (
+    NEUTRON_AGENTS_COUNT,
+    NEUTRON_AGENTS_METRICS,
+    NEUTRON_AGENTS_METRICS_PREFIX,
+    NEUTRON_AGENTS_TAGS,
+    NEUTRON_NETWORK_COUNT,
+    NEUTRON_NETWORK_METRICS,
+    NEUTRON_NETWORK_METRICS_PREFIX,
+    NEUTRON_NETWORK_TAGS,
+    NEUTRON_QUOTA_METRICS,
+    NEUTRON_QUOTA_METRICS_PREFIX,
+    NEUTRON_QUOTA_TAGS,
+    NEUTRON_RESPONSE_TIME,
+    NEUTRON_SERVICE_CHECK,
+    get_metrics_and_tags,
+)
+
+
+class Network(Component):
+    ID = Component.Id.NETWORK
+    TYPES = Component.Types.NETWORK
+    SERVICE_CHECK = NEUTRON_SERVICE_CHECK
+
+    def __init__(self, check):
+        super(Network, self).__init__(check)
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error(report_service_check=True)
+    def _report_response_time(self, global_components_config, tags):
+        self.check.log.debug("reporting `%s` response time", Network.ID.value)
+        response_time = self.check.api.get_response_time(Network.TYPES.value)
+        self.check.log.debug("`%s` response time: %s", Network.ID.value, response_time)
+        self.check.gauge(NEUTRON_RESPONSE_TIME, response_time, tags=tags)
+
+    @Component.register_global_metrics(ID)
+    @Component.http_error()
+    def _report_agents(self, config, tags):
+        report_agents = config.get('agents', True)
+        if report_agents:
+            data = self.check.api.get_network_agents()
+            for item in data:
+                agent = get_metrics_and_tags(
+                    item,
+                    tags=NEUTRON_AGENTS_TAGS,
+                    prefix=NEUTRON_AGENTS_METRICS_PREFIX,
+                    metrics=NEUTRON_AGENTS_METRICS,
+                    lambda_name=lambda key: 'name' if key == 'binary' else key,
+                )
+                self.check.log.debug("agent: %s", agent)
+                self.check.gauge(NEUTRON_AGENTS_COUNT, 1, tags=tags + agent['tags'])
+                for metric, value in agent['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + agent['tags'])
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_networks(self, project_id, tags, config):
+        report_networks = True
+        config_networks = config.get('networks', {})
+        if isinstance(config_networks, bool):
+            report_networks = config_networks
+            config_networks = {}
+        if report_networks:
+            networks_discovery = None
+            if config_networks:
+                config_networks_include = normalize_discover_config_include(config_networks, ["name"])
+                self.check.log.debug("config_networks_include: %s", config_networks_include)
+                if config_networks_include:
+                    networks_discovery = Discovery(
+                        lambda: self.check.api.get_network_networks(project_id),
+                        limit=config_networks.get('limit'),
+                        include=config_networks_include,
+                        exclude=config_networks.get('exclude'),
+                        interval=config_networks.get('interval'),
+                        key=lambda network: network.get('name'),
+                    )
+            if networks_discovery:
+                discovered_networks = list(networks_discovery.get_items())
+            else:
+                discovered_networks = [
+                    (None, network.get('name'), network, None)
+                    for network in self.check.api.get_network_networks(project_id)
+                ]
+            for _pattern, _item_name, item, _item_config in discovered_networks:
+                network = get_metrics_and_tags(
+                    item,
+                    tags=NEUTRON_NETWORK_TAGS,
+                    prefix=NEUTRON_NETWORK_METRICS_PREFIX,
+                    metrics=NEUTRON_NETWORK_METRICS,
+                )
+                self.check.log.debug("network: %s", network)
+                self.check.gauge(NEUTRON_NETWORK_COUNT, 1, tags=tags + network['tags'])
+                for metric, value in network['metrics'].items():
+                    self.check.gauge(metric, value, tags=tags + network['tags'])
+
+    @Component.register_project_metrics(ID)
+    @Component.http_error()
+    def _report_quotas(self, project_id, tags, config):
+        report_quotas = config.get('quotas', True)
+        if report_quotas:
+            item = self.check.api.get_network_quota(project_id)
+            quota = get_metrics_and_tags(
+                item,
+                tags=NEUTRON_QUOTA_TAGS,
+                prefix=NEUTRON_QUOTA_METRICS_PREFIX,
+                metrics=NEUTRON_QUOTA_METRICS,
+            )
+            self.check.log.debug("quota: %s", quota)
+            for metric, value in quota['metrics'].items():
+                self.check.gauge(metric, value, tags=tags + quota['tags'])
diff --git a/openstack_controller/datadog_checks/openstack_controller/config.py b/openstack_controller/datadog_checks/openstack_controller/config.py
new file mode 100644
index 0000000000000..dae7fb610c4ed
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/config.py
@@ -0,0 +1,125 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+from openstack.config import loader
+
+from datadog_checks.base import ConfigurationError
+from datadog_checks.base.utils.models.types import copy_raw
+from datadog_checks.openstack_controller.api.type import ApiType
+
+
+# Discovery class requires 'include' to be a dict, so this function is needed to normalize the config
+def normalize_discover_config_include(config, item_keys):
+    normalized_config = {}
+    include_list = config.get('include') if isinstance(config, dict) else copy_raw(config.include) if config else []
+    if include_list:
+        if not isinstance(include_list, list):
+            raise TypeError('Setting `include` must be an array')
+        for entry in include_list:
+            if isinstance(entry, str):
+                normalized_config[entry] = None
+            elif isinstance(entry, dict):
+                dict_key = None
+                for key in item_keys:
+                    if key in entry.keys():
+                        normalized_config[entry[key]] = entry
+                        break
+                if dict_key:
+                    normalized_config[dict_key] = entry
+            else:
+                raise TypeError('`include` entries must be a map or a string')
+    return normalized_config
+
+
+class OpenstackConfig:
+    def __init__(self, logger, config):
+        self.log = logger
+        self.openstack_config_file_path = config.openstack_config_file_path
+        self.openstack_cloud_name = config.openstack_cloud_name
+        self.keystone_server_url = config.keystone_server_url
+        self.username = config.username
+        self.password = config.password
+        self.domain_id = config.domain_id
+        self.user = config.user
+        self.nova_microversion = config.nova_microversion
+        self.ironic_microversion = config.ironic_microversion
+        self.endpoint_interface = config.endpoint_interface
+        self.endpoint_region_id = config.endpoint_region_id
+        self.api_type = None
+        self.validate()
+
+    def validate(self):
+        self.log.info("Validating config")
+        if not self.openstack_config_file_path and not self.keystone_server_url:
+            raise ConfigurationError("Either keystone_server_url or openstack_config_file_path need to be provided.")
+        if self.openstack_config_file_path:
+            self._validate_cloud_config()
+        else:
+            self._validate_user()
+
+        if self.nova_microversion:
+            self._validate_microversion(self.nova_microversion, 'nova')
+
+        if self.ironic_microversion:
+            self._validate_microversion(self.ironic_microversion, 'ironic')
+
+    def _validate_microversion(self, microversion, service):
+        is_latest = microversion.lower() == 'latest'
+        is_float = False
+        if is_latest:
+            self.log.warning(
+                "Setting `%s_microversion` to `latest` is not recommended, see the Openstack documentation "
+                "for more details: https://docs.openstack.org/api-guide/compute/microversions.html",
+                service,
+            )
+        try:
+            is_float = float(microversion)
+        except Exception:
+            pass
+        if not is_latest and not is_float:
+            raise ConfigurationError(
+                "Invalid `{}_microversion`: {}; please specify a valid version, see the Openstack documentation"
+                "for more details: https://docs.openstack.org/api-guide/compute/microversions.html".format(
+                    service, microversion
+                ),
+            )
+
+    def _validate_user(self):
+        if self.username:
+            if not self.password:
+                raise ConfigurationError("Please specify `password` in your config.")
+            self.user = {
+                "name": self.username,
+                "password": self.password,
+                "domain": {"id": self.domain_id},
+            }
+        else:
+            self.log.info("Not detected `username` in config. Searching for legacy `user` config")
+            self._validate_user_legacy()
+        self.api_type = ApiType.REST
+
+    def _validate_user_legacy(self):
+        if self.user is None:
+            raise ConfigurationError("Please specify `username` in your config.")
+        if not (
+            self.user.get('name')
+            and self.user.get('password')
+            and self.user.get("domain")
+            and self.user.get("domain").get("id")
+        ):
+            raise ConfigurationError(
+                'The user should look like: '
+                '{"name": "my_name", "password": "my_password", "domain": {"id": "my_domain_id"}}'
+            )
+        self.username = self.user.get('name')
+        self.password = self.user.get('password')
+        self.domain_id = self.user.get("domain").get("id")
+
+    def _validate_cloud_config(self):
+        self.log.debug("openstack_config_file_path: %s", self.openstack_config_file_path)
+        self.log.debug("openstack_cloud_name: %s", self.openstack_cloud_name)
+        config = loader.OpenStackConfig(load_envvars=False, config_files=[self.openstack_config_file_path])
+        config.get_all_clouds()
+        self.api_type = ApiType.SDK
diff --git a/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py b/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py
index 6e3601f0032ae..f277ba8880fdb 100644
--- a/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py
+++ b/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py
@@ -56,10 +56,18 @@ def instance_disable_generic_tags():
     return False
 
 
+def instance_domain_id():
+    return 'default'
+
+
 def instance_empty_default_hostname():
     return False
 
 
+def instance_endpoint_interface():
+    return 'public'
+
+
 def instance_exclude_network_ids():
     return []
 
@@ -128,6 +136,10 @@ def instance_use_legacy_auth_encoding():
     return True
 
 
+def instance_use_legacy_check_version():
+    return False
+
+
 def instance_use_shortname():
     return False
 
diff --git a/openstack_controller/datadog_checks/openstack_controller/config_models/instance.py b/openstack_controller/datadog_checks/openstack_controller/config_models/instance.py
index 1ff04581e13d5..41ccb540570c1 100644
--- a/openstack_controller/datadog_checks/openstack_controller/config_models/instance.py
+++ b/openstack_controller/datadog_checks/openstack_controller/config_models/instance.py
@@ -10,9 +10,9 @@
 from __future__ import annotations
 
 from types import MappingProxyType
-from typing import Any, Optional
+from typing import Any, Optional, Union
 
-from pydantic import BaseModel, ConfigDict, field_validator, model_validator
+from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
 
 from datadog_checks.base.utils.functions import identity
 from datadog_checks.base.utils.models import validation
@@ -29,6 +29,267 @@ class AuthToken(BaseModel):
     writer: Optional[MappingProxyType[str, Any]] = None
 
 
+class IncludeItem(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    name: Optional[str] = None
+    uptime: Optional[bool] = None
+
+
+class Node(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, IncludeItem], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of nodes to be processed.\n')
+
+
+class BaremetalItem(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    conductors: Optional[bool] = None
+    nodes: Optional[Union[bool, Node]] = None
+
+
+class Hypervisor(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, IncludeItem], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of hypervisors to be processed.\n')
+
+
+class IncludeItem2(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    diagnostics: Optional[bool] = None
+    flavors: Optional[bool] = None
+    name: Optional[str] = None
+
+
+class Server(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, IncludeItem2], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of servers to be processed.\n')
+
+
+class ComputeItem(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    flavors: Optional[bool] = None
+    hypervisors: Optional[Union[bool, Hypervisor]] = None
+    limits: Optional[bool] = None
+    quota_sets: Optional[bool] = None
+    servers: Optional[Union[bool, Server]] = None
+    services: Optional[bool] = None
+
+
+class IdentityItem(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    domains: Optional[bool] = None
+    groups: Optional[bool] = None
+    limits: Optional[bool] = None
+    projects: Optional[bool] = None
+    regions: Optional[bool] = None
+    services: Optional[bool] = None
+    users: Optional[bool] = None
+
+
+class IncludeItem3(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    id: Optional[str] = None
+    stats: Optional[bool] = None
+
+
+class AmphoraeItem(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, IncludeItem3], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of amphorae to be processed.\n')
+
+
+class IncludeItem4(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    name: Optional[str] = None
+
+
+class Healthmonitor(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, IncludeItem4], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of healthmonitors to be processed.\n')
+
+
+class IncludeItem5(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    name: Optional[str] = None
+    stats: Optional[bool] = None
+
+
+class Listener(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, IncludeItem5], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of listeners to be processed.\n')
+
+
+class Loadbalancer(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, IncludeItem5], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of loadbalancers to be processed.\n')
+
+
+class IncludeItem8(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    name: Optional[str] = None
+
+
+class Member(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, IncludeItem8], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of members to be processed.\n')
+
+
+class IncludeItem7(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    members: Optional[Union[bool, Member]] = None
+    name: Optional[str] = None
+
+
+class Pool(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    include: Optional[tuple[Union[str, IncludeItem7], ...]] = None
+    limit: Optional[int] = Field(None, description='Maximum number of pools to be processed.\n')
+
+
+class IncludeItem9(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    name: Optional[str] = None
+
+
+class Quota(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, IncludeItem9], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of quotas to be processed.\n')
+
+
+class LoadBalancerItem(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    amphorae: Optional[Union[bool, AmphoraeItem]] = None
+    healthmonitors: Optional[Union[bool, Healthmonitor]] = None
+    listeners: Optional[Union[bool, Listener]] = None
+    loadbalancers: Optional[Union[bool, Loadbalancer]] = None
+    pools: Optional[Union[bool, Pool]] = None
+    quotas: Optional[Union[bool, Quota]] = None
+
+
+class Network(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, IncludeItem9], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of networks to be processed.\n')
+
+
+class NetworkItem(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    agents: Optional[bool] = None
+    networks: Optional[Union[bool, Network]] = None
+    quotas: Optional[bool] = None
+
+
+class Components(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    baremetal: Optional[Union[bool, BaremetalItem]] = None
+    block_storage: Optional[Union[bool, MappingProxyType[str, Any]]] = Field(None, alias='block-storage')
+    compute: Optional[Union[bool, ComputeItem]] = None
+    identity: Optional[Union[bool, IdentityItem]] = None
+    load_balancer: Optional[Union[bool, LoadBalancerItem]] = Field(None, alias='load-balancer')
+    network: Optional[Union[bool, NetworkItem]] = None
+
+
 class MetricPatterns(BaseModel):
     model_config = ConfigDict(
         arbitrary_types_allowed=True,
@@ -38,6 +299,17 @@ class MetricPatterns(BaseModel):
     include: Optional[tuple[str, ...]] = None
 
 
+class Projects(BaseModel):
+    model_config = ConfigDict(
+        arbitrary_types_allowed=True,
+        frozen=True,
+    )
+    exclude: Optional[tuple[str, ...]] = None
+    include: Optional[tuple[Union[str, MappingProxyType[str, Any]], ...]] = None
+    interval: Optional[int] = None
+    limit: Optional[int] = Field(None, description='Maximum number of clusters to be processed.\n')
+
+
 class Proxy(BaseModel):
     model_config = ConfigDict(
         arbitrary_types_allowed=True,
@@ -67,13 +339,18 @@ class InstanceConfig(BaseModel):
     collect_project_metrics: Optional[bool] = None
     collect_server_diagnostic_metrics: Optional[bool] = None
     collect_server_flavor_metrics: Optional[bool] = None
+    components: Optional[Components] = None
     connect_timeout: Optional[float] = None
     disable_generic_tags: Optional[bool] = None
+    domain_id: Optional[str] = None
     empty_default_hostname: Optional[bool] = None
+    endpoint_interface: Optional[str] = None
+    endpoint_region_id: Optional[str] = None
     exclude_network_ids: Optional[tuple[str, ...]] = None
     exclude_server_ids: Optional[tuple[str, ...]] = None
     extra_headers: Optional[MappingProxyType[str, Any]] = None
     headers: Optional[MappingProxyType[str, Any]] = None
+    ironic_microversion: Optional[str] = None
     kerberos_auth: Optional[str] = None
     kerberos_cache: Optional[str] = None
     kerberos_delegate: Optional[bool] = None
@@ -86,12 +363,14 @@ class InstanceConfig(BaseModel):
     metric_patterns: Optional[MetricPatterns] = None
     min_collection_interval: Optional[float] = None
     name: Optional[str] = None
+    nova_microversion: Optional[str] = None
     ntlm_domain: Optional[str] = None
     openstack_cloud_name: Optional[str] = None
     openstack_config_file_path: Optional[str] = None
     paginated_limit: Optional[int] = None
     password: Optional[str] = None
     persist_connections: Optional[bool] = None
+    projects: Optional[Projects] = None
     proxy: Optional[Proxy] = None
     read_timeout: Optional[float] = None
     request_size: Optional[float] = None
@@ -108,6 +387,7 @@ class InstanceConfig(BaseModel):
     tls_verify: Optional[bool] = None
     use_agent_proxy: Optional[bool] = None
     use_legacy_auth_encoding: Optional[bool] = None
+    use_legacy_check_version: Optional[bool] = None
     use_shortname: Optional[bool] = None
     user: Optional[MappingProxyType[str, Any]] = None
     username: Optional[str] = None
diff --git a/openstack_controller/datadog_checks/openstack_controller/data/conf.yaml.example b/openstack_controller/datadog_checks/openstack_controller/data/conf.yaml.example
index dcfdd6264630e..3d5bdeeb5c042 100644
--- a/openstack_controller/datadog_checks/openstack_controller/data/conf.yaml.example
+++ b/openstack_controller/datadog_checks/openstack_controller/data/conf.yaml.example
@@ -33,58 +33,28 @@ init_config:
 #
 instances:
 
-    ## @param name - string - optional
-    ## Unique identifier for this instance.
-    #
-  - name: <INSTANCE_NAME>
-
-    ## @param user - mapping - optional
-    ## Password authentication is the only auth method supported
-    ## User expects username, password, and user domain id
-    ## `user` should resolve to a structure like
-    ## {'password': '<PASSWORD>', 'name': '<USER_NAME>', 'domain': {'id': '<DOMAIN_ID>'}}
-    ## The check uses the Unscoped token method to collect information about all available projects to the user.
-    #
-    user:
-      password: <PASSWORD>
-      name: <USER_NAME>
-      domain:
-        id: <DOMAIN_ID>
-
-    ## @param whitelist_project_names - list of strings - optional - default: []
-    ## IDs of projects to whitelist for monitoring (by default the agent collects limit metrics from all projects)
-    ## Regex expressions for the project names are supported.
-    ## Blacklist takes precedence over whitelist in case of overlap.
-    #
-    # whitelist_project_names:
-    #   - <PROJECT_NAME>
-    #   - <PROJECT_PREFIX>*
-
-    ## @param blacklist_project_names - list of strings - optional - default: []
-    ## IDs of projects to blacklist for monitoring (by default the agent collects limit metrics from all projects)
-    ## Regex expressions for the project names are supported.
-    ## Blacklist takes precedence over whitelist in case of overlap.
-    #
-    # blacklist_project_names:
-    #   - <PROJECT_NAME>
-    #   - <PROJECT_PREFIX>*
-
-    ## @param exclude_server_ids - list of strings - optional - default: []
-    ## IDs of servers to exclude from monitoring. (by default the agent collects metrics from all guest servers)
-    ## Regex expressions for the server IDs are supported.
-    #
-    # exclude_server_ids:
-    #   - <SERVER_ID>
-    #   - <SERVER_ID_PREFIX>*
-
-    ## @param exclude_network_ids - list of strings - optional - default: []
-    ## IDs of networks to exclude from monitoring (by default the agent collects metrics from networks returned by the
-    ## neutron:get_networks operation)
-    ## Regex expressions for the network IDs to exclude are supported.
-    #
-    # exclude_network_ids:
-    #   - <NETWORK_ID>
-    #   - <NETWORK_ID_PREFIX>*
+  -
+    ## @param use_legacy_check_version - boolean - optional - default: false
+    ## For backward compatibility reasons, it is possible to use a deprecated version of the Openstack Controller
+    ## integration by setting this field to "true".
+    #
+    # use_legacy_check_version: false
+
+    ## @param username - string - optional
+    ## The User name used to connect to Openstack.
+    #
+    # username: admin
+
+    ## @param password - string - optional
+    ## The Password used to connect to Openstack.
+    #
+    # password: <PASSWORD>
+
+    ## @param domain_id - string - optional - default: default
+    ## The domain ID used to connect to Openstack. If not specified, the check will
+    ## use the "default" Domain ID
+    #
+    # domain_id: default
 
     ## @param use_agent_proxy - boolean - optional - default: true
     ## Whether the dd-agent proxy should also be used for openstack API requests (if set).
@@ -115,48 +85,99 @@ instances:
     #
     # keystone_server_url: https://<KEYSTONE_ENDPOINT>:<PORT>/
 
-    ## @param collect_hypervisor_load - boolean - optional - default: true
-    ## Collects hypervisor_load.1/5/15 for each hypervisor
-    ## Disabled by default to increase performance of the check.
-    ## With this enabled there is an extra N requests per check run (N = # of hypervisors)
-    ## If the Agent is installed on each hypervisor, this metric is available as system.load.1/5/15
+    ## @param ironic_microversion - string - optional
+    ## The microversion of the Ironic (Bare Metal) API to call.
+    ## It is recommended to set this parameter to the latest Ironic microversion supported by your Openstack version.
+    ##
+    ## View this page for more about Ironic microvoersion compatibility:
+    ##    https://docs.openstack.org/ironic/latest/contributor/webapi-version-history.html
     #
-    # collect_hypervisor_load: true
+    ironic_microversion: '1.80'
 
-    ## @param collect_hypervisor_metrics - boolean - optional - default: true
-    ## Collects hypervisor metrics (including hypervisor_load).
+    ## @param nova_microversion - string - optional
+    ## The microversion of the Nova (Compute) API to call.
+    ## It is recommended to set this parameter to the latest Compute microversion supported by your Openstack version.
+    ## View this page for more about Compute microvoersion compatibility:
+    ##    https://docs.openstack.org/nova/latest/reference/api-microversion-history.html
+    ## View this page for more information about microversions in Openstack:
+    ##    https://docs.openstack.org/api-guide/compute/microversions.html
     #
-    # collect_hypervisor_metrics: true
+    nova_microversion: '2.93'
 
-    ## @param collect_project_metrics - boolean - optional - default: true
-    ## The admin user defined for Datadog starts with a "default" project.
-    ## If this option is disabled, project limits metrics are only collected from projects the
-    ## datadog defined user has access to view.
+    ## @param use_shortname - boolean - optional - default: false
+    ## In some OpenStack environments, the hostname registered to Nova is the shortname.
+    ## Enabling this enforces the check to split the hostname up to the first period when
+    ## comparing against nova responses. Only affects aggregate tagging.
     #
-    # collect_project_metrics: true
+    # use_shortname: false
 
-    ## @param collect_network_metrics - boolean - optional - default: true
-    ## Collects network metrics.
+    ## @param endpoint_interface - string - optional - default: public
+    ## Indicates the visibility scope of the component's endpoints to use. The possible values are:
+    ##   public: This endpoint is accessible from outside the cloud and typically denotes a public-facing URL or 
+    ##       IP address.
+    ##   internal: This endpoint is typically used for communication between services within the cloud 
+    ##       infrastructure itself.
+    ##       It may be an internal IP or hostname that's not accessible from outside the cloud.  
+    ##   admin: This endpoint is specifically for administrative tasks and may have extended privileges or 
+    ##       functionality compared to the public and internal endpoints.
+    ##       It's meant for cloud operators or administrators.
     #
-    # collect_network_metrics: true
+    # endpoint_interface: internal
 
-    ## @param collect_server_flavor_metrics - boolean - optional - default: true
-    ## Collect server flavor metrics.
+    ## @param endpoint_region_id - string - optional
+    ## The region_id that will be used to filter the endpoints to use for each component.
     #
-    # collect_server_flavor_metrics: true
+    # endpoint_region_id: <ENDPOINT_REGION_ID>
 
-    ## @param collect_server_diagnostic_metrics - boolean - optional - default: true
-    ## Collect server diagnostic metrics. Enabling this may result in performance decrease.
-    ## This is fine for small deployments. For large deployment, turn it off and install the agent on VMs directly.
+    ## @param components - mapping - optional
+    ## General configuration that we want to apply to each of the components and their different metric blocks.
     #
-    # collect_server_diagnostic_metrics: true
+    # components:
+    #   compute: false
 
-    ## @param use_shortname - boolean - optional - default: false
-    ## In some OpenStack environments, the hostname registered to Nova is the shortname.
-    ## Enabling this enforces the check to split the hostname up to the first period when
-    ## comparing against nova responses. Only affects aggregate tagging.
-    #
-    # use_shortname: false
+    ## @param projects - mapping - optional
+    ## Optional configuration to indicate the projects that we want to be processed. If not configured,
+    ## all projects will be processed.
+    ##
+    ## The 'include' key will indicate the regular expressions of the projects for which metrics are to be reported
+    ## and the configuration to be applied to each of them. Each group may have a 'components'-like configuration,
+    ## enabling or disabling components or metrics. For further details see previous section 'components'.
+    ## If no configuration associated with the key is indicated
+    ## with the regular expression, they will be processed with the default configuration.
+    ##
+    ## The projects will be processed in the order indicated in the 'include'.
+    ## If a projects is matched on an 'include' key, it will only be processed there and not in a later 'include'
+    ## that it might match on.
+    ##
+    ## The 'exclude' key will indicate the regular expressions of those projects for which metrics
+    ## are not to be reported.
+    ## The excludes will have priority over the includes, that is, if a projects matches an exclude, it will not be
+    ## processed even if it matches an include.
+    ##
+    ## The 'limit' key will allow limiting the number of projects processed to avoid a combinatorial explosion of tags
+    ## associated with a metric.
+    ##
+    ## The 'interval' key will indicate the validity time of the last list of projects obtained through the endpoint.
+    ## If 'interval' is not indicated, the list of projects will be obtained each time the check is executed
+    ## and will not be cached.
+    ##
+    ## In the following example, all projects will be processed except those whose name begins with 'tmp_'
+    ## up to a maximum of 10 projects.
+    ## Furthermore, the cache will be valid for 1 minute.
+    ##
+    ##   projects:
+    ##     limit: 10
+    ##     include:
+    ##       - '.*'
+    ##     exclude:
+    ##       - 'tmp_.*'
+    ##     interval: 60
+    #
+    # projects:
+    #   include:
+    #   - .*
+    #   exclude:
+    #   - tmp_.*
 
     ## @param tags - list of strings - optional
     ## A list of tags to attach to every metric and service check emitted by this instance.
@@ -167,6 +188,12 @@ instances:
     #   - <KEY_1>:<VALUE_1>
     #   - <KEY_2>:<VALUE_2>
 
+    ## @param min_collection_interval - number - optional - default: 15
+    ## This changes the collection interval of the check. For more information, see:
+    ## https://docs.datadoghq.com/developers/write_agent_check/#collection-interval
+    #
+    # min_collection_interval: 15
+
     ## @param metric_patterns - mapping - optional
     ## A mapping of metrics to include or exclude, with each entry being a regular expression.
     ##
@@ -209,16 +236,6 @@ instances:
     #
     # skip_proxy: false
 
-    ## @param username - string - optional
-    ## The username to use if services are behind basic or digest auth.
-    #
-    # username: <USERNAME>
-
-    ## @param password - string - optional
-    ## The password to use if services are behind basic or NTLM auth.
-    #
-    # password: <PASSWORD>
-
     ## @param ntlm_domain - string - optional
     ## If your services use NTLM authentication, specify
     ## the domain used in the check. For NTLM Auth, append
diff --git a/openstack_controller/datadog_checks/openstack_controller/defaults.py b/openstack_controller/datadog_checks/openstack_controller/defaults.py
new file mode 100644
index 0000000000000..e01256705b524
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/defaults.py
@@ -0,0 +1,5 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+DEFAULT_DOMAIN_ID = "default"
diff --git a/openstack_controller/datadog_checks/openstack_controller/api.py b/openstack_controller/datadog_checks/openstack_controller/legacy/api.py
similarity index 99%
rename from openstack_controller/datadog_checks/openstack_controller/api.py
rename to openstack_controller/datadog_checks/openstack_controller/legacy/api.py
index 5ac0511f1d11d..ce758ccb9c0eb 100644
--- a/openstack_controller/datadog_checks/openstack_controller/api.py
+++ b/openstack_controller/datadog_checks/openstack_controller/legacy/api.py
@@ -1,6 +1,7 @@
-# (C) Datadog, Inc. 2018-present
+# (C) Datadog, Inc. 2023-present
 # All rights reserved
 # Licensed under a 3-clause BSD style license (see LICENSE)
+
 import copy
 from os import environ
 
@@ -103,7 +104,6 @@ def connect(self, openstack_sdk_config_file_path, openstack_sdk_cloud_name):
         if openstack_sdk_config_file_path is not None:
             # Set the environment variable to the path of the config file for openstacksdk to find it
             environ["OS_CLIENT_CONFIG_FILE"] = openstack_sdk_config_file_path
-
         self.connection = connection.Connection(cloud=openstack_sdk_cloud_name)
         # Raise error if the connection failed
         self.connection.authorize()
diff --git a/openstack_controller/datadog_checks/openstack_controller/exceptions.py b/openstack_controller/datadog_checks/openstack_controller/legacy/exceptions.py
similarity index 95%
rename from openstack_controller/datadog_checks/openstack_controller/exceptions.py
rename to openstack_controller/datadog_checks/openstack_controller/legacy/exceptions.py
index 2dbd94bba899e..400c015d84209 100644
--- a/openstack_controller/datadog_checks/openstack_controller/exceptions.py
+++ b/openstack_controller/datadog_checks/openstack_controller/legacy/exceptions.py
@@ -1,4 +1,4 @@
-# (C) Datadog, Inc. 2018-present
+# (C) Datadog, Inc. 2023-present
 # All rights reserved
 # Licensed under a 3-clause BSD style license (see LICENSE)
 
diff --git a/openstack_controller/datadog_checks/openstack_controller/legacy/openstack_controller_legacy.py b/openstack_controller/datadog_checks/openstack_controller/legacy/openstack_controller_legacy.py
new file mode 100644
index 0000000000000..84eee7d2b435c
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/legacy/openstack_controller_legacy.py
@@ -0,0 +1,861 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+import copy
+import re
+from collections import defaultdict
+from datetime import datetime
+
+import requests
+from openstack.config.loader import OpenStackConfig
+from six import iteritems, itervalues
+
+from datadog_checks.base import AgentCheck, is_affirmative
+from datadog_checks.base.utils.common import pattern_filter
+
+from .api import ApiFactory
+from .exceptions import (
+    AuthenticationNeeded,
+    IncompleteConfig,
+    IncompleteIdentity,
+    InstancePowerOffFailure,
+    KeystoneUnreachable,
+    MissingNeutronEndpoint,
+    MissingNovaEndpoint,
+)
+from .retry import BackOffRetry
+
+SOURCE_TYPE = 'openstack'
+
+NOVA_HYPERVISOR_METRICS = [
+    'current_workload',
+    'disk_available_least',
+    'free_disk_gb',
+    'free_ram_mb',
+    'local_gb',
+    'local_gb_used',
+    'memory_mb',
+    'memory_mb_used',
+    'running_vms',
+    'vcpus',
+    'vcpus_used',
+]
+
+NOVA_SERVER_METRICS = [
+    "hdd_errors",
+    "hdd_read",
+    "hdd_read_req",
+    "hdd_write",
+    "hdd_write_req",
+    "memory",
+    "memory-actual",
+    "memory-rss",
+    "cpu0_time",
+    "vda_errors",
+    "vda_read",
+    "vda_read_req",
+    "vda_write",
+    "vda_write_req",
+]
+
+NOVA_SERVER_INTERFACE_SEGMENTS = ['_rx', '_tx']
+
+PROJECT_METRICS = {
+    "maxImageMeta": "max_image_meta",
+    "maxPersonality": "max_personality",
+    "maxPersonalitySize": "max_personality_size",
+    "maxSecurityGroupRules": "max_security_group_rules",
+    "maxSecurityGroups": "max_security_groups",
+    "maxServerMeta": "max_server_meta",
+    "maxTotalCores": "max_total_cores",
+    "maxTotalFloatingIps": "max_total_floating_ips",
+    "maxTotalInstances": "max_total_instances",
+    "maxTotalKeypairs": "max_total_keypairs",
+    "maxTotalRAMSize": "max_total_ram_size",
+    "totalImageMetaUsed": "total_image_meta_used",
+    "totalPersonalityUsed": "total_personality_used",
+    "totalPersonalitySizeUsed": "total_personality_size_used",
+    "totalSecurityGroupRulesUsed": "total_security_group_rules_used",
+    "totalSecurityGroupsUsed": "total_security_groups_used",
+    "totalServerMetaUsed": "total_server_meta_used",
+    "totalCoresUsed": "total_cores_used",
+    "totalFloatingIpsUsed": "total_floating_ips_used",
+    "totalInstancesUsed": "total_instances_used",
+    "totalKeypairsUsed": "total_keypairs_used",
+    "totalRAMUsed": "total_ram_used",
+}
+
+DIAGNOSTICABLE_STATES = ['ACTIVE']
+
+REMOVED_STATES = ['DELETED', 'SHUTOFF']
+
+SERVER_FIELDS_REQ = ['server_id', 'state', 'server_name', 'hypervisor_hostname', 'tenant_id']
+
+
+class OpenStackControllerLegacyCheck(AgentCheck):
+    HYPERVISOR_STATE_UP = 'up'
+    HYPERVISOR_STATE_DOWN = 'down'
+    NETWORK_STATE_UP = 'UP'
+
+    NETWORK_API_SC = 'openstack.neutron.api.up'
+    COMPUTE_API_SC = 'openstack.nova.api.up'
+    IDENTITY_API_SC = 'openstack.keystone.api.up'
+
+    # Service checks for individual hypervisors and networks
+    HYPERVISOR_SC = 'openstack.nova.hypervisor.up'
+    NETWORK_SC = 'openstack.neutron.network.up'
+
+    HYPERVISOR_CACHE_EXPIRY = 120  # seconds
+
+    HTTP_CONFIG_REMAPPER = {'ssl_verify': {'name': 'tls_verify'}, 'request_timeout': {'name': 'timeout'}}
+
+    def __init__(self, name, init_config, instances):
+        super(OpenStackControllerLegacyCheck, self).__init__(name, init_config, instances)
+        # We cache all api instances.
+        # This allows to cache connection if the underlying implementation support it
+        # Ex: _api = <api object>
+        self._api = None
+
+        # BackOffRetry supports multiple instances
+        self._backoff = BackOffRetry()
+
+        # Ex: servers_cache = {
+        #   'servers': {<server_id>: <server_metadata>},
+        #   'changes_since': <ISO8601 date time>
+        # }
+        self.servers_cache = {}
+
+        # Current instance name
+        self.instance_name = None
+        # Mapping of Nova-managed servers to tags for current instance name
+        self.external_host_tags = {}
+
+    def delete_api_cache(self):
+        self._api = None
+
+    def collect_networks_metrics(self, tags, network_ids, exclude_network_id_rules):
+        """
+        Collect stats for all reachable networks
+        """
+        networks = self.get_networks()
+        filtered_networks = []
+        if not network_ids:
+            # Filter out excluded networks
+            filtered_networks = [
+                network
+                for network in networks
+                if not any([re.match(exclude_id, network.get('id')) for exclude_id in exclude_network_id_rules])
+            ]
+        else:
+            for network in networks:
+                if network.get('id') in network_ids:
+                    filtered_networks.append(network)
+
+        for network in filtered_networks:
+            network_id = network.get('id')
+            service_check_tags = ['network:{}'.format(network_id)] + tags
+
+            network_name = network.get('name')
+            if network_name:
+                service_check_tags.append('network_name:{}'.format(network_name))
+
+            tenant_id = network.get('tenant_id')
+            if tenant_id:
+                service_check_tags.append('tenant_id:{}'.format(tenant_id))
+
+            if network.get('admin_state_up'):
+                self.service_check(self.NETWORK_SC, AgentCheck.OK, tags=service_check_tags)
+            else:
+                self.service_check(self.NETWORK_SC, AgentCheck.CRITICAL, tags=service_check_tags)
+
+    # Compute
+    def _parse_uptime_string(self, uptime):
+        """Parse u' 16:53:48 up 1 day, 21:34,  3 users,  load average: 0.04, 0.14, 0.19\n'"""
+        uptime = uptime.strip()
+        load_averages = uptime[uptime.find('load average:') :].split(':')[1].strip().split(',')
+        load_averages = [float(load_avg) for load_avg in load_averages]
+        return load_averages
+
+    def get_all_aggregate_hypervisors(self):
+        hypervisor_aggregate_map = {}
+        try:
+            aggregate_list = self.get_os_aggregates()
+            for v in aggregate_list:
+                for host in v['hosts']:
+                    hypervisor_aggregate_map[host] = {
+                        'aggregate': v['name'],
+                        'availability_zone': v['availability_zone'],
+                    }
+
+        except Exception as e:
+            self.warning('Unable to get the list of aggregates: %s', e)
+            raise e
+
+        return hypervisor_aggregate_map
+
+    def get_loads_for_single_hypervisor(self, hypervisor):
+        uptime = self.get_os_hypervisor_uptime(hypervisor)
+        return self._parse_uptime_string(uptime)
+
+    def collect_hypervisors_metrics(
+        self,
+        servers,
+        custom_tags=None,
+        use_shortname=False,
+        collect_hypervisor_metrics=True,
+        collect_hypervisor_load=False,
+    ):
+        """
+        Submits stats for all hypervisors registered to this control plane
+        Raises specific exceptions based on response code
+        """
+        # Create a dictionary with hypervisor hostname as key and the list of project names as value
+        hyp_project_names = defaultdict(set)
+        for server in itervalues(servers):
+            hypervisor_hostname = server.get('hypervisor_hostname')
+            if not hypervisor_hostname:
+                self.log.debug(
+                    "hypervisor_hostname is None for server %s. Check that your user is an admin user.",
+                    server['server_id'],
+                )
+            else:
+                hyp_project_names[hypervisor_hostname].add(server['project_name'])
+
+        hypervisors = self.get_os_hypervisors_detail()
+        for hyp in hypervisors:
+            self.get_stats_for_single_hypervisor(
+                hyp,
+                hyp_project_names,
+                custom_tags=custom_tags,
+                use_shortname=use_shortname,
+                collect_hypervisor_metrics=collect_hypervisor_metrics,
+                collect_hypervisor_load=collect_hypervisor_load,
+            )
+        if not hypervisors:
+            self.warning("Unable to collect any hypervisors from the Nova response.")
+
+    def get_stats_for_single_hypervisor(
+        self,
+        hyp,
+        hyp_project_names,
+        custom_tags=None,
+        use_shortname=False,
+        collect_hypervisor_metrics=True,
+        collect_hypervisor_load=True,
+    ):
+        hyp_hostname = hyp.get('hypervisor_hostname')
+        custom_tags = custom_tags or []
+        tags = [
+            'hypervisor:{}'.format(hyp_hostname),
+            'hypervisor_id:{}'.format(hyp['id']),
+            'virt_type:{}'.format(hyp['hypervisor_type']),
+            'status:{}'.format(hyp['status']),
+        ]
+
+        # add hypervisor project names as tags
+        project_names = hyp_project_names.get(hyp_hostname, set())
+        for project_name in project_names:
+            tags.append('project_name:{}'.format(project_name))
+
+        host_tags = self._get_host_aggregate_tag(hyp_hostname, use_shortname=use_shortname)
+        tags.extend(host_tags)
+        tags.extend(custom_tags)
+        service_check_tags = list(custom_tags)
+
+        hyp_state = hyp.get('state', None)
+
+        if not hyp_state:
+            self.service_check(self.HYPERVISOR_SC, AgentCheck.UNKNOWN, hostname=hyp_hostname, tags=service_check_tags)
+        elif hyp_state != self.HYPERVISOR_STATE_UP:
+            self.service_check(self.HYPERVISOR_SC, AgentCheck.CRITICAL, hostname=hyp_hostname, tags=service_check_tags)
+        else:
+            self.service_check(self.HYPERVISOR_SC, AgentCheck.OK, hostname=hyp_hostname, tags=service_check_tags)
+
+        if not collect_hypervisor_metrics:
+            return
+
+        for label, val in iteritems(hyp):
+            if label in NOVA_HYPERVISOR_METRICS:
+                metric_label = "openstack.nova.{}".format(label)
+                self.gauge(metric_label, val, tags=tags)
+
+        # This makes a request per hypervisor and only sends hypervisor_load 1/5/15
+        # Disable this by default for higher performance in a large environment
+        # If the Agent is installed on the hypervisors, system.load.1/5/15 is available as a system metric
+        if collect_hypervisor_load:
+            try:
+                load_averages = self.get_loads_for_single_hypervisor(hyp)
+            except Exception as e:
+                self.warning('Unable to get load averages for hypervisor %s: %s', hyp['id'], e)
+                load_averages = []
+            if load_averages and len(load_averages) == 3:
+                for i, avg in enumerate([1, 5, 15]):
+                    self.gauge('openstack.nova.hypervisor_load.{}'.format(avg), load_averages[i], tags=tags)
+            else:
+                self.warning("Load Averages didn't return expected values: %s", load_averages)
+
+    def get_active_servers(self, tenant_to_name):
+        query_params = {"all_tenants": True, 'status': 'ACTIVE'}
+        servers = self.get_servers_detail(query_params)
+
+        return {
+            server.get('id'): self.create_server_object(server, tenant_to_name)
+            for server in servers
+            if tenant_to_name.get(server.get('tenant_id'))
+        }
+
+    def update_servers_cache(self, cached_servers, tenant_to_name, changes_since):
+        servers = copy.deepcopy(cached_servers)
+
+        query_params = {"all_tenants": True, 'changes-since': changes_since}
+        updated_servers = self.get_servers_detail(query_params)
+
+        # For each updated servers, we update the servers cache accordingly
+        for updated_server in updated_servers:
+            updated_server_status = updated_server.get('status')
+            updated_server_id = updated_server.get('id')
+
+            if updated_server_status == 'ACTIVE':
+                # Add or update the cache
+                if tenant_to_name.get(updated_server.get('tenant_id')):
+                    servers[updated_server_id] = self.create_server_object(updated_server, tenant_to_name)
+            else:
+                # Remove from the cache if it exists
+                if updated_server_id in servers:
+                    del servers[updated_server_id]
+        return servers
+
+    def create_server_object(self, server, tenant_to_name):
+        result = {
+            'server_id': server.get('id'),
+            'state': server.get('status'),
+            'server_name': server.get('name'),
+            'hypervisor_hostname': server.get('OS-EXT-SRV-ATTR:hypervisor_hostname'),
+            'tenant_id': server.get('tenant_id'),
+            'availability_zone': server.get('OS-EXT-AZ:availability_zone'),
+            'project_name': tenant_to_name.get(server.get('tenant_id')),
+        }
+        # starting version 2.47, flavors infos are contained within the `servers/detail` endpoint
+        # See https://developer.openstack.org/api-ref/compute/
+        # ?expanded=list-servers-detailed-detail#list-servers-detailed-detail
+        # TODO: Instead of relying on the structure of the response, we could use specified versions
+        # provided in the config. Both have pros and cons.
+        flavor = server.get('flavor', {})
+        if 'id' in flavor:
+            # Available until version 2.46
+            result['flavor_id'] = flavor.get('id')
+        if 'disk' in flavor:
+            # New in version 2.47
+            result['flavor'] = self.create_flavor_object(flavor)
+        if not all(key in result for key in SERVER_FIELDS_REQ):
+            self.warning("Server %s is missing a required field. Unable to collect all metrics for this server", result)
+        return result
+
+    # Get all of the server IDs and their metadata and cache them
+    # After the first run, we will only get servers that have changed state since the last collection run
+    def populate_servers_cache(self, projects, exclude_server_id_rules):
+        # projects is being fetched from
+        # https://developer.openstack.org/api-ref/identity/v3/?expanded=list-projects-detail#list-projects
+        # It has an id (project id) and a name (project name)
+        # The id is referenced as the tenant_id in other endpoints like
+        # https://developer.openstack.org/api-ref/compute/?expanded=list-servers-detail#list-servers
+        # as mentioned in a note:
+        # "tenant_id can also be requested which is alias of project_id but that is not
+        # recommended to use as that will be removed in future."
+        tenant_to_name = {}
+        for name, p in iteritems(projects):
+            tenant_to_name[p.get('id')] = name
+
+        cached_servers = self.servers_cache.get('servers')
+        # NOTE: updated_time need to be set at the beginning of this method in order to no miss servers changes.
+        changes_since = datetime.utcnow().isoformat()
+        if cached_servers is None:
+            updated_servers = self.get_active_servers(tenant_to_name)
+        else:
+            previous_changes_since = self.servers_cache.get('changes_since')
+            updated_servers = self.update_servers_cache(cached_servers, tenant_to_name, previous_changes_since)
+
+        # Filter out excluded servers
+        servers = {}
+        for updated_server_id, updated_server in iteritems(updated_servers):
+            if not any([re.match(rule, updated_server_id) for rule in exclude_server_id_rules]):
+                servers[updated_server_id] = updated_server
+
+        # Initialize or update cache for this instance
+        self.servers_cache = {'servers': servers, 'changes_since': changes_since}
+        return servers
+
+    def collect_server_diagnostic_metrics(self, server_details, tags=None, use_shortname=False):
+        def _is_valid_metric(label):
+            return label in NOVA_SERVER_METRICS or any(seg in label for seg in NOVA_SERVER_INTERFACE_SEGMENTS)
+
+        def _is_interface_metric(label):
+            return any(seg in label for seg in NOVA_SERVER_INTERFACE_SEGMENTS)
+
+        tags = tags or []
+        tags = copy.deepcopy(tags)
+        tags.append("nova_managed_server")
+        hypervisor_hostname = server_details.get('hypervisor_hostname')
+        host_tags = self._get_host_aggregate_tag(hypervisor_hostname, use_shortname=use_shortname)
+        host_tags.append('availability_zone:{}'.format(server_details.get('availability_zone', 'NA')))
+        self.external_host_tags[server_details.get('server_name')] = host_tags
+
+        server_id = server_details.get('server_id')
+        server_name = server_details.get('server_name')
+        hypervisor_hostname = server_details.get('hypervisor_hostname')
+        project_name = server_details.get('project_name')
+
+        try:
+            server_stats = self.get_server_diagnostics(server_id)
+        except InstancePowerOffFailure as e:  # 409 response code came back for nova
+            self.log.debug("Server %s is powered off and cannot be monitored: %s", server_id, e)
+            return
+        except requests.exceptions.HTTPError as e:
+            if e.response.status_code == 404:
+                self.log.debug("Server %s is not in an ACTIVE state and cannot be monitored, %s", server_id, e)
+            else:
+                self.warning(
+                    "Received HTTP Error when reaching the Diagnostics endpoint for server %s: %s", server_name, e
+                )
+            return
+        except Exception as e:
+            self.warning("Unknown error when monitoring %s : %s", server_id, e)
+            return
+
+        if server_stats:
+            if project_name:
+                tags.append("project_name:{}".format(project_name))
+            if hypervisor_hostname:
+                tags.append("hypervisor:{}".format(hypervisor_hostname))
+            if server_name:
+                tags.append("server_name:{}".format(server_name))
+
+            # microversion pre 2.48
+            for m in server_stats:
+                if _is_interface_metric(m):
+                    # Example of interface metric
+                    # tap123456_rx_errors
+                    metric_pre = re.split("(_rx|_tx)", m)
+                    interface = "interface:{}".format(metric_pre[0])
+                    self.gauge(
+                        "openstack.nova.server.{}{}".format(metric_pre[1].replace("_", ""), metric_pre[2]),
+                        server_stats[m],
+                        tags=tags + host_tags + [interface],
+                        hostname=server_id,
+                    )
+                elif _is_valid_metric(m):
+                    self.gauge(
+                        "openstack.nova.server.{}".format(m.replace("-", "_")),
+                        server_stats[m],
+                        tags=tags + host_tags,
+                        hostname=server_id,
+                    )
+
+            # microversion post 2.48
+            # TODO: Server stats returned by newer hypervisors have a different format.
+            # https://docs.openstack.org/api-ref/compute/?expanded=show-server-diagnostics-detail
+
+    def collect_project_limit(self, project, tags=None):
+        # NOTE: starting from Version 3.10 (Queens)
+        # We can use /v3/limits (Unified Limits API) if not experimental any more.
+        def _is_valid_metric(label):
+            return label in PROJECT_METRICS
+
+        tags = tags or []
+
+        server_tags = copy.deepcopy(tags)
+        project_name = project.get('name')
+        project_id = project.get('id')
+
+        self.log.debug("Collecting metrics for project: name: %s, id: %s", project_name, project['id'])
+        server_stats = self.get_project_limits(project['id'])
+        server_tags.append('tenant_id:{}'.format(project_id))
+
+        if project_name:
+            server_tags.append('project_name:{}'.format(project_name))
+
+        try:
+            for st in server_stats:
+                if _is_valid_metric(st):
+                    metric_key = PROJECT_METRICS[st]
+                    self.gauge("openstack.nova.limits.{}".format(metric_key), server_stats[st], tags=server_tags)
+        except KeyError:
+            self.warning("Unexpected response, not submitting limits metrics for project id %s", project['id'])
+
+    def get_flavors(self):
+        query_params = {}
+        flavors = self.get_flavors_detail(query_params)
+
+        return {flavor.get('id'): self.create_flavor_object(flavor) for flavor in flavors}
+
+    @staticmethod
+    def create_flavor_object(flavor):
+        return {
+            'id': flavor.get('id'),
+            'disk': flavor.get('disk'),
+            'vcpus': flavor.get('vcpus'),
+            'ram': flavor.get('ram'),
+            'ephemeral': flavor.get('OS-FLV-EXT-DATA:ephemeral'),
+            'swap': 0 if flavor.get('swap') == '' else flavor.get('swap'),
+        }
+
+    def collect_server_flavor_metrics(self, server_details, flavors, tags=None, use_shortname=False):
+        tags = tags or []
+        tags = copy.deepcopy(tags)
+        tags.append("nova_managed_server")
+        hypervisor_hostname = server_details.get('hypervisor_hostname')
+        host_tags = self._get_host_aggregate_tag(hypervisor_hostname, use_shortname=use_shortname)
+        host_tags.append('availability_zone:{}'.format(server_details.get('availability_zone', 'NA')))
+        self.external_host_tags[server_details.get('server_name')] = host_tags
+
+        server_id = server_details.get('server_id')
+        server_name = server_details.get('server_name')
+        hypervisor_hostname = server_details.get('hypervisor_hostname')
+        project_name = server_details.get('project_name')
+
+        flavor_id = server_details.get('flavor_id')
+        if flavor_id and flavors:
+            # Available until version 2.46
+            flavor = flavors.get(flavor_id)
+        else:
+            # New in version 2.47
+            flavor = server_details.get('flavor')
+        if not flavor:
+            return
+
+        if project_name:
+            tags.append("project_name:{}".format(project_name))
+        if hypervisor_hostname:
+            tags.append("hypervisor:{}".format(hypervisor_hostname))
+        if server_name:
+            tags.append("server_name:{}".format(server_name))
+
+        self.gauge("openstack.nova.server.flavor.disk", flavor.get('disk'), tags=tags + host_tags, hostname=server_id)
+        self.gauge("openstack.nova.server.flavor.vcpus", flavor.get('vcpus'), tags=tags + host_tags, hostname=server_id)
+        self.gauge("openstack.nova.server.flavor.ram", flavor.get('ram'), tags=tags + host_tags, hostname=server_id)
+        self.gauge(
+            "openstack.nova.server.flavor.ephemeral", flavor.get('ephemeral'), tags=tags + host_tags, hostname=server_id
+        )
+        self.gauge("openstack.nova.server.flavor.swap", flavor.get('swap'), tags=tags + host_tags, hostname=server_id)
+
+    def _get_host_aggregate_tag(self, hyp_hostname, use_shortname=False):
+        tags = []
+        if not hyp_hostname:
+            return tags
+
+        hyp_hostname = hyp_hostname.split('.')[0] if use_shortname else hyp_hostname
+        aggregate_list = self.get_all_aggregate_hypervisors()
+        if hyp_hostname in aggregate_list:
+            tags.append('aggregate:{}'.format(aggregate_list[hyp_hostname].get('aggregate', "unknown")))
+            # Need to check if there is a value for availability_zone
+            # because it is possible to have an aggregate without an AZ
+            try:
+                if aggregate_list[hyp_hostname].get('availability_zone'):
+                    tags.append('availability_zone:{}'.format(aggregate_list[hyp_hostname]['availability_zone']))
+            except KeyError:
+                self.log.debug('Unable to get the availability_zone for hypervisor: %s', hyp_hostname)
+        else:
+            self.log.info(
+                'Unable to find hostname %s in aggregate list. Assuming this host is unaggregated', hyp_hostname
+            )
+
+        return tags
+
+    def _send_api_service_checks(self, keystone_server_url, tags):
+        # Nova
+        service_check_tags = ["keystone_server: {}".format(keystone_server_url)] + tags
+        try:
+            self.get_nova_endpoint()
+            self.service_check(self.COMPUTE_API_SC, AgentCheck.OK, tags=service_check_tags)
+        except (
+            requests.exceptions.HTTPError,
+            requests.exceptions.Timeout,
+            requests.exceptions.ConnectionError,
+            AuthenticationNeeded,
+            InstancePowerOffFailure,
+        ):
+            self.service_check(self.COMPUTE_API_SC, AgentCheck.CRITICAL, tags=service_check_tags)
+
+        # Neutron
+        try:
+            self.get_neutron_endpoint()
+            self.service_check(self.NETWORK_API_SC, AgentCheck.OK, tags=service_check_tags)
+        except (
+            requests.exceptions.HTTPError,
+            requests.exceptions.Timeout,
+            requests.exceptions.ConnectionError,
+            AuthenticationNeeded,
+            InstancePowerOffFailure,
+        ):
+            self.service_check(self.NETWORK_API_SC, AgentCheck.CRITICAL, tags=service_check_tags)
+
+    def init_api(self, instance_config, keystone_server_url, custom_tags):
+        """
+        Guarantees a valid auth scope for this instance, and returns it
+
+        Communicates with the identity server and initializes a new scope when one is absent, or has been forcibly
+        removed due to token expiry
+        """
+        custom_tags = custom_tags or []
+
+        if self._api is None:
+            # We are missing the entire instance scope either because it is the first time we initialize it or because
+            # authentication previously failed and got removed from the cache
+            # Let's populate it now
+            try:
+                self.log.debug("Fetching scope for instance %s", self.instance_name)
+                # Set keystone api with proper token
+                self._api = ApiFactory.create(self.log, instance_config, self.http)
+                self.service_check(
+                    self.IDENTITY_API_SC,
+                    AgentCheck.OK,
+                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
+                )
+            except KeystoneUnreachable as e:
+                self.warning(
+                    "The agent could not contact the specified identity server at `%s`. "
+                    "Are you sure it is up at that address?",
+                    keystone_server_url,
+                )
+                self.log.debug("Problem grabbing auth token: %s", e)
+                self.service_check(
+                    self.IDENTITY_API_SC,
+                    AgentCheck.CRITICAL,
+                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
+                )
+
+                # If Keystone is down/unreachable, we default the
+                # Nova and Neutron APIs to UNKNOWN since we cannot access the service catalog
+                self.service_check(
+                    self.NETWORK_API_SC,
+                    AgentCheck.UNKNOWN,
+                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
+                )
+                self.service_check(
+                    self.COMPUTE_API_SC,
+                    AgentCheck.UNKNOWN,
+                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
+                )
+
+            except MissingNovaEndpoint as e:
+                self.warning("The agent could not find a compatible Nova endpoint in your service catalog!")
+                self.log.debug("Failed to get Nova endpoint for response catalog: %s", e)
+                self.service_check(
+                    self.COMPUTE_API_SC,
+                    AgentCheck.CRITICAL,
+                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
+                )
+
+            except MissingNeutronEndpoint:
+                self.warning("The agent could not find a compatible Neutron endpoint in your service catalog!")
+                self.service_check(
+                    self.NETWORK_API_SC,
+                    AgentCheck.CRITICAL,
+                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
+                )
+
+        if self._api is None:
+            # Fast fail in the absence of an api
+            raise IncompleteConfig("Could not initialise Openstack API")
+
+    def check(self, instance):
+        self.warning(
+            "DEPRECATION NOTICE: You are using a deprecated version of the Openstack_controller integration. "
+            "To use the newer version, please update your configuration file based on the provided example. "
+            "Look for the `use_legacy_check_version` configuration option."
+        )
+        # Initialize global variable that are per instances
+        self.external_host_tags = {}
+        self.instance_name = instance.get('name')
+        if not self.instance_name:
+            # We need a instance_name to identify this instance
+            raise IncompleteConfig("Missing name")
+
+        # have we been backed off
+        if not self._backoff.should_run():
+            self.log.info('Skipping run due to exponential backoff in effect')
+            return
+
+        network_ids = instance.get('network_ids', [])
+        exclude_network_id_patterns = set(instance.get('exclude_network_ids', []))
+        exclude_network_id_rules = [re.compile(ex) for ex in exclude_network_id_patterns]
+        exclude_server_id_patterns = set(instance.get('exclude_server_ids', []))
+        exclude_server_id_rules = [re.compile(ex) for ex in exclude_server_id_patterns]
+        include_project_name_patterns = set(instance.get('whitelist_project_names', []))
+        include_project_name_rules = [re.compile(ex) for ex in include_project_name_patterns]
+        exclude_project_name_patterns = set(instance.get('blacklist_project_names', []))
+        exclude_project_name_rules = [re.compile(ex) for ex in exclude_project_name_patterns]
+
+        custom_tags = instance.get("tags", [])
+        collect_project_metrics = is_affirmative(instance.get('collect_project_metrics', True))
+        collect_hypervisor_metrics = is_affirmative(instance.get('collect_hypervisor_metrics', True))
+        collect_hypervisor_load = is_affirmative(instance.get('collect_hypervisor_load', True))
+        collect_network_metrics = is_affirmative(instance.get('collect_network_metrics', True))
+        collect_server_diagnostic_metrics = is_affirmative(instance.get('collect_server_diagnostic_metrics', True))
+        collect_server_flavor_metrics = is_affirmative(instance.get('collect_server_flavor_metrics', True))
+        use_shortname = is_affirmative(instance.get('use_shortname', False))
+
+        try:
+            # Authenticate and add the instance api to apis cache
+            keystone_server_url = self._get_keystone_server_url(instance)
+            self.init_api(instance, keystone_server_url, custom_tags)
+            if self._api is None:
+                self.log.info("No API found, make sure your admin user has access to your OpenStack projects: \n")
+                return
+
+            self.log.debug("Running check with credentials: \n")
+            self._send_api_service_checks(keystone_server_url, custom_tags)
+            # Artificial metric introduced to distinguish between old and new openstack integrations
+            self.gauge("openstack.controller", 1)
+
+            # List projects and filter them
+            # TODO: NOTE: During authentication we use /v3/auth/projects and here we use /v3/projects.
+            # TODO: These api don't seems to return the same thing however the latter contains the former.
+            # TODO: Is this expected or could we just have one call with proper config?
+            projects = self.get_projects(include_project_name_rules, exclude_project_name_rules)
+
+            if collect_project_metrics:
+                for project in itervalues(projects):
+                    self.collect_project_limit(project, custom_tags)
+
+            servers = self.populate_servers_cache(projects, exclude_server_id_rules)
+
+            self.collect_hypervisors_metrics(
+                servers,
+                custom_tags=custom_tags,
+                use_shortname=use_shortname,
+                collect_hypervisor_metrics=collect_hypervisor_metrics,
+                collect_hypervisor_load=collect_hypervisor_load,
+            )
+
+            if collect_server_diagnostic_metrics or collect_server_flavor_metrics:
+                if collect_server_diagnostic_metrics:
+                    self.log.debug("Fetching stats from %s server(s)", len(servers))
+                    for server in itervalues(servers):
+                        self.collect_server_diagnostic_metrics(server, tags=custom_tags, use_shortname=use_shortname)
+                if collect_server_flavor_metrics:
+                    if len(servers) >= 1 and 'flavor_id' in next(itervalues(servers)):
+                        self.log.debug("Fetching server flavors")
+                        # If flavors are not part of servers detail (new in version 2.47) then we need to fetch them
+                        flavors = self.get_flavors()
+                    else:
+                        flavors = None
+                    for server in itervalues(servers):
+                        self.collect_server_flavor_metrics(
+                            server, flavors, tags=custom_tags, use_shortname=use_shortname
+                        )
+
+            if collect_network_metrics:
+                self.collect_networks_metrics(custom_tags, network_ids, exclude_network_id_rules)
+
+            self.set_external_tags(self.get_external_host_tags())
+
+        except IncompleteConfig as e:
+            if isinstance(e, IncompleteIdentity):
+                self.warning(
+                    "Please specify the user via the `user` variable in your init_config.\n"
+                    "This is the user you would use to authenticate with Keystone v3 via password auth.\n"
+                    "The user should look like: "
+                    "{'password': 'my_password', 'name': 'my_name', 'domain': {'id': 'my_domain_id'}}"
+                )
+            else:
+                self.warning("Configuration Incomplete: %s! Check your openstack_controller config file", e)
+        except AuthenticationNeeded:
+            # Delete the scope, we'll populate a new one on the next run for this instance
+            self.delete_api_cache()
+        except (requests.exceptions.HTTPError, requests.exceptions.Timeout, requests.exceptions.ConnectionError) as e:
+            if isinstance(e, requests.exceptions.HTTPError) and e.response.status_code < 500:
+                self.warning("Error reaching Nova API: %s", e)
+            else:
+                # exponential backoff
+                self.do_backoff(custom_tags)
+                return
+
+        self._backoff.reset_backoff()
+
+    def do_backoff(self, tags):
+        backoff_interval, retries = self._backoff.do_backoff()
+
+        self.gauge("openstack.backoff.interval", backoff_interval, tags=tags)
+        self.gauge("openstack.backoff.retries", retries, tags=tags)
+        self.warning("There were some problems reaching the Nova API - applying exponential backoff")
+
+    # For attaching tags to hosts that are not the host running the agent
+    def get_external_host_tags(self):
+        """Returns a list of tags for every guest server that is detected by the OpenStack
+        integration.
+        List of pairs (hostname, list_of_tags)
+        """
+        self.log.debug("Collecting external_host_tags")
+        external_host_tags = []
+        for k, v in iteritems(self.external_host_tags):
+            external_host_tags.append((k, {SOURCE_TYPE: v}))
+
+        self.log.debug("Sending external_host_tags: %s", external_host_tags)
+        return external_host_tags
+
+    # Nova Proxy methods
+    def get_nova_endpoint(self):
+        return self._api.get_nova_endpoint()
+
+    def get_os_hypervisor_uptime(self, hypervisor):
+        return self._api.get_os_hypervisor_uptime(hypervisor)
+
+    def get_os_aggregates(self):
+        return self._api.get_os_aggregates()
+
+    def get_os_hypervisors_detail(self):
+        return self._api.get_os_hypervisors_detail()
+
+    def get_servers_detail(self, query_params):
+        return self._api.get_servers_detail(query_params)
+
+    def get_server_diagnostics(self, server_id):
+        return self._api.get_server_diagnostics(server_id)
+
+    def get_project_limits(self, tenant_id):
+        return self._api.get_project_limits(tenant_id)
+
+    def get_flavors_detail(self, query_params):
+        return self._api.get_flavors_detail(query_params)
+
+    # Keystone Proxy Methods
+    def get_projects(self, include_project_name_rules, exclude_project_name_rules):
+        projects = self._api.get_projects()
+        project_by_name = {}
+        for project in projects:
+            name = project.get('name')
+            project_by_name[name] = project
+        filtered_project_names = pattern_filter(
+            list(project_by_name), whitelist=include_project_name_rules, blacklist=exclude_project_name_rules
+        )
+        result = {name: v for (name, v) in iteritems(project_by_name) if name in filtered_project_names}
+        return result
+
+    # Neutron Proxy Methods
+    def get_neutron_endpoint(self):
+        return self._api.get_neutron_endpoint()
+
+    def get_networks(self):
+        return self._api.get_networks()
+
+    def _get_keystone_server_url(self, instance_config):
+        keystone_server_url = instance_config.get("keystone_server_url")
+        if keystone_server_url:
+            return keystone_server_url
+
+        openstack_config_file_path = instance_config.get("openstack_config_file_path")
+        if not openstack_config_file_path and not keystone_server_url:
+            raise IncompleteConfig("Either keystone_server_url or openstack_config_file_path need to be provided")
+
+        openstack_cloud_name = instance_config.get("openstack_cloud_name")
+        openstack_config = OpenStackConfig(load_envvars=False, config_files=[openstack_config_file_path])
+        cloud = openstack_config.get_one(cloud=openstack_cloud_name)
+        cloud_auth = cloud.get_auth()
+        if not cloud_auth or not cloud_auth.auth_url:
+            raise IncompleteConfig(
+                'No auth_url found for cloud {} in {}', openstack_cloud_name, openstack_config_file_path
+            )
+        return cloud_auth.auth_url
diff --git a/openstack_controller/datadog_checks/openstack_controller/retry.py b/openstack_controller/datadog_checks/openstack_controller/legacy/retry.py
similarity index 96%
rename from openstack_controller/datadog_checks/openstack_controller/retry.py
rename to openstack_controller/datadog_checks/openstack_controller/legacy/retry.py
index c841b7b3cee45..d9000f05699f9 100644
--- a/openstack_controller/datadog_checks/openstack_controller/retry.py
+++ b/openstack_controller/datadog_checks/openstack_controller/legacy/retry.py
@@ -1,6 +1,8 @@
-# (C) Datadog, Inc. 2018-present
+# (C) Datadog, Inc. 2023-present
 # All rights reserved
 # Licensed under a 3-clause BSD style license (see LICENSE)
+
+
 from __future__ import division
 
 import time
diff --git a/openstack_controller/datadog_checks/openstack_controller/settings.py b/openstack_controller/datadog_checks/openstack_controller/legacy/settings.py
similarity index 88%
rename from openstack_controller/datadog_checks/openstack_controller/settings.py
rename to openstack_controller/datadog_checks/openstack_controller/legacy/settings.py
index 3ab0424050bd5..43b681fb6d55f 100644
--- a/openstack_controller/datadog_checks/openstack_controller/settings.py
+++ b/openstack_controller/datadog_checks/openstack_controller/legacy/settings.py
@@ -1,4 +1,4 @@
-# (C) Datadog, Inc. 2018-present
+# (C) Datadog, Inc. 2023-present
 # All rights reserved
 # Licensed under a 3-clause BSD style license (see LICENSE)
 
diff --git a/openstack_controller/datadog_checks/openstack_controller/metrics.py b/openstack_controller/datadog_checks/openstack_controller/metrics.py
new file mode 100644
index 0000000000000..156ff0a841d69
--- /dev/null
+++ b/openstack_controller/datadog_checks/openstack_controller/metrics.py
@@ -0,0 +1,594 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+import re
+
+KEYSTONE_METRICS_PREFIX = "openstack.keystone"
+KEYSTONE_SERVICE_CHECK = f"{KEYSTONE_METRICS_PREFIX}.api.up"
+KEYSTONE_RESPONSE_TIME = f"{KEYSTONE_METRICS_PREFIX}.response_time"
+
+KEYSTONE_REGION_METRICS_PREFIX = f"{KEYSTONE_METRICS_PREFIX}.region"
+KEYSTONE_REGION_COUNT = f"{KEYSTONE_REGION_METRICS_PREFIX}.count"
+KEYSTONE_REGION_TAGS = {
+    'id': 'region_id',
+}
+KEYSTONE_REGION_METRICS = {}
+
+KEYSTONE_DOMAIN_METRICS_PREFIX = f"{KEYSTONE_METRICS_PREFIX}.domain"
+KEYSTONE_DOMAIN_COUNT = f"{KEYSTONE_DOMAIN_METRICS_PREFIX}.count"
+KEYSTONE_DOMAIN_TAGS = {
+    'id': 'domain_id',
+    'name': 'domain_name',
+}
+KEYSTONE_DOMAIN_METRICS = {
+    f"{KEYSTONE_DOMAIN_METRICS_PREFIX}.enabled": {},
+}
+
+KEYSTONE_PROJECT_METRICS_PREFIX = f"{KEYSTONE_METRICS_PREFIX}.project"
+KEYSTONE_PROJECT_COUNT = f"{KEYSTONE_PROJECT_METRICS_PREFIX}.count"
+KEYSTONE_PROJECT_TAGS = {
+    'domain_id': 'domain_id',
+    'id': 'project_id',
+    'name': 'project_name',
+}
+KEYSTONE_PROJECT_METRICS = {
+    f"{KEYSTONE_PROJECT_METRICS_PREFIX}.enabled": {},
+}
+
+KEYSTONE_USER_METRICS_PREFIX = f"{KEYSTONE_METRICS_PREFIX}.user"
+KEYSTONE_USER_COUNT = f"{KEYSTONE_USER_METRICS_PREFIX}.count"
+KEYSTONE_USER_TAGS = {
+    'domain_id': 'domain_id',
+    'id': 'user_id',
+    'name': 'user_name',
+}
+KEYSTONE_USER_METRICS = {
+    f"{KEYSTONE_USER_METRICS_PREFIX}.enabled": {},
+}
+
+KEYSTONE_GROUP_METRICS_PREFIX = f"{KEYSTONE_METRICS_PREFIX}.group"
+KEYSTONE_GROUP_COUNT = f"{KEYSTONE_GROUP_METRICS_PREFIX}.count"
+KEYSTONE_GROUP_TAGS = {
+    'domain_id': 'domain_id',
+    'id': 'group_id',
+    'name': 'group_name',
+}
+KEYSTONE_GROUP_METRICS = {}
+KEYSTONE_GROUP_USERS = f"{KEYSTONE_GROUP_METRICS_PREFIX}.users"
+
+KEYSTONE_SERVICE_METRICS_PREFIX = f"{KEYSTONE_METRICS_PREFIX}.service"
+KEYSTONE_SERVICE_COUNT = f"{KEYSTONE_SERVICE_METRICS_PREFIX}.count"
+KEYSTONE_SERVICE_TAGS = {
+    'id': 'service_id',
+    'name': 'service_name',
+    'type': 'service_type',
+}
+KEYSTONE_SERVICE_METRICS = {
+    f"{KEYSTONE_SERVICE_METRICS_PREFIX}.enabled": {},
+}
+
+KEYSTONE_REGISTERED_LIMIT_METRICS_PREFIX = f"{KEYSTONE_METRICS_PREFIX}.limit"
+KEYSTONE_REGISTERED_LIMIT_TAGS = {
+    'id': 'limit_id',
+    'region_id': 'region_id',
+    'resource_name': 'resource_name',
+    'service_id': 'service_id',
+}
+KEYSTONE_REGISTERED_LIMIT_METRICS = {
+    f"{KEYSTONE_REGISTERED_LIMIT_METRICS_PREFIX}.limit": {},
+}
+
+KEYSTONE_LIMIT_METRICS_PREFIX = f"{KEYSTONE_METRICS_PREFIX}.limit"
+KEYSTONE_LIMIT_TAGS = {
+    'domain_id': 'domain_id',
+    'id': 'limit_id',
+    'project_id': 'project_id',
+    'region_id': 'region_id',
+    'resource_name': 'resource_name',
+    'service_id': 'service_id',
+}
+KEYSTONE_LIMIT_METRICS = {
+    f"{KEYSTONE_LIMIT_METRICS_PREFIX}.limit": {},
+}
+
+NOVA_METRICS_PREFIX = "openstack.nova"
+NOVA_SERVICE_CHECK = f"{NOVA_METRICS_PREFIX}.api.up"
+NOVA_RESPONSE_TIME = f"{NOVA_METRICS_PREFIX}.response_time"
+
+NOVA_LIMITS_METRICS_PREFIX = f"{NOVA_METRICS_PREFIX}.limit"
+NOVA_LIMITS_TAGS = {}
+NOVA_LIMITS_METRICS = {
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_total_instances": {},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_total_cores": {},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_total_ram_size": {},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_server_meta": {},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_image_meta": {"max_version": "2.38"},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_personality": {"max_version": "2.56"},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_personality_size": {"max_version": "2.56"},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_total_keypairs": {},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_server_groups": {},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_server_group_members": {},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_total_floating_ips": {"max_version": "2.35"},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_security_groups": {"max_version": "2.35"},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.max_security_group_rules": {"max_version": "2.35"},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.total_ram_used": {},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.total_cores_used": {},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.total_instances_used": {},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.total_floating_ips_used": {"max_version": "2.35"},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.total_security_groups_used": {"max_version": "2.35"},
+    f"{NOVA_LIMITS_METRICS_PREFIX}.absolute.total_server_groups_used": {},
+}
+
+NOVA_SERVICES_METRICS_PREFIX = f"{NOVA_METRICS_PREFIX}.service"
+NOVA_SERVICES_COUNT = f"{NOVA_SERVICES_METRICS_PREFIX}.count"
+NOVA_SERVICES_TAGS = {
+    'id': 'service_id',
+    'binary': 'service_name',
+    'host': 'service_host',
+    'status': 'service_status',
+    'state': 'service_state',
+    'zone': 'service_zone',
+}
+NOVA_SERVICES_METRICS = {
+    f"{NOVA_SERVICES_METRICS_PREFIX}.up": {},
+}
+
+NOVA_QUOTA_SET_METRICS_PREFIX = f"{NOVA_METRICS_PREFIX}.quota_set"
+NOVA_QUOTA_SET_TAGS = {
+    'id': 'quota_id',
+}
+NOVA_QUOTA_SET_METRICS = {
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.cores",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.fixed_ips",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.floating_ips",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.injected_file_content_bytes",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.injected_file_path_bytes",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.injected_files",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.instances",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.key_pairs",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.metadata_items",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.ram",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.security_group_rules",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.security_groups",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.server_group_members",
+    f"{NOVA_QUOTA_SET_METRICS_PREFIX}.server_groups",
+}
+
+NOVA_SERVER_METRICS_PREFIX = f"{NOVA_METRICS_PREFIX}.server"
+NOVA_SERVER_COUNT = f"{NOVA_SERVER_METRICS_PREFIX}.count"
+NOVA_SERVER_TAGS = {
+    'id': 'server_id',
+    'name': 'server_name',
+    'status': 'server_status',
+    'OS-EXT-SRV-ATTR:hypervisor_hostname': 'hypervisor',
+    'OS-EXT-SRV-ATTR:instance_name': 'instance_name',
+    'OS-EXT-SRV-ATTR:hostname': 'instance_hostname',
+}
+NOVA_SERVER_METRICS = {
+    f"{NOVA_SERVER_METRICS_PREFIX}.active",
+    f"{NOVA_SERVER_METRICS_PREFIX}.error",
+}
+NOVA_SERVER_FLAVOR_METRICS_PREFIX = f"{NOVA_SERVER_METRICS_PREFIX}.flavor"
+NOVA_SERVER_FLAVOR_TAGS = {
+    'id': 'flavor_id',
+    'name': 'flavor_name',
+}
+NOVA_SERVER_FLAVOR_METRICS = {
+    f"{NOVA_SERVER_FLAVOR_METRICS_PREFIX}.vcpus",
+    f"{NOVA_SERVER_FLAVOR_METRICS_PREFIX}.ram",
+    f"{NOVA_SERVER_FLAVOR_METRICS_PREFIX}.disk",
+    f"{NOVA_SERVER_FLAVOR_METRICS_PREFIX}.os_flv_ext_data_ephemeral",
+    f"{NOVA_SERVER_FLAVOR_METRICS_PREFIX}.ephemeral",
+    f"{NOVA_SERVER_FLAVOR_METRICS_PREFIX}.swap",
+    f"{NOVA_SERVER_FLAVOR_METRICS_PREFIX}.rxtx_factor",
+}
+NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX = f"{NOVA_SERVER_METRICS_PREFIX}.diagnostic"
+NOVA_SERVER_DIAGNOSTIC_TAGS = {
+    'driver': 'server_driver',
+}
+NOVA_SERVER_DIAGNOSTIC_METRICS = {
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.cpu0_time",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.vda_read_req",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.vda_read",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.vda_write_req",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.vda_write",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.vda_errors",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_actual",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_swap_in",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_swap_out",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_major_fault",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_minor_fault",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_unused",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_available",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_usable",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_last_update",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_disk_caches",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_hugetlb_pgalloc",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_hugetlb_pgfail",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_rss",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_details.maximum",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.memory_details.used",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.uptime",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.num_cpus",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.num_nics",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.num_disks",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.rx",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.rx_packets",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.rx_errors",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.rx_drop",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.tx",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.tx_packets",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.tx_errors",
+    f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.tx_drop",
+}
+NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS_PREFIX = f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.disk_details"
+NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_TAGS = {}
+NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS = {
+    f"{NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS_PREFIX}.read_bytes",
+    f"{NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS_PREFIX}.read_requests",
+    f"{NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS_PREFIX}.write_bytes",
+    f"{NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS_PREFIX}.write_requests",
+    f"{NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS_PREFIX}.errors_count",
+}
+NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_METRICS_PREFIX = f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.cpu_details"
+NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_TAGS = {
+    'id': 'cpu_id',
+}
+NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_METRICS = {
+    f"{NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_METRICS_PREFIX}.time",
+    f"{NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_METRICS_PREFIX}.utilisation",
+}
+NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX = f"{NOVA_SERVER_DIAGNOSTIC_METRICS_PREFIX}.nic_details"
+NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_TAGS = {
+    'mac_address': 'mac_address',
+}
+NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS = {
+    f"{NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX}.rx_drop",
+    f"{NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX}.rx_errors",
+    f"{NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX}.rx_octets",
+    f"{NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX}.rx_packets",
+    f"{NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX}.rx_rate",
+    f"{NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX}.tx_drop",
+    f"{NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX}.tx_errors",
+    f"{NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX}.tx_octets",
+    f"{NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX}.tx_packets",
+    f"{NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS_PREFIX}.tx_rate",
+}
+
+NOVA_FLAVORS_METRICS_PREFIX = f"{NOVA_METRICS_PREFIX}.flavor"
+NOVA_FLAVORS_TAGS = {
+    'id': 'flavor_id',
+    'name': 'flavor_name',
+}
+NOVA_FLAVORS_METRICS = {
+    f"{NOVA_FLAVORS_METRICS_PREFIX}.vcpus",
+    f"{NOVA_FLAVORS_METRICS_PREFIX}.ram",
+    f"{NOVA_FLAVORS_METRICS_PREFIX}.disk",
+    f"{NOVA_FLAVORS_METRICS_PREFIX}.os_flv_ext_data_ephemeral",
+    f"{NOVA_FLAVORS_METRICS_PREFIX}.swap",
+    f"{NOVA_FLAVORS_METRICS_PREFIX}.rxtx_factor",
+}
+
+NOVA_HYPERVISOR_METRICS_PREFIX = f"{NOVA_METRICS_PREFIX}.hypervisor"
+NOVA_HYPERVISOR_COUNT = f"{NOVA_HYPERVISOR_METRICS_PREFIX}.count"
+NOVA_HYPERVISOR_TAGS = {
+    'id': 'hypervisor_id',
+    'hypervisor_hostname': 'hypervisor_name',
+    'hypervisor_type': 'hypervisor_type',
+    'status': 'hypervisor_status',
+    'state': 'hypervisor_state',
+}
+NOVA_HYPERVISOR_METRICS = {
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.current_workload",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.disk_available_least",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.free_disk_gb",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.free_ram_mb",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.local_gb",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.local_gb_used",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.memory_mb",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.memory_mb_used",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.running_vms",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.vcpus",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.vcpus_used",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.up",
+}
+NOVA_HYPERVISOR_UPTIME_METRICS = {
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.load_1",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.load_5",
+    f"{NOVA_HYPERVISOR_METRICS_PREFIX}.load_15",
+}
+
+NEUTRON_METRICS_PREFIX = "openstack.neutron"
+NEUTRON_SERVICE_CHECK = f"{NEUTRON_METRICS_PREFIX}.api.up"
+NEUTRON_RESPONSE_TIME = f"{NEUTRON_METRICS_PREFIX}.response_time"
+
+NEUTRON_NETWORK_METRICS_PREFIX = f"{NEUTRON_METRICS_PREFIX}.network"
+NEUTRON_NETWORK_COUNT = f"{NEUTRON_NETWORK_METRICS_PREFIX}.count"
+NEUTRON_NETWORK_TAGS = {
+    'id': 'network_id',
+    'name': 'network_name',
+    'status': 'network_status',
+}
+NEUTRON_NETWORK_METRICS = {
+    f"{NEUTRON_NETWORK_METRICS_PREFIX}.admin_state_up",
+    f"{NEUTRON_NETWORK_METRICS_PREFIX}.l2_adjacency",
+    f"{NEUTRON_NETWORK_METRICS_PREFIX}.mtu",
+    f"{NEUTRON_NETWORK_METRICS_PREFIX}.port_security_enabled",
+    f"{NEUTRON_NETWORK_METRICS_PREFIX}.shared",
+    f"{NEUTRON_NETWORK_METRICS_PREFIX}.vlan_transparent",
+    f"{NEUTRON_NETWORK_METRICS_PREFIX}.is_default",
+}
+
+NEUTRON_QUOTA_METRICS_PREFIX = f"{NEUTRON_METRICS_PREFIX}.quota"
+NEUTRON_QUOTA_TAGS = {}
+NEUTRON_QUOTA_METRICS = {
+    f"{NEUTRON_QUOTA_METRICS_PREFIX}.floatingip",
+    f"{NEUTRON_QUOTA_METRICS_PREFIX}.network",
+    f"{NEUTRON_QUOTA_METRICS_PREFIX}.port",
+    f"{NEUTRON_QUOTA_METRICS_PREFIX}.rbac_policy",
+    f"{NEUTRON_QUOTA_METRICS_PREFIX}.router",
+    f"{NEUTRON_QUOTA_METRICS_PREFIX}.security_group",
+    f"{NEUTRON_QUOTA_METRICS_PREFIX}.security_group_rule",
+    f"{NEUTRON_QUOTA_METRICS_PREFIX}.subnet",
+    f"{NEUTRON_QUOTA_METRICS_PREFIX}.subnetpool",
+}
+
+NEUTRON_AGENTS_METRICS_PREFIX = f"{NEUTRON_METRICS_PREFIX}.agent"
+NEUTRON_AGENTS_COUNT = f"{NEUTRON_AGENTS_METRICS_PREFIX}.count"
+NEUTRON_AGENTS_TAGS = {
+    'id': 'agent_id',
+    'binary': 'agent_name',
+    'host': 'agent_host',
+    'availability_zone': 'agent_availability_zone',
+    'agent_type': 'agent_type',
+}
+NEUTRON_AGENTS_METRICS = {
+    f"{NEUTRON_AGENTS_METRICS_PREFIX}.alive",
+    f"{NEUTRON_AGENTS_METRICS_PREFIX}.admin_state_up",
+}
+
+NEUTRON_GLOBAL_METRICS = NEUTRON_AGENTS_METRICS
+NEUTRON_PROJECT_METRICS = NEUTRON_NETWORK_METRICS | NEUTRON_QUOTA_METRICS
+
+CINDER_METRICS_PREFIX = "openstack.cinder"
+CINDER_SERVICE_CHECK = f"{CINDER_METRICS_PREFIX}.api.up"
+CINDER_RESPONSE_TIME = f"{CINDER_METRICS_PREFIX}.response_time"
+
+IRONIC_METRICS_PREFIX = "openstack.ironic"
+IRONIC_SERVICE_CHECK = f"{IRONIC_METRICS_PREFIX}.api.up"
+IRONIC_RESPONSE_TIME = f"{IRONIC_METRICS_PREFIX}.response_time"
+
+IRONIC_NODE_METRICS_PREFIX = f"{IRONIC_METRICS_PREFIX}.node"
+IRONIC_NODE_COUNT = f"{IRONIC_NODE_METRICS_PREFIX}.count"
+IRONIC_NODE_TAGS = {
+    'uuid': 'node_uuid',
+    'name': 'node_name',
+    'conductor_group': 'conductor_group',
+    'power_state': 'power_state',
+    'provision_state': 'provision_state',
+    'target_provision_state': 'target_provision_state',
+    'driver': 'driver',
+}
+IRONIC_NODE_METRICS = {
+    f"{IRONIC_NODE_METRICS_PREFIX}.up": {},
+}
+
+IRONIC_CONDUCTOR_METRICS_PREFIX = f"{IRONIC_METRICS_PREFIX}.conductor"
+IRONIC_CONDUCTOR_COUNT = f"{IRONIC_CONDUCTOR_METRICS_PREFIX}.count"
+IRONIC_CONDUCTOR_TAGS = {
+    'hostname': 'conductor_hostname',
+    'conductor_group': 'conductor_group',
+}
+IRONIC_CONDUCTOR_METRICS = {
+    f"{IRONIC_CONDUCTOR_METRICS_PREFIX}.up": {},
+}
+
+OCTAVIA_METRICS_PREFIX = "openstack.octavia"
+OCTAVIA_SERVICE_CHECK = f"{OCTAVIA_METRICS_PREFIX}.api.up"
+OCTAVIA_RESPONSE_TIME = f"{OCTAVIA_METRICS_PREFIX}.response_time"
+
+OCTAVIA_LOAD_BALANCER_METRICS_PREFIX = f"{OCTAVIA_METRICS_PREFIX}.loadbalancer"
+OCTAVIA_LOAD_BALANCER_COUNT = f"{OCTAVIA_LOAD_BALANCER_METRICS_PREFIX}.count"
+OCTAVIA_LOAD_BALANCER_TAGS = {
+    'id': 'loadbalancer_id',
+    'name': 'loadbalancer_name',
+    'provisioning_status': 'provisioning_status',
+    'operating_status': 'operating_status',
+    'listeners': {
+        'id': 'listener_id',
+    },
+}
+OCTAVIA_LOAD_BALANCER_METRICS = {
+    f"{OCTAVIA_LOAD_BALANCER_METRICS_PREFIX}.admin_state_up": {},
+}
+OCTAVIA_LOAD_BALANCER_STATS_METRICS_PREFIX = f"{OCTAVIA_LOAD_BALANCER_METRICS_PREFIX}.stats"
+OCTAVIA_LOAD_BALANCER_STATS_METRICS = {
+    f"{OCTAVIA_LOAD_BALANCER_STATS_METRICS_PREFIX}.active_connections": {},
+    f"{OCTAVIA_LOAD_BALANCER_STATS_METRICS_PREFIX}.bytes_in": {},
+    f"{OCTAVIA_LOAD_BALANCER_STATS_METRICS_PREFIX}.bytes_out": {},
+    f"{OCTAVIA_LOAD_BALANCER_STATS_METRICS_PREFIX}.request_errors": {},
+    f"{OCTAVIA_LOAD_BALANCER_STATS_METRICS_PREFIX}.total_connections": {},
+}
+
+OCTAVIA_LISTENER_METRICS_PREFIX = f"{OCTAVIA_METRICS_PREFIX}.listener"
+OCTAVIA_LISTENER_COUNT = f"{OCTAVIA_LISTENER_METRICS_PREFIX}.count"
+OCTAVIA_LISTENER_TAGS = {
+    'id': 'listener_id',
+    'name': 'listener_name',
+    'provisioning_status': 'provisioning_status',
+    'operating_status': 'operating_status',
+    'loadbalancers': {
+        'id': 'loadbalancer_id',
+    },
+}
+OCTAVIA_LISTENER_METRICS = {
+    f"{OCTAVIA_LISTENER_METRICS_PREFIX}.connection_limit": {},
+    f"{OCTAVIA_LISTENER_METRICS_PREFIX}.timeout_client_data": {},
+    f"{OCTAVIA_LISTENER_METRICS_PREFIX}.timeout_member_connect": {},
+    f"{OCTAVIA_LISTENER_METRICS_PREFIX}.timeout_member_data": {},
+    f"{OCTAVIA_LISTENER_METRICS_PREFIX}.timeout_tcp_inspect": {},
+}
+OCTAVIA_LISTENER_STATS_METRICS_PREFIX = f"{OCTAVIA_LISTENER_METRICS_PREFIX}.stats"
+OCTAVIA_LISTENER_STATS_METRICS = {
+    f"{OCTAVIA_LISTENER_STATS_METRICS_PREFIX}.active_connections": {},
+    f"{OCTAVIA_LISTENER_STATS_METRICS_PREFIX}.bytes_in": {},
+    f"{OCTAVIA_LISTENER_STATS_METRICS_PREFIX}.bytes_out": {},
+    f"{OCTAVIA_LISTENER_STATS_METRICS_PREFIX}.request_errors": {},
+    f"{OCTAVIA_LISTENER_STATS_METRICS_PREFIX}.total_connections": {},
+}
+
+OCTAVIA_POOL_METRICS_PREFIX = f"{OCTAVIA_METRICS_PREFIX}.pool"
+OCTAVIA_POOL_COUNT = f"{OCTAVIA_POOL_METRICS_PREFIX}.count"
+OCTAVIA_POOL_TAGS = {
+    'id': 'pool_id',
+    'name': 'pool_name',
+    'provisioning_status': 'provisioning_status',
+    'operating_status': 'operating_status',
+    'loadbalancers': {
+        'id': 'loadbalancer_id',
+    },
+    'listeners': {
+        'id': 'listener_id',
+    },
+}
+OCTAVIA_POOL_METRICS = {
+    f"{OCTAVIA_POOL_METRICS_PREFIX}.admin_state_up": {},
+}
+
+OCTAVIA_POOL_MEMBERS_METRICS_PREFIX = f"{OCTAVIA_POOL_METRICS_PREFIX}.member"
+OCTAVIA_POOL_MEMBERS_COUNT = f"{OCTAVIA_POOL_MEMBERS_METRICS_PREFIX}.count"
+OCTAVIA_POOL_MEMBERS_TAGS = {
+    'id': 'member_id',
+    'name': 'member_name',
+    'provisioning_status': 'provisioning_status',
+    'operating_status': 'operating_status',
+    'loadbalancers': {
+        'id': 'loadbalancer_id',
+    },
+    'listeners': {
+        'id': 'listener_id',
+    },
+}
+OCTAVIA_POOL_MEMBERS_METRICS = {
+    f"{OCTAVIA_POOL_MEMBERS_METRICS_PREFIX}.admin_state_up": {},
+    f"{OCTAVIA_POOL_MEMBERS_METRICS_PREFIX}.weight": {},
+}
+
+
+OCTAVIA_HEALTHMONITOR_METRICS_PREFIX = f"{OCTAVIA_METRICS_PREFIX}.healthmonitor"
+OCTAVIA_HEALTHMONITOR_COUNT = f"{OCTAVIA_HEALTHMONITOR_METRICS_PREFIX}.count"
+OCTAVIA_HEALTHMONITOR_TAGS = {
+    'id': 'healthmonitor_id',
+    'name': 'healthmonitor_name',
+    'provisioning_status': 'provisioning_status',
+    'operating_status': 'operating_status',
+    'type': 'type',
+    'pools': {
+        'id': 'pool_id',
+    },
+}
+OCTAVIA_HEALTHMONITOR_METRICS = {
+    f"{OCTAVIA_HEALTHMONITOR_METRICS_PREFIX}.admin_state_up": {},
+    f"{OCTAVIA_HEALTHMONITOR_METRICS_PREFIX}.delay": {},
+    f"{OCTAVIA_HEALTHMONITOR_METRICS_PREFIX}.timeout": {},
+    f"{OCTAVIA_HEALTHMONITOR_METRICS_PREFIX}.max_retries": {},
+    f"{OCTAVIA_HEALTHMONITOR_METRICS_PREFIX}.max_retries_down": {},
+}
+
+
+OCTAVIA_QUOTA_METRICS_PREFIX = f"{OCTAVIA_METRICS_PREFIX}.quota"
+OCTAVIA_QUOTA_COUNT = f"{OCTAVIA_QUOTA_METRICS_PREFIX}.count"
+OCTAVIA_QUOTA_TAGS = {}
+OCTAVIA_QUOTA_METRICS = {
+    f"{OCTAVIA_QUOTA_METRICS_PREFIX}.loadbalancer": {},
+    f"{OCTAVIA_QUOTA_METRICS_PREFIX}.load_balancer": {},
+    f"{OCTAVIA_QUOTA_METRICS_PREFIX}.listener": {},
+    f"{OCTAVIA_QUOTA_METRICS_PREFIX}.member": {},
+    f"{OCTAVIA_QUOTA_METRICS_PREFIX}.pool": {},
+    f"{OCTAVIA_QUOTA_METRICS_PREFIX}.healthmonitor": {},
+    f"{OCTAVIA_QUOTA_METRICS_PREFIX}.health_monitor": {},
+    f"{OCTAVIA_QUOTA_METRICS_PREFIX}.l7policy": {},
+    f"{OCTAVIA_QUOTA_METRICS_PREFIX}.l7rule": {},
+}
+
+OCTAVIA_AMPHORA_METRICS_PREFIX = f"{OCTAVIA_METRICS_PREFIX}.amphora"
+OCTAVIA_AMPHORA_COUNT = f"{OCTAVIA_AMPHORA_METRICS_PREFIX}.count"
+OCTAVIA_AMPHORA_TAGS = {
+    'id': 'amphora_id',
+    'loadbalancer_id': 'loadbalancer_id',
+    'status': 'status',
+}
+OCTAVIA_AMPHORA_METRICS = {}
+OCTAVIA_AMPHORA_STATS_METRICS_PREFIX = f"{OCTAVIA_AMPHORA_METRICS_PREFIX}.stats"
+OCTAVIA_AMPHORA_STATS_TAGS = {
+    'listener_id': 'listener_id',
+}
+OCTAVIA_AMPHORA_STATS_METRICS = {
+    f"{OCTAVIA_AMPHORA_STATS_METRICS_PREFIX}.active_connections": {},
+    f"{OCTAVIA_AMPHORA_STATS_METRICS_PREFIX}.bytes_in": {},
+    f"{OCTAVIA_AMPHORA_STATS_METRICS_PREFIX}.bytes_out": {},
+    f"{OCTAVIA_AMPHORA_STATS_METRICS_PREFIX}.request_errors": {},
+    f"{OCTAVIA_AMPHORA_STATS_METRICS_PREFIX}.total_connections": {},
+}
+
+
+def is_interface_metric(label):
+    return any(seg in label for seg in ['_rx', '_tx'])
+
+
+def get_normalized_key(key):
+    return re.sub(r'((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))', r'_\1', key).lower().replace("-", "_")
+
+
+def get_normalized_tags(data, prefix, tags):
+    normalized_tags = []
+    if isinstance(data, dict):
+        for key, value in data.items():
+            long_tag_name = f'{prefix}.{key}' if prefix else key
+            if value is not None and long_tag_name in tags:
+                if isinstance(value, list):
+                    for item in value:
+                        normalized_tags.extend(get_normalized_tags(item, None, tags[long_tag_name]))
+                else:
+                    normalized_tags.append(f'{tags[long_tag_name]}:{value}')
+            else:
+                normalized_tags.extend(get_normalized_tags(value, long_tag_name, tags))
+    return normalized_tags
+
+
+def get_normalized_metrics(data, prefix, metrics, lambda_name=None, lambda_value=None):
+    normalized_metrics = {}
+    if isinstance(data, dict):
+        for key, value in data.items():
+            long_metric_name = f'{prefix}.{get_normalized_key(key if not lambda_name else lambda_name(key))}'
+            value = value if not lambda_value else lambda_value(key, value)
+            if isinstance(value, (int, float)) and not isinstance(value, bool):
+                if long_metric_name in metrics:
+                    normalized_metrics[long_metric_name] = value
+                if is_interface_metric(key):
+                    normalized_metrics[key] = value
+            elif isinstance(value, bool):
+                if long_metric_name in metrics:
+                    normalized_metrics[long_metric_name] = 1 if value else 0
+            elif isinstance(value, str):
+                if long_metric_name in metrics:
+                    try:
+                        normalized_metrics[long_metric_name] = int(value) if value else 0
+                    except ValueError:
+                        pass
+            elif isinstance(value, type(None)):
+                if long_metric_name in metrics:
+                    normalized_metrics[long_metric_name] = 0
+            else:
+                normalized_metrics.update(
+                    get_normalized_metrics(value, long_metric_name, metrics, lambda_name, lambda_value)
+                )
+    return normalized_metrics
+
+
+def get_metrics_and_tags(data, tags, prefix, metrics, lambda_name=None, lambda_value=None):
+    return {
+        'tags': get_normalized_tags(data, None, tags),
+        'metrics': get_normalized_metrics(data, prefix, metrics, lambda_name, lambda_value),
+    }
diff --git a/openstack_controller/datadog_checks/openstack_controller/openstack_controller.py b/openstack_controller/datadog_checks/openstack_controller/openstack_controller.py
index 9e32085f0045b..a09c1d81de5aa 100644
--- a/openstack_controller/datadog_checks/openstack_controller/openstack_controller.py
+++ b/openstack_controller/datadog_checks/openstack_controller/openstack_controller.py
@@ -1,854 +1,153 @@
 # (C) Datadog, Inc. 2010-present
 # All rights reserved
 # Licensed under Simplified BSD License (see LICENSE)
-import copy
-import re
-from collections import defaultdict
-from datetime import datetime
 
-import requests
-from openstack.config.loader import OpenStackConfig
-from six import iteritems, itervalues
 
-from datadog_checks.base import AgentCheck, is_affirmative
-from datadog_checks.base.utils.common import pattern_filter
-
-from .api import ApiFactory
-from .exceptions import (
-    AuthenticationNeeded,
-    IncompleteConfig,
-    IncompleteIdentity,
-    InstancePowerOffFailure,
-    KeystoneUnreachable,
-    MissingNeutronEndpoint,
-    MissingNovaEndpoint,
-)
-from .retry import BackOffRetry
-
-SOURCE_TYPE = 'openstack'
-
-NOVA_HYPERVISOR_METRICS = [
-    'current_workload',
-    'disk_available_least',
-    'free_disk_gb',
-    'free_ram_mb',
-    'local_gb',
-    'local_gb_used',
-    'memory_mb',
-    'memory_mb_used',
-    'running_vms',
-    'vcpus',
-    'vcpus_used',
-]
-
-NOVA_SERVER_METRICS = [
-    "hdd_errors",
-    "hdd_read",
-    "hdd_read_req",
-    "hdd_write",
-    "hdd_write_req",
-    "memory",
-    "memory-actual",
-    "memory-rss",
-    "cpu0_time",
-    "vda_errors",
-    "vda_read",
-    "vda_read_req",
-    "vda_write",
-    "vda_write_req",
-]
-
-NOVA_SERVER_INTERFACE_SEGMENTS = ['_rx', '_tx']
-
-PROJECT_METRICS = {
-    "maxImageMeta": "max_image_meta",
-    "maxPersonality": "max_personality",
-    "maxPersonalitySize": "max_personality_size",
-    "maxSecurityGroupRules": "max_security_group_rules",
-    "maxSecurityGroups": "max_security_groups",
-    "maxServerMeta": "max_server_meta",
-    "maxTotalCores": "max_total_cores",
-    "maxTotalFloatingIps": "max_total_floating_ips",
-    "maxTotalInstances": "max_total_instances",
-    "maxTotalKeypairs": "max_total_keypairs",
-    "maxTotalRAMSize": "max_total_ram_size",
-    "totalImageMetaUsed": "total_image_meta_used",
-    "totalPersonalityUsed": "total_personality_used",
-    "totalPersonalitySizeUsed": "total_personality_size_used",
-    "totalSecurityGroupRulesUsed": "total_security_group_rules_used",
-    "totalSecurityGroupsUsed": "total_security_groups_used",
-    "totalServerMetaUsed": "total_server_meta_used",
-    "totalCoresUsed": "total_cores_used",
-    "totalFloatingIpsUsed": "total_floating_ips_used",
-    "totalInstancesUsed": "total_instances_used",
-    "totalKeypairsUsed": "total_keypairs_used",
-    "totalRAMUsed": "total_ram_used",
-}
-
-DIAGNOSTICABLE_STATES = ['ACTIVE']
-
-REMOVED_STATES = ['DELETED', 'SHUTOFF']
+from typing import Any, Dict, List, Type  # noqa: F401
 
-SERVER_FIELDS_REQ = ['server_id', 'state', 'server_name', 'hypervisor_hostname', 'tenant_id']
-
-
-class OpenStackControllerCheck(AgentCheck):
-    HYPERVISOR_STATE_UP = 'up'
-    HYPERVISOR_STATE_DOWN = 'down'
-    NETWORK_STATE_UP = 'UP'
-
-    NETWORK_API_SC = 'openstack.neutron.api.up'
-    COMPUTE_API_SC = 'openstack.nova.api.up'
-    IDENTITY_API_SC = 'openstack.keystone.api.up'
-
-    # Service checks for individual hypervisors and networks
-    HYPERVISOR_SC = 'openstack.nova.hypervisor.up'
-    NETWORK_SC = 'openstack.neutron.network.up'
-
-    HYPERVISOR_CACHE_EXPIRY = 120  # seconds
+from datadog_checks.base import AgentCheck, is_affirmative
+from datadog_checks.base.utils.discovery import Discovery
+from datadog_checks.openstack_controller.api.factory import make_api
+from datadog_checks.openstack_controller.components.bare_metal import BareMetal
+from datadog_checks.openstack_controller.components.block_storage import BlockStorage
+from datadog_checks.openstack_controller.components.compute import Compute
+from datadog_checks.openstack_controller.components.identity import Identity
+from datadog_checks.openstack_controller.components.load_balancer import LoadBalancer
+from datadog_checks.openstack_controller.components.network import Network
+from datadog_checks.openstack_controller.config import OpenstackConfig, normalize_discover_config_include
+
+from .config_models import ConfigMixin
+
+
+class OpenStackControllerCheck(AgentCheck, ConfigMixin):
+    def __new__(cls, name, init_config, instances):
+        # type: (Type[OpenStackControllerCheck], str, Dict[str, Any], List[Dict[str, Any]]) -> OpenStackControllerCheck
+        """For backward compatibility reasons, there are two side-by-side implementations of OpenStackControllerCheck.
+        Instantiating this class will return an instance of the legacy integration for existing users and
+        an instance of the new implementation for new users."""
+        if is_affirmative(instances[0].get('use_legacy_check_version', True)):
+            from datadog_checks.openstack_controller.legacy.openstack_controller_legacy import (
+                OpenStackControllerLegacyCheck,
+            )
 
-    HTTP_CONFIG_REMAPPER = {'ssl_verify': {'name': 'tls_verify'}, 'request_timeout': {'name': 'timeout'}}
+            return OpenStackControllerLegacyCheck(name, init_config, instances)  # type: ignore
+        return super(OpenStackControllerCheck, cls).__new__(cls)
 
     def __init__(self, name, init_config, instances):
         super(OpenStackControllerCheck, self).__init__(name, init_config, instances)
-        # We cache all api instances.
-        # This allows to cache connection if the underlying implementation support it
-        # Ex: _api = <api object>
-        self._api = None
-
-        # BackOffRetry supports multiple instances
-        self._backoff = BackOffRetry()
-
-        # Ex: servers_cache = {
-        #   'servers': {<server_id>: <server_metadata>},
-        #   'changes_since': <ISO8601 date time>
-        # }
-        self.servers_cache = {}
-
-        # Current instance name
-        self.instance_name = None
-        # Mapping of Nova-managed servers to tags for current instance name
-        self.external_host_tags = {}
-
-    def delete_api_cache(self):
-        self._api = None
-
-    def collect_networks_metrics(self, tags, network_ids, exclude_network_id_rules):
-        """
-        Collect stats for all reachable networks
-        """
-        networks = self.get_networks()
-        filtered_networks = []
-        if not network_ids:
-            # Filter out excluded networks
-            filtered_networks = [
-                network
-                for network in networks
-                if not any([re.match(exclude_id, network.get('id')) for exclude_id in exclude_network_id_rules])
-            ]
-        else:
-            for network in networks:
-                if network.get('id') in network_ids:
-                    filtered_networks.append(network)
-
-        for network in filtered_networks:
-            network_id = network.get('id')
-            service_check_tags = ['network:{}'.format(network_id)] + tags
-
-            network_name = network.get('name')
-            if network_name:
-                service_check_tags.append('network_name:{}'.format(network_name))
-
-            tenant_id = network.get('tenant_id')
-            if tenant_id:
-                service_check_tags.append('tenant_id:{}'.format(tenant_id))
-
-            if network.get('admin_state_up'):
-                self.service_check(self.NETWORK_SC, AgentCheck.OK, tags=service_check_tags)
-            else:
-                self.service_check(self.NETWORK_SC, AgentCheck.CRITICAL, tags=service_check_tags)
-
-    # Compute
-    def _parse_uptime_string(self, uptime):
-        """Parse u' 16:53:48 up 1 day, 21:34,  3 users,  load average: 0.04, 0.14, 0.19\n'"""
-        uptime = uptime.strip()
-        load_averages = uptime[uptime.find('load average:') :].split(':')[1].strip().split(',')
-        load_averages = [float(load_avg) for load_avg in load_averages]
-        return load_averages
-
-    def get_all_aggregate_hypervisors(self):
-        hypervisor_aggregate_map = {}
-        try:
-            aggregate_list = self.get_os_aggregates()
-            for v in aggregate_list:
-                for host in v['hosts']:
-                    hypervisor_aggregate_map[host] = {
-                        'aggregate': v['name'],
-                        'availability_zone': v['availability_zone'],
-                    }
-
-        except Exception as e:
-            self.warning('Unable to get the list of aggregates: %s', e)
-            raise e
-
-        return hypervisor_aggregate_map
-
-    def get_loads_for_single_hypervisor(self, hypervisor):
-        uptime = self.get_os_hypervisor_uptime(hypervisor)
-        return self._parse_uptime_string(uptime)
-
-    def collect_hypervisors_metrics(
-        self,
-        servers,
-        custom_tags=None,
-        use_shortname=False,
-        collect_hypervisor_metrics=True,
-        collect_hypervisor_load=False,
-    ):
-        """
-        Submits stats for all hypervisors registered to this control plane
-        Raises specific exceptions based on response code
-        """
-        # Create a dictionary with hypervisor hostname as key and the list of project names as value
-        hyp_project_names = defaultdict(set)
-        for server in itervalues(servers):
-            hypervisor_hostname = server.get('hypervisor_hostname')
-            if not hypervisor_hostname:
-                self.log.debug(
-                    "hypervisor_hostname is None for server %s. Check that your user is an admin user.",
-                    server['server_id'],
-                )
-            else:
-                hyp_project_names[hypervisor_hostname].add(server['project_name'])
-
-        hypervisors = self.get_os_hypervisors_detail()
-        for hyp in hypervisors:
-            self.get_stats_for_single_hypervisor(
-                hyp,
-                hyp_project_names,
-                custom_tags=custom_tags,
-                use_shortname=use_shortname,
-                collect_hypervisor_metrics=collect_hypervisor_metrics,
-                collect_hypervisor_load=collect_hypervisor_load,
-            )
-        if not hypervisors:
-            self.warning("Unable to collect any hypervisors from the Nova response.")
-
-    def get_stats_for_single_hypervisor(
-        self,
-        hyp,
-        hyp_project_names,
-        custom_tags=None,
-        use_shortname=False,
-        collect_hypervisor_metrics=True,
-        collect_hypervisor_load=True,
-    ):
-        hyp_hostname = hyp.get('hypervisor_hostname')
-        custom_tags = custom_tags or []
-        tags = [
-            'hypervisor:{}'.format(hyp_hostname),
-            'hypervisor_id:{}'.format(hyp['id']),
-            'virt_type:{}'.format(hyp['hypervisor_type']),
-            'status:{}'.format(hyp['status']),
+        self.check_initializations.append(self.init)
+
+    def init(self):
+        self.openstack_config = OpenstackConfig(self.log, self.config)
+        self.api = make_api(self.openstack_config, self.log, self.http)
+        self.identity = Identity(self)
+        self.external_tags = []
+        self.components = [
+            self.identity,
+            Compute(self),
+            Network(self),
+            BlockStorage(self),
+            BareMetal(self),
+            LoadBalancer(self),
         ]
+        self.projects_discovery = None
+        if self.config.projects:
+            config_projects_include = normalize_discover_config_include(self.config.projects, ["name"])
+            self.log.info("config_projects_include: %s", config_projects_include)
+            if config_projects_include:
+                self.projects_discovery = Discovery(
+                    lambda: self.identity.get_auth_projects(),
+                    limit=self.config.projects.limit,
+                    include=config_projects_include,
+                    exclude=self.config.projects.exclude,
+                    interval=self.config.projects.interval,
+                    key=lambda project: project.get('name'),
+                )
 
-        # add hypervisor project names as tags
-        project_names = hyp_project_names.get(hyp_hostname, set())
-        for project_name in project_names:
-            tags.append('project_name:{}'.format(project_name))
-
-        host_tags = self._get_host_aggregate_tag(hyp_hostname, use_shortname=use_shortname)
-        tags.extend(host_tags)
-        tags.extend(custom_tags)
-        service_check_tags = list(custom_tags)
-
-        hyp_state = hyp.get('state', None)
-
-        if not hyp_state:
-            self.service_check(self.HYPERVISOR_SC, AgentCheck.UNKNOWN, hostname=hyp_hostname, tags=service_check_tags)
-        elif hyp_state != self.HYPERVISOR_STATE_UP:
-            self.service_check(self.HYPERVISOR_SC, AgentCheck.CRITICAL, hostname=hyp_hostname, tags=service_check_tags)
+    def check(self, _instance):
+        self.log.info("Running check")
+        tags = ['keystone_server:{}'.format(self.api.auth_url())] + self.instance.get('tags', [])
+        if self.config.endpoint_region_id:
+            tags = tags + ['region_id:{}'.format(self.config.endpoint_region_id)]
+        self.gauge("openstack.controller", 1, tags=tags)
+        if self.identity.authorize_user():
+            self.log.info("User successfully authorized")
+            self._start_report()
+            self._report_metrics(tags)
+            self._finish_report(tags)
         else:
-            self.service_check(self.HYPERVISOR_SC, AgentCheck.OK, hostname=hyp_hostname, tags=service_check_tags)
-
-        if not collect_hypervisor_metrics:
-            return
-
-        for label, val in iteritems(hyp):
-            if label in NOVA_HYPERVISOR_METRICS:
-                metric_label = "openstack.nova.{}".format(label)
-                self.gauge(metric_label, val, tags=tags)
-
-        # This makes a request per hypervisor and only sends hypervisor_load 1/5/15
-        # Disable this by default for higher performance in a large environment
-        # If the Agent is installed on the hypervisors, system.load.1/5/15 is available as a system metric
-        if collect_hypervisor_load:
-            try:
-                load_averages = self.get_loads_for_single_hypervisor(hyp)
-            except Exception as e:
-                self.warning('Unable to get load averages for hypervisor %s: %s', hyp['id'], e)
-                load_averages = []
-            if load_averages and len(load_averages) == 3:
-                for i, avg in enumerate([1, 5, 15]):
-                    self.gauge('openstack.nova.hypervisor_load.{}'.format(avg), load_averages[i], tags=tags)
+            self.log.error("Error while authorizing user")
+
+    def _start_report(self):
+        self.external_tags = []
+        for component in self.components:
+            component.start_report()
+
+    def _report_metrics(self, tags):
+        self.log.info("Reporting metrics")
+        if self.identity.authorize_system():
+            self.log.info("User successfully authorized (system scope)")
+            self._report_global_metrics(tags)
+        else:
+            self.log.debug("Error while authorizing user (system scope)")
+        if self.projects_discovery:
+            discovered_projects = list(self.projects_discovery.get_items())
+        else:
+            discovered_projects = [
+                (None, project.get('name'), project, None) for project in self.identity.get_auth_projects()
+            ]
+        for _pattern, project_name, project, project_config in discovered_projects:
+            self.log.info("Reporting metrics for project: %s", project_name)
+            if self.identity.authorize_project(project['id']):
+                self.log.info("User successfully authorized (project scope)")
+                self._report_global_metrics(tags)
+                project_tags = tags + [
+                    f"domain_id:{project['domain_id']}",
+                    f"project_id:{project['id']}",
+                    f"project_name:{project['name']}",
+                ]
+                self._report_project_metrics(project, project_config, project_tags)
             else:
-                self.warning("Load Averages didn't return expected values: %s", load_averages)
-
-    def get_active_servers(self, tenant_to_name):
-        query_params = {"all_tenants": True, 'status': 'ACTIVE'}
-        servers = self.get_servers_detail(query_params)
-
-        return {
-            server.get('id'): self.create_server_object(server, tenant_to_name)
-            for server in servers
-            if tenant_to_name.get(server.get('tenant_id'))
-        }
-
-    def update_servers_cache(self, cached_servers, tenant_to_name, changes_since):
-        servers = copy.deepcopy(cached_servers)
-
-        query_params = {"all_tenants": True, 'changes-since': changes_since}
-        updated_servers = self.get_servers_detail(query_params)
-
-        # For each updated servers, we update the servers cache accordingly
-        for updated_server in updated_servers:
-            updated_server_status = updated_server.get('status')
-            updated_server_id = updated_server.get('id')
-
-            if updated_server_status == 'ACTIVE':
-                # Add or update the cache
-                if tenant_to_name.get(updated_server.get('tenant_id')):
-                    servers[updated_server_id] = self.create_server_object(updated_server, tenant_to_name)
+                self.log.debug("Error while authorizing user (project scope)")
+        self.log.debug("external_tags:%s", self.external_tags)
+        self.set_external_tags(self.external_tags)
+
+    def _finish_report(self, tags):
+        for component in self.components:
+            component.finish_report(tags)
+
+    def _report_global_metrics(self, tags):
+        self.log.info("Reporting global metrics")
+        global_components_config = self.instance.get('components', {})
+        for component in self.components:
+            if component.ID.value in global_components_config:
+                global_component_config = global_components_config[component.ID.value]
             else:
-                # Remove from the cache if it exists
-                if updated_server_id in servers:
-                    del servers[updated_server_id]
-        return servers
-
-    def create_server_object(self, server, tenant_to_name):
-        result = {
-            'server_id': server.get('id'),
-            'state': server.get('status'),
-            'server_name': server.get('name'),
-            'hypervisor_hostname': server.get('OS-EXT-SRV-ATTR:hypervisor_hostname'),
-            'tenant_id': server.get('tenant_id'),
-            'availability_zone': server.get('OS-EXT-AZ:availability_zone'),
-            'project_name': tenant_to_name.get(server.get('tenant_id')),
-        }
-        # starting version 2.47, flavors infos are contained within the `servers/detail` endpoint
-        # See https://developer.openstack.org/api-ref/compute/
-        # ?expanded=list-servers-detailed-detail#list-servers-detailed-detail
-        # TODO: Instead of relying on the structure of the response, we could use specified versions
-        # provided in the config. Both have pros and cons.
-        flavor = server.get('flavor', {})
-        if 'id' in flavor:
-            # Available until version 2.46
-            result['flavor_id'] = flavor.get('id')
-        if 'disk' in flavor:
-            # New in version 2.47
-            result['flavor'] = self.create_flavor_object(flavor)
-        if not all(key in result for key in SERVER_FIELDS_REQ):
-            self.warning("Server %s is missing a required field. Unable to collect all metrics for this server", result)
-        return result
-
-    # Get all of the server IDs and their metadata and cache them
-    # After the first run, we will only get servers that have changed state since the last collection run
-    def populate_servers_cache(self, projects, exclude_server_id_rules):
-        # projects is being fetched from
-        # https://developer.openstack.org/api-ref/identity/v3/?expanded=list-projects-detail#list-projects
-        # It has an id (project id) and a name (project name)
-        # The id is referenced as the tenant_id in other endpoints like
-        # https://developer.openstack.org/api-ref/compute/?expanded=list-servers-detail#list-servers
-        # as mentioned in a note:
-        # "tenant_id can also be requested which is alias of project_id but that is not
-        # recommended to use as that will be removed in future."
-        tenant_to_name = {}
-        for name, p in iteritems(projects):
-            tenant_to_name[p.get('id')] = name
-
-        cached_servers = self.servers_cache.get('servers')
-        # NOTE: updated_time need to be set at the beginning of this method in order to no miss servers changes.
-        changes_since = datetime.utcnow().isoformat()
-        if cached_servers is None:
-            updated_servers = self.get_active_servers(tenant_to_name)
-        else:
-            previous_changes_since = self.servers_cache.get('changes_since')
-            updated_servers = self.update_servers_cache(cached_servers, tenant_to_name, previous_changes_since)
-
-        # Filter out excluded servers
-        servers = {}
-        for updated_server_id, updated_server in iteritems(updated_servers):
-            if not any([re.match(rule, updated_server_id) for rule in exclude_server_id_rules]):
-                servers[updated_server_id] = updated_server
-
-        # Initialize or update cache for this instance
-        self.servers_cache = {'servers': servers, 'changes_since': changes_since}
-        return servers
-
-    def collect_server_diagnostic_metrics(self, server_details, tags=None, use_shortname=False):
-        def _is_valid_metric(label):
-            return label in NOVA_SERVER_METRICS or any(seg in label for seg in NOVA_SERVER_INTERFACE_SEGMENTS)
-
-        def _is_interface_metric(label):
-            return any(seg in label for seg in NOVA_SERVER_INTERFACE_SEGMENTS)
-
-        tags = tags or []
-        tags = copy.deepcopy(tags)
-        tags.append("nova_managed_server")
-        hypervisor_hostname = server_details.get('hypervisor_hostname')
-        host_tags = self._get_host_aggregate_tag(hypervisor_hostname, use_shortname=use_shortname)
-        host_tags.append('availability_zone:{}'.format(server_details.get('availability_zone', 'NA')))
-        self.external_host_tags[server_details.get('server_name')] = host_tags
-
-        server_id = server_details.get('server_id')
-        server_name = server_details.get('server_name')
-        hypervisor_hostname = server_details.get('hypervisor_hostname')
-        project_name = server_details.get('project_name')
-
-        try:
-            server_stats = self.get_server_diagnostics(server_id)
-        except InstancePowerOffFailure as e:  # 409 response code came back for nova
-            self.log.debug("Server %s is powered off and cannot be monitored: %s", server_id, e)
-            return
-        except requests.exceptions.HTTPError as e:
-            if e.response.status_code == 404:
-                self.log.debug("Server %s is not in an ACTIVE state and cannot be monitored, %s", server_id, e)
+                global_component_config = {}
+            report_component = True
+            if isinstance(global_component_config, bool):
+                report_component = global_component_config
+            if report_component:
+                component.report_global_metrics(global_component_config, tags)
             else:
-                self.warning(
-                    "Received HTTP Error when reaching the Diagnostics endpoint for server %s: %s", server_name, e
-                )
-            return
-        except Exception as e:
-            self.warning("Unknown error when monitoring %s : %s", server_id, e)
-            return
-
-        if server_stats:
-            if project_name:
-                tags.append("project_name:{}".format(project_name))
-            if hypervisor_hostname:
-                tags.append("hypervisor:{}".format(hypervisor_hostname))
-            if server_name:
-                tags.append("server_name:{}".format(server_name))
-
-            # microversion pre 2.48
-            for m in server_stats:
-                if _is_interface_metric(m):
-                    # Example of interface metric
-                    # tap123456_rx_errors
-                    metric_pre = re.split("(_rx|_tx)", m)
-                    interface = "interface:{}".format(metric_pre[0])
-                    self.gauge(
-                        "openstack.nova.server.{}{}".format(metric_pre[1].replace("_", ""), metric_pre[2]),
-                        server_stats[m],
-                        tags=tags + host_tags + [interface],
-                        hostname=server_id,
-                    )
-                elif _is_valid_metric(m):
-                    self.gauge(
-                        "openstack.nova.server.{}".format(m.replace("-", "_")),
-                        server_stats[m],
-                        tags=tags + host_tags,
-                        hostname=server_id,
-                    )
-
-            # microversion post 2.48
-            # TODO: Server stats returned by newer hypervisors have a different format.
-            # https://docs.openstack.org/api-ref/compute/?expanded=show-server-diagnostics-detail
-
-    def collect_project_limit(self, project, tags=None):
-        # NOTE: starting from Version 3.10 (Queens)
-        # We can use /v3/limits (Unified Limits API) if not experimental any more.
-        def _is_valid_metric(label):
-            return label in PROJECT_METRICS
-
-        tags = tags or []
-
-        server_tags = copy.deepcopy(tags)
-        project_name = project.get('name')
-        project_id = project.get('id')
-
-        self.log.debug("Collecting metrics for project: name: %s, id: %s", project_name, project['id'])
-        server_stats = self.get_project_limits(project['id'])
-        server_tags.append('tenant_id:{}'.format(project_id))
-
-        if project_name:
-            server_tags.append('project_name:{}'.format(project_name))
-
-        try:
-            for st in server_stats:
-                if _is_valid_metric(st):
-                    metric_key = PROJECT_METRICS[st]
-                    self.gauge("openstack.nova.limits.{}".format(metric_key), server_stats[st], tags=server_tags)
-        except KeyError:
-            self.warning("Unexpected response, not submitting limits metrics for project id %s", project['id'])
-
-    def get_flavors(self):
-        query_params = {}
-        flavors = self.get_flavors_detail(query_params)
-
-        return {flavor.get('id'): self.create_flavor_object(flavor) for flavor in flavors}
-
-    @staticmethod
-    def create_flavor_object(flavor):
-        return {
-            'id': flavor.get('id'),
-            'disk': flavor.get('disk'),
-            'vcpus': flavor.get('vcpus'),
-            'ram': flavor.get('ram'),
-            'ephemeral': flavor.get('OS-FLV-EXT-DATA:ephemeral'),
-            'swap': 0 if flavor.get('swap') == '' else flavor.get('swap'),
-        }
-
-    def collect_server_flavor_metrics(self, server_details, flavors, tags=None, use_shortname=False):
-        tags = tags or []
-        tags = copy.deepcopy(tags)
-        tags.append("nova_managed_server")
-        hypervisor_hostname = server_details.get('hypervisor_hostname')
-        host_tags = self._get_host_aggregate_tag(hypervisor_hostname, use_shortname=use_shortname)
-        host_tags.append('availability_zone:{}'.format(server_details.get('availability_zone', 'NA')))
-        self.external_host_tags[server_details.get('server_name')] = host_tags
-
-        server_id = server_details.get('server_id')
-        server_name = server_details.get('server_name')
-        hypervisor_hostname = server_details.get('hypervisor_hostname')
-        project_name = server_details.get('project_name')
-
-        flavor_id = server_details.get('flavor_id')
-        if flavor_id and flavors:
-            # Available until version 2.46
-            flavor = flavors.get(flavor_id)
-        else:
-            # New in version 2.47
-            flavor = server_details.get('flavor')
-        if not flavor:
-            return
-
-        if project_name:
-            tags.append("project_name:{}".format(project_name))
-        if hypervisor_hostname:
-            tags.append("hypervisor:{}".format(hypervisor_hostname))
-        if server_name:
-            tags.append("server_name:{}".format(server_name))
-
-        self.gauge("openstack.nova.server.flavor.disk", flavor.get('disk'), tags=tags + host_tags, hostname=server_id)
-        self.gauge("openstack.nova.server.flavor.vcpus", flavor.get('vcpus'), tags=tags + host_tags, hostname=server_id)
-        self.gauge("openstack.nova.server.flavor.ram", flavor.get('ram'), tags=tags + host_tags, hostname=server_id)
-        self.gauge(
-            "openstack.nova.server.flavor.ephemeral", flavor.get('ephemeral'), tags=tags + host_tags, hostname=server_id
-        )
-        self.gauge("openstack.nova.server.flavor.swap", flavor.get('swap'), tags=tags + host_tags, hostname=server_id)
-
-    def _get_host_aggregate_tag(self, hyp_hostname, use_shortname=False):
-        tags = []
-        if not hyp_hostname:
-            return tags
-
-        hyp_hostname = hyp_hostname.split('.')[0] if use_shortname else hyp_hostname
-        aggregate_list = self.get_all_aggregate_hypervisors()
-        if hyp_hostname in aggregate_list:
-            tags.append('aggregate:{}'.format(aggregate_list[hyp_hostname].get('aggregate', "unknown")))
-            # Need to check if there is a value for availability_zone
-            # because it is possible to have an aggregate without an AZ
-            try:
-                if aggregate_list[hyp_hostname].get('availability_zone'):
-                    tags.append('availability_zone:{}'.format(aggregate_list[hyp_hostname]['availability_zone']))
-            except KeyError:
-                self.log.debug('Unable to get the availability_zone for hypervisor: %s', hyp_hostname)
-        else:
-            self.log.info(
-                'Unable to find hostname %s in aggregate list. Assuming this host is unaggregated', hyp_hostname
-            )
-
-        return tags
-
-    def _send_api_service_checks(self, keystone_server_url, tags):
-        # Nova
-        service_check_tags = ["keystone_server: {}".format(keystone_server_url)] + tags
-        try:
-            self.get_nova_endpoint()
-            self.service_check(self.COMPUTE_API_SC, AgentCheck.OK, tags=service_check_tags)
-        except (
-            requests.exceptions.HTTPError,
-            requests.exceptions.Timeout,
-            requests.exceptions.ConnectionError,
-            AuthenticationNeeded,
-            InstancePowerOffFailure,
-        ):
-            self.service_check(self.COMPUTE_API_SC, AgentCheck.CRITICAL, tags=service_check_tags)
-
-        # Neutron
-        try:
-            self.get_neutron_endpoint()
-            self.service_check(self.NETWORK_API_SC, AgentCheck.OK, tags=service_check_tags)
-        except (
-            requests.exceptions.HTTPError,
-            requests.exceptions.Timeout,
-            requests.exceptions.ConnectionError,
-            AuthenticationNeeded,
-            InstancePowerOffFailure,
-        ):
-            self.service_check(self.NETWORK_API_SC, AgentCheck.CRITICAL, tags=service_check_tags)
-
-    def init_api(self, instance_config, keystone_server_url, custom_tags):
-        """
-        Guarantees a valid auth scope for this instance, and returns it
-
-        Communicates with the identity server and initializes a new scope when one is absent, or has been forcibly
-        removed due to token expiry
-        """
-        custom_tags = custom_tags or []
-
-        if self._api is None:
-            # We are missing the entire instance scope either because it is the first time we initialize it or because
-            # authentication previously failed and got removed from the cache
-            # Let's populate it now
-            try:
-                self.log.debug("Fetching scope for instance %s", self.instance_name)
-                # Set keystone api with proper token
-                self._api = ApiFactory.create(self.log, instance_config, self.http)
-                self.service_check(
-                    self.IDENTITY_API_SC,
-                    AgentCheck.OK,
-                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
-                )
-            except KeystoneUnreachable as e:
-                self.warning(
-                    "The agent could not contact the specified identity server at `%s`. "
-                    "Are you sure it is up at that address?",
-                    keystone_server_url,
-                )
-                self.log.debug("Problem grabbing auth token: %s", e)
-                self.service_check(
-                    self.IDENTITY_API_SC,
-                    AgentCheck.CRITICAL,
-                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
-                )
-
-                # If Keystone is down/unreachable, we default the
-                # Nova and Neutron APIs to UNKNOWN since we cannot access the service catalog
-                self.service_check(
-                    self.NETWORK_API_SC,
-                    AgentCheck.UNKNOWN,
-                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
-                )
-                self.service_check(
-                    self.COMPUTE_API_SC,
-                    AgentCheck.UNKNOWN,
-                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
-                )
-
-            except MissingNovaEndpoint as e:
-                self.warning("The agent could not find a compatible Nova endpoint in your service catalog!")
-                self.log.debug("Failed to get Nova endpoint for response catalog: %s", e)
-                self.service_check(
-                    self.COMPUTE_API_SC,
-                    AgentCheck.CRITICAL,
-                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
-                )
-
-            except MissingNeutronEndpoint:
-                self.warning("The agent could not find a compatible Neutron endpoint in your service catalog!")
-                self.service_check(
-                    self.NETWORK_API_SC,
-                    AgentCheck.CRITICAL,
-                    tags=["keystone_server: {}".format(keystone_server_url)] + custom_tags,
-                )
-
-        if self._api is None:
-            # Fast fail in the absence of an api
-            raise IncompleteConfig("Could not initialise Openstack API")
-
-    def check(self, instance):
-        # Initialize global variable that are per instances
-        self.external_host_tags = {}
-        self.instance_name = instance.get('name')
-        if not self.instance_name:
-            # We need a instance_name to identify this instance
-            raise IncompleteConfig("Missing name")
-
-        # have we been backed off
-        if not self._backoff.should_run():
-            self.log.info('Skipping run due to exponential backoff in effect')
-            return
-
-        network_ids = instance.get('network_ids', [])
-        exclude_network_id_patterns = set(instance.get('exclude_network_ids', []))
-        exclude_network_id_rules = [re.compile(ex) for ex in exclude_network_id_patterns]
-        exclude_server_id_patterns = set(instance.get('exclude_server_ids', []))
-        exclude_server_id_rules = [re.compile(ex) for ex in exclude_server_id_patterns]
-        include_project_name_patterns = set(instance.get('whitelist_project_names', []))
-        include_project_name_rules = [re.compile(ex) for ex in include_project_name_patterns]
-        exclude_project_name_patterns = set(instance.get('blacklist_project_names', []))
-        exclude_project_name_rules = [re.compile(ex) for ex in exclude_project_name_patterns]
-
-        custom_tags = instance.get("tags", [])
-        collect_project_metrics = is_affirmative(instance.get('collect_project_metrics', True))
-        collect_hypervisor_metrics = is_affirmative(instance.get('collect_hypervisor_metrics', True))
-        collect_hypervisor_load = is_affirmative(instance.get('collect_hypervisor_load', True))
-        collect_network_metrics = is_affirmative(instance.get('collect_network_metrics', True))
-        collect_server_diagnostic_metrics = is_affirmative(instance.get('collect_server_diagnostic_metrics', True))
-        collect_server_flavor_metrics = is_affirmative(instance.get('collect_server_flavor_metrics', True))
-        use_shortname = is_affirmative(instance.get('use_shortname', False))
-
-        try:
-            # Authenticate and add the instance api to apis cache
-            keystone_server_url = self._get_keystone_server_url(instance)
-            self.init_api(instance, keystone_server_url, custom_tags)
-            if self._api is None:
-                self.log.info("No API found, make sure your admin user has access to your OpenStack projects: \n")
-                return
-
-            self.log.debug("Running check with credentials: \n")
-            self._send_api_service_checks(keystone_server_url, custom_tags)
-            # Artificial metric introduced to distinguish between old and new openstack integrations
-            self.gauge("openstack.controller", 1)
-
-            # List projects and filter them
-            # TODO: NOTE: During authentication we use /v3/auth/projects and here we use /v3/projects.
-            # TODO: These api don't seems to return the same thing however the latter contains the former.
-            # TODO: Is this expected or could we just have one call with proper config?
-            projects = self.get_projects(include_project_name_rules, exclude_project_name_rules)
-
-            if collect_project_metrics:
-                for project in itervalues(projects):
-                    self.collect_project_limit(project, custom_tags)
-
-            servers = self.populate_servers_cache(projects, exclude_server_id_rules)
-
-            self.collect_hypervisors_metrics(
-                servers,
-                custom_tags=custom_tags,
-                use_shortname=use_shortname,
-                collect_hypervisor_metrics=collect_hypervisor_metrics,
-                collect_hypervisor_load=collect_hypervisor_load,
-            )
-
-            if collect_server_diagnostic_metrics or collect_server_flavor_metrics:
-                if collect_server_diagnostic_metrics:
-                    self.log.debug("Fetching stats from %s server(s)", len(servers))
-                    for server in itervalues(servers):
-                        self.collect_server_diagnostic_metrics(server, tags=custom_tags, use_shortname=use_shortname)
-                if collect_server_flavor_metrics:
-                    if len(servers) >= 1 and 'flavor_id' in next(itervalues(servers)):
-                        self.log.debug("Fetching server flavors")
-                        # If flavors are not part of servers detail (new in version 2.47) then we need to fetch them
-                        flavors = self.get_flavors()
-                    else:
-                        flavors = None
-                    for server in itervalues(servers):
-                        self.collect_server_flavor_metrics(
-                            server, flavors, tags=custom_tags, use_shortname=use_shortname
-                        )
-
-            if collect_network_metrics:
-                self.collect_networks_metrics(custom_tags, network_ids, exclude_network_id_rules)
-
-            self.set_external_tags(self.get_external_host_tags())
-
-        except IncompleteConfig as e:
-            if isinstance(e, IncompleteIdentity):
-                self.warning(
-                    "Please specify the user via the `user` variable in your init_config.\n"
-                    "This is the user you would use to authenticate with Keystone v3 via password auth.\n"
-                    "The user should look like: "
-                    "{'password': 'my_password', 'name': 'my_name', 'domain': {'id': 'my_domain_id'}}"
-                )
+                self.log.debug("`%s` component will not report global metrics", component.ID.value)
+
+    def _report_project_metrics(self, project, project_config, project_tags):
+        self.log.info("Reporting project metrics for project `%s`", project['name'])
+        global_components_config = self.instance.get('components', {})
+        for component in self.components:
+            if project_config and component.ID.value in project_config:
+                project_component_config = project_config[component.ID.value]
             else:
-                self.warning("Configuration Incomplete: %s! Check your openstack_controller config file", e)
-        except AuthenticationNeeded:
-            # Delete the scope, we'll populate a new one on the next run for this instance
-            self.delete_api_cache()
-        except (requests.exceptions.HTTPError, requests.exceptions.Timeout, requests.exceptions.ConnectionError) as e:
-            if isinstance(e, requests.exceptions.HTTPError) and e.response.status_code < 500:
-                self.warning("Error reaching Nova API: %s", e)
+                if component.ID.value in global_components_config:
+                    project_component_config = global_components_config[component.ID.value]
+                else:
+                    project_component_config = {}
+            report_component = True
+            if isinstance(project_component_config, bool):
+                report_component = project_component_config
+                project_component_config = {}
+            if report_component:
+                component.report_project_metrics(project, project_component_config, project_tags)
             else:
-                # exponential backoff
-                self.do_backoff(custom_tags)
-                return
-
-        self._backoff.reset_backoff()
-
-    def do_backoff(self, tags):
-        backoff_interval, retries = self._backoff.do_backoff()
-
-        self.gauge("openstack.backoff.interval", backoff_interval, tags=tags)
-        self.gauge("openstack.backoff.retries", retries, tags=tags)
-        self.warning("There were some problems reaching the Nova API - applying exponential backoff")
-
-    # For attaching tags to hosts that are not the host running the agent
-    def get_external_host_tags(self):
-        """Returns a list of tags for every guest server that is detected by the OpenStack
-        integration.
-        List of pairs (hostname, list_of_tags)
-        """
-        self.log.debug("Collecting external_host_tags")
-        external_host_tags = []
-        for k, v in iteritems(self.external_host_tags):
-            external_host_tags.append((k, {SOURCE_TYPE: v}))
-
-        self.log.debug("Sending external_host_tags: %s", external_host_tags)
-        return external_host_tags
-
-    # Nova Proxy methods
-    def get_nova_endpoint(self):
-        return self._api.get_nova_endpoint()
-
-    def get_os_hypervisor_uptime(self, hypervisor):
-        return self._api.get_os_hypervisor_uptime(hypervisor)
-
-    def get_os_aggregates(self):
-        return self._api.get_os_aggregates()
-
-    def get_os_hypervisors_detail(self):
-        return self._api.get_os_hypervisors_detail()
-
-    def get_servers_detail(self, query_params):
-        return self._api.get_servers_detail(query_params)
-
-    def get_server_diagnostics(self, server_id):
-        return self._api.get_server_diagnostics(server_id)
-
-    def get_project_limits(self, tenant_id):
-        return self._api.get_project_limits(tenant_id)
-
-    def get_flavors_detail(self, query_params):
-        return self._api.get_flavors_detail(query_params)
-
-    # Keystone Proxy Methods
-    def get_projects(self, include_project_name_rules, exclude_project_name_rules):
-        projects = self._api.get_projects()
-        project_by_name = {}
-        for project in projects:
-            name = project.get('name')
-            project_by_name[name] = project
-        filtered_project_names = pattern_filter(
-            list(project_by_name), whitelist=include_project_name_rules, blacklist=exclude_project_name_rules
-        )
-        result = {name: v for (name, v) in iteritems(project_by_name) if name in filtered_project_names}
-        return result
-
-    # Neutron Proxy Methods
-    def get_neutron_endpoint(self):
-        return self._api.get_neutron_endpoint()
-
-    def get_networks(self):
-        return self._api.get_networks()
-
-    def _get_keystone_server_url(self, instance_config):
-        keystone_server_url = instance_config.get("keystone_server_url")
-        if keystone_server_url:
-            return keystone_server_url
-
-        openstack_config_file_path = instance_config.get("openstack_config_file_path")
-        if not openstack_config_file_path and not keystone_server_url:
-            raise IncompleteConfig("Either keystone_server_url or openstack_config_file_path need to be provided")
-
-        openstack_cloud_name = instance_config.get("openstack_cloud_name")
-        openstack_config = OpenStackConfig(config_files=[openstack_config_file_path])
-        cloud = openstack_config.get_one(cloud=openstack_cloud_name)
-        cloud_auth = cloud.get_auth()
-        if not cloud_auth or not cloud_auth.auth_url:
-            raise IncompleteConfig(
-                'No auth_url found for cloud {} in {}', openstack_cloud_name, openstack_config_file_path
-            )
-        return cloud_auth.auth_url
+                self.log.debug("`%s` component will not report metrics for `%s`", component.ID.value, project['name'])
diff --git a/openstack_controller/hatch.toml b/openstack_controller/hatch.toml
index ae9924e43b754..d8a2ab8fbe9e4 100644
--- a/openstack_controller/hatch.toml
+++ b/openstack_controller/hatch.toml
@@ -5,13 +5,19 @@ python = ["3.9"]
 
 [[envs.default.matrix]]
 python = ["3.9"]
-setup = ["sandbox"]
+setup = ["legacy"]
+
+[[envs.default.matrix]]
+python = ["3.9"]
+setup = ["gcp"]
 
 [envs.default.overrides]
 name."^py3.9$".e2e-env = { value = true }
-matrix.setup.e2e-env = { value = true, if = ["sandbox"], env = ["TF_VAR_google_credentials_file", "TF_VAR_google_compute_instance_name"] }
+name."^py3.9-legacy$".e2e-env = { value = true }
+matrix.setup.e2e-env = { value = true, if = ["gcp"], env = ["TF_VAR_credentials_file", "TF_VAR_instance_name", "TF_VAR_desired_status", "TF_VAR_nat_ip", "TF_VAR_network_ip", "TF_VAR_user"] }
 matrix.setup.env-vars = [
-  { key = "USE_OPENSTACK_SANDBOX", value = "true", if = ["sandbox"] },
+  { key = "USE_OPENSTACK_GCP", value = "true", if = ["gcp"] },
+  { key = "OPENSTACK_E2E_LEGACY", value = "true", if = ["legacy"] },
 ]
 
 [envs.default]
diff --git a/openstack_controller/manifest.json b/openstack_controller/manifest.json
index 6df5fc5c35867..64aedb40a46b4 100644
--- a/openstack_controller/manifest.json
+++ b/openstack_controller/manifest.json
@@ -45,7 +45,8 @@
       }
     },
     "dashboards": {
-      "OpenStack Controller Overview": "assets/dashboards/openstack-controller.json"
+      "OpenStack Controller Overview [Legacy]": "assets/dashboards/openstack-controller.json",
+      "OpenStack Controller Overview [Default Microversion]": "assets/dashboards/openstack_controller_overview_[default_microversion].json"
     },
     "logs": {
       "source": "openstack"
diff --git a/openstack_controller/metadata.csv b/openstack_controller/metadata.csv
index f4a3fe1b6beb5..8c59d9024134b 100644
--- a/openstack_controller/metadata.csv
+++ b/openstack_controller/metadata.csv
@@ -1,50 +1,249 @@
 metric_name,metric_type,interval,unit_name,per_unit_name,description,orientation,integration,short_name,curated_metric
-openstack.nova.current_workload,gauge,,,,Current workload on the Nova hypervisor,-1,openstack_controller,nova workload,
-openstack.nova.disk_available_least,gauge,,gibibyte,,Disk available for the Nova hypervisor,1,openstack_controller,nova disk available,
-openstack.nova.free_disk_gb,gauge,,gibibyte,,Free disk on the Nova hypervisor,1,openstack_controller,nova free disk,
-openstack.nova.free_ram_mb,gauge,,mebibyte,,Free RAM on the Nova hypervisor,1,openstack_controller,nova free ram,
-openstack.nova.hypervisor_load.1,gauge,,,,The average hypervisor load over one minute.,-1,openstack_controller,hypervisor load 1,
-openstack.nova.hypervisor_load.5,gauge,,,,The average hypervisor load over five minutes.,-1,openstack_controller,hypervisor load 5,
-openstack.nova.hypervisor_load.15,gauge,,,,The average hypervisor load over fifteen minutes.,-1,openstack_controller,hypervisor load 15,
-openstack.nova.limits.max_image_meta,gauge,,,,The maximum allowed image metadata definitions for this tenant,0,openstack_controller,max img metadata defs,
-openstack.nova.limits.max_personality,gauge,,,,The maximum allowed personalities for this tenant,0,openstack_controller,max personality,
-openstack.nova.limits.max_personality_size,gauge,,,,The maximum size of a single personality allowed for this tenant,0,openstack_controller,max personality size,
-openstack.nova.limits.max_security_group_rules,gauge,,,,The maximum number of security group rules allowed for this tenant,0,openstack_controller,max security group rules,
-openstack.nova.limits.max_security_groups,gauge,,,,The maximum number of security groups allowed for this tenant,0,openstack_controller,max security groups,
-openstack.nova.limits.max_server_meta,gauge,,,,The maximum allowed service metadata definitions for this tenant,0,openstack_controller,max server metadata defs,
-openstack.nova.limits.max_total_cores,gauge,,,,The maximum allowed cores for this tenant,0,openstack_controller,max cores,
-openstack.nova.limits.max_total_floating_ips,gauge,,,,The maximum allowed floating IPs for this tenant,0,openstack_controller,max floating ips,
-openstack.nova.limits.max_total_instances,gauge,,,,The maximum number of instances allowed for this tenant,0,openstack_controller,max instances,
-openstack.nova.limits.max_total_keypairs,gauge,,,,The maximum allowed key pairs allowed for this tenant,0,openstack_controller,max key pairs,
-openstack.nova.limits.total_cores_used,gauge,,,,The total cores used by this tenant,-1,openstack_controller,total cores used,
-openstack.nova.limits.total_floating_ips_used,gauge,,,,The total floating IPs used by this tenant,-1,openstack_controller,floating IPs used,
-openstack.nova.limits.total_instances_used,gauge,,,,The total instances used by this tenant,-1,openstack_controller,total instances used,
-openstack.nova.limits.total_ram_used,gauge,,mebibyte,,The current RAM used by this tenant in megabytes (MB),-1,openstack_controller,ram used,
-openstack.nova.limits.total_security_groups_used,gauge,,,,The total number of security groups used by this tenant,-1,openstack_controller,total security groups used,
-openstack.nova.limits.max_total_ram_size,gauge,,mebibyte,,The max allowed RAM size for this tenant in megabytes (MB),0,openstack_controller,max ram size,
-openstack.nova.local_gb,gauge,,gibibyte,,The size in GB of the ephemeral disk present on this hypervisor host,0,openstack_controller,local gb,
-openstack.nova.local_gb_used,gauge,,gibibyte,,The size in GB of disk used on this hypervisor host,-1,openstack_controller,local gb used,
-openstack.nova.memory_mb,gauge,,mebibyte,,The size in MB of RAM present on this hypervisor host,0,openstack_controller,memory mb,
-openstack.nova.memory_mb_used,gauge,,mebibyte,,The size in MB of RAM used on this hypervisor host,0,openstack_controller,memory mb used,
-openstack.nova.running_vms,gauge,,,,Number of running VMs on this hypervisor host,0,openstack_controller,nova running vms,
+openstack.nova.current_workload,gauge,,,,Current workload on the Nova hypervisor [Legacy],-1,openstack_controller,nova workload,
+openstack.nova.disk_available_least,gauge,,gibibyte,,Disk available for the Nova hypervisor [Legacy],1,openstack_controller,nova disk available,
+openstack.nova.free_disk_gb,gauge,,gibibyte,,Free disk on the Nova hypervisor [Legacy],1,openstack_controller,nova free disk,
+openstack.nova.free_ram_mb,gauge,,mebibyte,,Free RAM on the Nova hypervisor [Legacy],1,openstack_controller,nova free ram,
+openstack.nova.hypervisor_load.1,gauge,,,,The average hypervisor load over one minute. [Legacy],-1,openstack_controller,hypervisor load 1,
+openstack.nova.hypervisor_load.5,gauge,,,,The average hypervisor load over five minutes. [Legacy],-1,openstack_controller,hypervisor load 5,
+openstack.nova.hypervisor_load.15,gauge,,,,The average hypervisor load over fifteen minutes. [Legacy],-1,openstack_controller,hypervisor load 15,
+openstack.nova.limits.max_image_meta,gauge,,,,The maximum allowed image metadata definitions for this tenant [Legacy],0,openstack_controller,max img metadata defs,
+openstack.nova.limits.max_personality,gauge,,,,The maximum allowed personalities for this tenant [Legacy],0,openstack_controller,max personality,
+openstack.nova.limits.max_personality_size,gauge,,,,The maximum size of a single personality allowed for this tenant [Legacy],0,openstack_controller,max personality size,
+openstack.nova.limits.max_security_group_rules,gauge,,,,The maximum number of security group rules allowed for this tenant [Legacy],0,openstack_controller,max security group rules,
+openstack.nova.limits.max_security_groups,gauge,,,,The maximum number of security groups allowed for this tenant [Legacy],0,openstack_controller,max security groups,
+openstack.nova.limits.max_server_meta,gauge,,,,The maximum allowed service metadata definitions for this tenant [Legacy],0,openstack_controller,max server metadata defs,
+openstack.nova.limits.max_total_cores,gauge,,,,The maximum allowed cores for this tenant [Legacy],0,openstack_controller,max cores,
+openstack.nova.limits.max_total_floating_ips,gauge,,,,The maximum allowed floating IPs for this tenant [Legacy],0,openstack_controller,max floating ips,
+openstack.nova.limits.max_total_instances,gauge,,,,The maximum number of instances allowed for this tenant [Legacy],0,openstack_controller,max instances,
+openstack.nova.limits.max_total_keypairs,gauge,,,,The maximum allowed key pairs allowed for this tenant [Legacy],0,openstack_controller,max key pairs,
+openstack.nova.limits.total_cores_used,gauge,,,,The total cores used by this tenant [Legacy],-1,openstack_controller,total cores used,
+openstack.nova.limits.total_floating_ips_used,gauge,,,,The total floating IPs used by this tenant [Legacy],-1,openstack_controller,floating IPs used,
+openstack.nova.limits.total_instances_used,gauge,,,,The total instances used by this tenant [Legacy],-1,openstack_controller,total instances used,
+openstack.nova.limits.total_ram_used,gauge,,mebibyte,,The current RAM used by this tenant in megabytes (MB) [Legacy],-1,openstack_controller,ram used,
+openstack.nova.limits.total_security_groups_used,gauge,,,,The total number of security groups used by this tenant [Legacy],-1,openstack_controller,total security groups used,
+openstack.nova.limits.max_total_ram_size,gauge,,mebibyte,,The max allowed RAM size for this tenant in megabytes (MB) [Legacy],0,openstack_controller,max ram size,
+openstack.nova.local_gb,gauge,,gibibyte,,The size in GB of the ephemeral disk present on this hypervisor host [Legacy],0,openstack_controller,local gb,
+openstack.nova.local_gb_used,gauge,,gibibyte,,The size in GB of disk used on this hypervisor host [Legacy],-1,openstack_controller,local gb used,
+openstack.nova.memory_mb,gauge,,mebibyte,,The size in MB of RAM present on this hypervisor host [Legacy],0,openstack_controller,memory mb,
+openstack.nova.memory_mb_used,gauge,,mebibyte,,The size in MB of RAM used on this hypervisor host [Legacy],0,openstack_controller,memory mb used,
+openstack.nova.running_vms,gauge,,,,Number of running VMs on this hypervisor host [Legacy],0,openstack_controller,nova running vms,
 openstack.nova.server.flavor.disk,gauge,,gibibyte,,The size of the root disk that was created for this server in GiB,1,openstack_controller,server disk available,
 openstack.nova.server.flavor.ephemeral,gauge,,gibibyte,,The size of the ephemeral disk that was created for this server in GiB,1,openstack_controller,server flavor ephemeral disk,
 openstack.nova.server.flavor.ram,gauge,,mebibyte,,The amount of RAM this server flavor has in MiB,0,openstack_controller,server flavor ram,
 openstack.nova.server.flavor.swap,gauge,,mebibyte,,The size of a dedicated swap disk that was allocated for this server in MiB,0,openstack_controller,server flavor swap,
 openstack.nova.server.flavor.vcpus,gauge,,,,The number of virtual CPUs that were allocated to the server,0,openstack_controller,server flavor vcpus,
-openstack.nova.server.hdd_errors,gauge,,,,The number of errors seen by the server when accessing an HDD device,-1,openstack_controller,total hdd errors,
-openstack.nova.server.hdd_read_req,gauge,,,,The number of read requests made to an HDD device by this server,0,openstack_controller,hdd read reqs,
-openstack.nova.server.hdd_write_req,gauge,,,,The number of write requests made to an HDD device by this server,0,openstack_controller,hdd write reqs,
-openstack.nova.server.vda_errors,gauge,,,,The number of errors seen by the server when accessing a VDA device,-1,openstack_controller,total vda errors,
-openstack.nova.server.vda_read_req,gauge,,,,The number of read requests made to a VDA device by this server,0,openstack_controller,vda read reqs,
-openstack.nova.server.vda_write_req,gauge,,,,The number of write requests made to a VDA device by this server,0,openstack_controller,vda write reqs,
-openstack.nova.server.hdd_read,gauge,,byte,,Number of bytes read from an HDD device by this server,0,openstack_controller,hdd bytes read,
-openstack.nova.server.hdd_write,gauge,,byte,,Number of bytes written to an HDD device by this server,0,openstack_controller,hdd bytes written,
-openstack.nova.server.vda_read,gauge,,byte,,Number of bytes read from a VDA device by this server,0,openstack_controller,vda bytes read,
-openstack.nova.server.vda_write,gauge,,byte,,Number of bytes written to a VDA device by this server,0,openstack_controller,vda bytes written,
-openstack.nova.server.memory,gauge,,mebibyte,,The amount of memory in MB provisioned for this server,0,openstack_controller,server memory,
-openstack.nova.server.memory_actual,gauge,,mebibyte,,The amount of memory in MB provisioned for this server,0,openstack_controller,server memory actual,
-openstack.nova.server.memory_rss,gauge,,mebibyte,,The amount of memory used by the processes of this server that is not associated with disk pages - such as stack and heap memory,0,openstack_controller,resident set size,
-openstack.nova.server.cpu0_time,gauge,,nanosecond,,CPU time in nanoseconds of this virtual CPU,0,openstack_controller,cpu time,
-openstack.nova.vcpus,gauge,,,,Number of vCPUs available on this hypervisor host,0,openstack_controller,nova vcpus,
-openstack.nova.vcpus_used,gauge,,,,Number of vCPUS used on this hypervisor host,0,openstack_controller,nova vcpus used,
+openstack.nova.server.hdd_errors,gauge,,,,The number of errors seen by the server when accessing an HDD device [Legacy],-1,openstack_controller,total hdd errors,
+openstack.nova.server.hdd_read_req,gauge,,,,The number of read requests made to an HDD device by this server [Legacy],0,openstack_controller,hdd read reqs,
+openstack.nova.server.hdd_write_req,gauge,,,,The number of write requests made to an HDD device by this server [Legacy],0,openstack_controller,hdd write reqs,
+openstack.nova.server.vda_errors,gauge,,,,The number of errors seen by the server when accessing a VDA device [Legacy],-1,openstack_controller,total vda errors,
+openstack.nova.server.vda_read_req,gauge,,,,The number of read requests made to a VDA device by this server [Legacy],0,openstack_controller,vda read reqs,
+openstack.nova.server.vda_write_req,gauge,,,,The number of write requests made to a VDA device by this server [Legacy],0,openstack_controller,vda write reqs,
+openstack.nova.server.hdd_read,gauge,,byte,,Number of bytes read from an HDD device by this server [Legacy],0,openstack_controller,hdd bytes read,
+openstack.nova.server.hdd_write,gauge,,byte,,Number of bytes written to an HDD device by this server [Legacy],0,openstack_controller,hdd bytes written,
+openstack.nova.server.vda_read,gauge,,byte,,Number of bytes read from a VDA device by this server [Legacy],0,openstack_controller,vda bytes read,
+openstack.nova.server.vda_write,gauge,,byte,,Number of bytes written to a VDA device by this server [Legacy],0,openstack_controller,vda bytes written,
+openstack.nova.server.memory,gauge,,mebibyte,,The amount of memory in MB provisioned for this server [Legacy],0,openstack_controller,server memory,
+openstack.nova.server.memory_actual,gauge,,mebibyte,,The amount of memory in MB provisioned for this server [Legacy],0,openstack_controller,server memory actual,
+openstack.nova.server.memory_rss,gauge,,mebibyte,,The amount of memory used by the processes of this server that is not associated with disk pages - such as stack and heap memory [Legacy],0,openstack_controller,resident set size,
+openstack.nova.server.cpu0_time,gauge,,nanosecond,,CPU time in nanoseconds of this virtual CPU [Legacy],0,openstack_controller,cpu time,
+openstack.nova.vcpus,gauge,,,,Number of vCPUs available on this hypervisor host [Legacy],0,openstack_controller,nova vcpus,
+openstack.nova.vcpus_used,gauge,,,,Number of vCPUS used on this hypervisor host [Legacy],0,openstack_controller,nova vcpus used,
+openstack.keystone.response_time,gauge,,millisecond,,Duration that an HTTP request takes to complete when making a request to keystone endpoint,0,openstack_controller,keystone response time,
+openstack.keystone.region.count,gauge,,,,Number of regions of the Openstack deployment,0,openstack_controller,keystone regions count,
+openstack.keystone.domain.count,gauge,,,,Number of domains of the Openstack deployment,0,openstack_controller,keystone domains count,
+openstack.keystone.domain.enabled,gauge,,,,If set to 1 domain is enabled. If set to 0 domain is disabled,0,openstack_controller,keystone domain enabled,
+openstack.keystone.project.count,gauge,,,,Number of projects of the Openstack deployment,0,openstack_controller,keystone projects count,
+openstack.keystone.project.enabled,gauge,,,,If set to 1 project is enabled. If set to 0 project is disabled,0,openstack_controller,keystone project enabled,
+openstack.keystone.user.count,gauge,,,,Number of users of the Openstack deployment,0,openstack_controller,keystone users count,
+openstack.keystone.user.enabled,gauge,,,,If set to 1 user is enabled. If set to 0 user is disabled,0,openstack_controller,keystone user enabled,
+openstack.keystone.group.count,gauge,,,,Number of groups of the Openstack deployment,0,openstack_controller,keystone groups count,
+openstack.keystone.group.users,gauge,,,,Number of users for a group of the Openstack deployment,0,openstack_controller,keystone group users count,
+openstack.keystone.service.count,gauge,,,,Number of keystone services of the Openstack deployment,0,openstack_controller,keystone services count,
+openstack.keystone.service.enabled,gauge,,,,If set to 1 service is enabled. If set to 0 service is disabled,0,openstack_controller,keystone service enabled,
+openstack.keystone.limit.limit,gauge,,,,Value of the unified limit for a keystone Openstack resource,0,openstack_controller,keystone limit,
+openstack.nova.response_time,gauge,,millisecond,,Duration that an HTTP request takes to complete when making a request to nova endpoint,0,openstack_controller,nova response time,
+openstack.nova.limit.absolute.max_total_instances,gauge,,,,The number of allowed servers for each tenant,0,openstack_controller,nova limit max total instances,
+openstack.nova.limit.absolute.max_total_cores,gauge,,,,The number of allowed server cores for each tenant,0,openstack_controller,nova limit max total cores,
+openstack.nova.limit.absolute.max_total_ram_size,gauge,,megabyte,,The amount of allowed server RAM for each tenant,0,openstack_controller,nova limit max total ram size,
+openstack.nova.limit.absolute.max_server_meta,gauge,,,,The number of allowed metadata items for each server,0,openstack_controller,nova limit max server metadata items,
+openstack.nova.limit.absolute.max_image_meta,gauge,,,,The number of allowed metadata items for each image,0,openstack_controller,nova limit max image metadata items,
+openstack.nova.limit.absolute.max_personality,gauge,,,,The number of allowed injected files for each tenant,0,openstack_controller,nova limit max injected files,
+openstack.nova.limit.absolute.max_personality_size,gauge,,byte,,The number of allowed bytes of content for each injected file,0,openstack_controller,nova limit max injected file size,
+openstack.nova.limit.absolute.max_total_keypairs,gauge,,,,The number of allowed key pairs for each user,0,openstack_controller,nova limit max total key pairs,
+openstack.nova.limit.absolute.max_server_groups,gauge,,,,The number of allowed server groups for each tenant,0,openstack_controller,nova limit max server groups,
+openstack.nova.limit.absolute.max_server_group_members,gauge,,,,The number of allowed members for each server group,0,openstack_controller,nova limit max server group members,
+openstack.nova.limit.absolute.max_total_floating_ips,gauge,,,,The number of allowed floating IP addresses for each tenant,0,openstack_controller,nova limit max total floating ips,
+openstack.nova.limit.absolute.max_security_groups,gauge,,,,The number of allowed security groups for each tenant,0,openstack_controller,nova limit max security groups,
+openstack.nova.limit.absolute.max_security_group_rules,gauge,,,,The number of allowed rules for each security group,0,openstack_controller,nova limit max security group rules,
+openstack.nova.limit.absolute.total_ram_used,gauge,,megabyte,,The amount of used server RAM in each tenant,0,openstack_controller,nova total ram used,
+openstack.nova.limit.absolute.total_cores_used,gauge,,,,The number of used server cores in each tenant,0,openstack_controller,nova total cores used,
+openstack.nova.limit.absolute.total_instances_used,gauge,,,,The number of servers in each tenant,0,openstack_controller,nova total instances used,
+openstack.nova.limit.absolute.total_floating_ips_used,gauge,,,,The number of used floating IP addresses in each tenant,0,openstack_controller,nova total floating ips used,
+openstack.nova.limit.absolute.total_security_groups_used,gauge,,,,The number of used security groups in each tenant,0,openstack_controller,nova total security groups used,
+openstack.nova.limit.absolute.total_server_groups_used,gauge,,,,The number of used server groups in each tenant,0,openstack_controller,nova total server groups used,
+openstack.nova.flavor.disk,gauge,,gibibyte,,"The size of the root disk that will be created in GiB.",0,openstack_controller,nova flavor disk,
+openstack.nova.flavor.ram,gauge,,mebibyte,,"The amount of RAM a flavor has, in MiB.",0,openstack_controller,nova flavor ram,
+openstack.nova.flavor.rxtx_factor,gauge,,,,"The receive / transmit factor (as a float) that will be set on ports if the network backend supports the QOS extension.",0,openstack_controller,nova flavor rxtx,
+openstack.nova.flavor.swap,gauge,,,,"The size of a dedicated swap disk that will be allocated, in MiB. If 0 (the default), no dedicated swap disk will be created.",0,openstack_controller,nova flavor swap,
+openstack.nova.flavor.vcpus,gauge,,mebibyte,,"The number of virtual CPUs that will be allocated to the server.",0,openstack_controller,nova flavor vcpus,
+openstack.nova.service.count,gauge,,,,"The number of services",0,openstack_controller,nova service count,
+openstack.nova.service.up,gauge,,,,"Whether the service is up",0,openstack_controller,nova service up,
+openstack.nova.hypervisor.count,gauge,,,,The number of hypervisors,0,openstack_controller,nova hypervisor count,
+openstack.nova.hypervisor.current_workload,gauge,,,,The number of tasks the hypervisor is responsible for,0,openstack_controller,nova hypervisor current workload,
+openstack.nova.hypervisor.disk_available_least,gauge,,gigabyte,,The actual free disk on this hypervisor,0,openstack_controller,nova hypervisor actual available disk,
+openstack.nova.hypervisor.free_disk_gb,gauge,,gigabyte,,The free disk remaining on this hypervisor,0,openstack_controller,nova hypervisor free disk,
+openstack.nova.hypervisor.free_ram_mb,gauge,,megabyte,,The free RAM in this hypervisor,0,openstack_controller,nova hypervisor free ram,
+openstack.nova.hypervisor.local_gb,gauge,,gigabyte,,The disk in this hypervisor,0,openstack_controller,nova hypervisor disk,
+openstack.nova.hypervisor.local_gb_used,gauge,,gigabyte,,The disk used in this hypervisor,0,openstack_controller,nova hypervisor used disk,
+openstack.nova.hypervisor.memory_mb,gauge,,megabyte,,The memory of this hypervisor,0,openstack_controller,nova hypervisor memory,
+openstack.nova.hypervisor.memory_mb_used,gauge,,megabyte,,The memory used in this hypervisor,0,openstack_controller,nova hypervisor used memory,
+openstack.nova.hypervisor.running_vms,gauge,,,,The number of running VMs on this hypervisor,0,openstack_controller,nova hypervisor running vms,
+openstack.nova.hypervisor.vcpus,gauge,,,,The number of vCPU in this hypervisor,0,openstack_controller,nova hypervisor vcpus,
+openstack.nova.hypervisor.vcpus_used,gauge,,,,The number of vCPU used in this hypervisor,0,openstack_controller,nova hypervisor used vcpus,
+openstack.nova.hypervisor.up,gauge,,,,If set to 1 hypervisor is up. If set to 0 hypervisor is down,0,openstack_controller,keystone hypervisor up,
+openstack.nova.hypervisor.load_1,gauge,,,,The hypervisor system's 1-minute load average,0,openstack_controller,nova hypervisor load 1,
+openstack.nova.hypervisor.load_5,gauge,,,,The hypervisor system's 5-minute load average,0,openstack_controller,nova hypervisor load 5,
+openstack.nova.hypervisor.load_15,gauge,,,,The hypervisor system's 15-minute load average,0,openstack_controller,nova hypervisor load 15,
+openstack.nova.quota_set.cores,gauge,,,,The number of allowed server cores for each tenant,0,openstack_controller,nova quota set cores,
+openstack.nova.quota_set.fixed_ips,gauge,,,,The number of allowed fixed IP addresses for each tenant,0,openstack_controller,nova quota set fixed ips,
+openstack.nova.quota_set.floating_ips,gauge,,,,The number of allowed floating IP addresses for each tenant,0,openstack_controller,nova quota set floating ips,
+openstack.nova.quota_set.injected_file_content_bytes,gauge,,,,The number of allowed bytes of content for each injected file,0,openstack_controller,nova quota set injected file content bytes,
+openstack.nova.quota_set.injected_file_path_bytes,gauge,,,,The number of allowed bytes for each injected file path,0,openstack_controller,nova quota set injected file content bytes,
+openstack.nova.quota_set.injected_files,gauge,,,,The number of allowed injected files for each tenant,0,openstack_controller,nova quota set injected files,
+openstack.nova.quota_set.instances,gauge,,,,The number of allowed servers for each tenant,0,openstack_controller,nova quota set instances,
+openstack.nova.quota_set.key_pairs,gauge,,,,The number of allowed key pairs for each user,0,openstack_controller,nova quota set key pairs,
+openstack.nova.quota_set.metadata_items,gauge,,,,The number of allowed metadata items for each server,0,openstack_controller,nova quota set metadata items,
+openstack.nova.quota_set.ram,gauge,,megabyte,,The amount of allowed server RAM for each tenant,0,openstack_controller,nova quota set ram,
+openstack.nova.quota_set.security_group_rules,gauge,,,,The number of allowed rules for each security group,0,openstack_controller,nova quota set security group rules,
+openstack.nova.quota_set.security_groups,gauge,,,,The number of allowed security groups for each tenant,0,openstack_controller,nova quota set security groups,
+openstack.nova.quota_set.server_group_members,gauge,,,,The number of allowed members for each server group,0,openstack_controller,nova quota set server group members,
+openstack.nova.quota_set.server_groups,gauge,,,,The number of allowed server groups for each tenant,0,openstack_controller,nova quota set server groups,
+openstack.nova.server.count,gauge,,,,The number of servers in each tenant,0,openstack_controller,nova server count,
+openstack.nova.server.active,gauge,,,,If set to 1 server status is active,0,openstack_controller,nova server active,
+openstack.nova.server.error,gauge,,,,If set to 1 server status is error,0,openstack_controller,nova server error,
+openstack.nova.server.flavor.os_flv_ext_data_ephemeral,gauge,,gigabyte,,The size of the ephemeral disk that was created,0,openstack_controller,nova server flavor ephemeral,
+openstack.nova.server.flavor.rxtx_factor,gauge,,,,The receive / transmit factor,0,openstack_controller,nova server flavor rxtx factor,
+openstack.nova.server.diagnostic.cpu0_time,gauge,,nanosecond,,"CPU time in nanoseconds of this virtual CPU [Nova Microversion- default]",0,openstack_controller,nova server dx cpu time,
+openstack.nova.server.diagnostic.vda_read_req,gauge,,,,"The number of read requests made to a VDA device by this server [Nova Microversion- default]",0,openstack_controller,nova server dx vda read req,
+openstack.nova.server.diagnostic.vda_read,gauge,,byte,,"Number of bytes read from a VDA device by this server [Nova Microversion- default]",0,openstack_controller,nova server dx vda read,
+openstack.nova.server.diagnostic.vda_write,gauge,,byte,,"Number of bytes written to a VDA device by this server [Nova Microversion- default]",0,openstack_controller,nova server dx vda write,
+openstack.nova.server.diagnostic.vda_write_req,gauge,,,,"The number of write requests made to a VDA device by this server [Nova Microversion- default]",0,openstack_controller,nova server dx vda write req,
+openstack.nova.server.diagnostic.vda_errors,gauge,,,,"The number of errors seen by the server when accessing a VDA device [Nova Microversion- default]",0,openstack_controller,nova server dx vda error,
+openstack.nova.server.diagnostic.memory,gauge,,mebibyte,,"The amount of memory in MB provisioned for this server [Nova Microversion- default]",0,openstack_controller,nova server dx mem,
+openstack.nova.server.diagnostic.memory_actual,gauge,,mebibyte,,"The amount of memory in MB provisioned for this server [Nova Microversion- default]",0,openstack_controller,nova server dx mem actual,
+openstack.nova.server.diagnostic.memory_swap_in,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem swap in,
+openstack.nova.server.diagnostic.memory_swap_out,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem swap out,
+openstack.nova.server.diagnostic.memory_major_fault,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem major fault,
+openstack.nova.server.diagnostic.memory_minor_fault,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem minor fault,
+openstack.nova.server.diagnostic.memory_unused,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem unused,
+openstack.nova.server.diagnostic.memory_available,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem avail,
+openstack.nova.server.diagnostic.memory_usable,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem usable,
+openstack.nova.server.diagnostic.memory_last_update,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem last update,
+openstack.nova.server.diagnostic.memory_disk_caches,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem disk cache,
+openstack.nova.server.diagnostic.memory_hugetlb_pgalloc,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem pgalloc,
+openstack.nova.server.diagnostic.memory_hugetlb_pgfail,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem pgfail,
+openstack.nova.server.diagnostic.memory_rss,gauge,,,,"[Nova Microversion- default]",0,openstack_controller,nova server dx mem rss,
+openstack.nova.server.diagnostic.memory_details.maximum,gauge,,mebibyte,,"Amount of memory provisioned for the VM in MiB [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx mem max,
+openstack.nova.server.diagnostic.memory_details.used,gauge,,,,"Amount of memory that is currently used by the guest operating system and its applications in MiB [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx mem used,
+openstack.nova.server.diagnostic.uptime,gauge,,second,,"The amount of time in seconds that the VM has been running [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx uptime,
+openstack.nova.server.diagnostic.num_cpus,gauge,,,,"The number of vCPUs [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx num cpus,
+openstack.nova.server.diagnostic.num_nics,gauge,,,,"The number of vNICs [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx num nics,
+openstack.nova.server.diagnostic.num_disks,gauge,,,,"The number of disks [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx num disks,
+openstack.nova.server.diagnostic.disk_details.read_bytes,gauge,,byte,,"Disk reads in bytes [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx disk read bytes,
+openstack.nova.server.diagnostic.disk_details.read_requests,gauge,,,,"Read requests [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx disk read req,
+openstack.nova.server.diagnostic.disk_details.write_bytes,gauge,,byte,,"Disk writes in bytes [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx disk write,
+openstack.nova.server.diagnostic.disk_details.write_requests,gauge,,,,"Write requests [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx disk write req,
+openstack.nova.server.diagnostic.disk_details.errors_count,gauge,,,,"Disk errors [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx disk err,
+openstack.nova.server.diagnostic.cpu_details.time,gauge,,nanosecond,,"CPU Time in nano seconds [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx cpu time,
+openstack.nova.server.diagnostic.cpu_details.utilisation,gauge,,percent,,"CPU utilisation in percents [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx cpu util,
+openstack.nova.server.diagnostic.nic_details.rx_drop,gauge,,,,"Received packets dropped [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx rx drop,
+openstack.nova.server.diagnostic.nic_details.rx_errors,gauge,,,,"Received errors [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx rx err,
+openstack.nova.server.diagnostic.nic_details.rx_octets,gauge,,,,"Recieved octects [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx rx oct,
+openstack.nova.server.diagnostic.nic_details.rx_packets,gauge,,,,"Received packets [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx rx packet,
+openstack.nova.server.diagnostic.nic_details.rx_rate,gauge,,,,"Recieved rate [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx rx rate,
+openstack.nova.server.diagnostic.nic_details.tx_drop,gauge,,,,"Transmit dropped packets [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx tx drop,
+openstack.nova.server.diagnostic.nic_details.tx_errors,gauge,,,,"Transmit errors [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx tx err,
+openstack.nova.server.diagnostic.nic_details.tx_octets,gauge,,,,"Transmitted octets [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx tx oct,
+openstack.nova.server.diagnostic.nic_details.tx_packets,gauge,,,,"Transmit packets [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx tx packet,
+openstack.nova.server.diagnostic.nic_details.tx_rate,gauge,,,,"Transmit rate [Nova Microversion >= 2.48]",0,openstack_controller,nova server dx tx rate,
+openstack.nova.server.diagnostic.rx,gauge,,,,"Received rate [Nova Microversion- default]",0,openstack_controller,nova server dx rx,
+openstack.nova.server.diagnostic.rx_drop,gauge,,,,"Received packets dropped [Nova Microversion- default]",0,openstack_controller,nova server dx rx drop,
+openstack.nova.server.diagnostic.rx_errors,gauge,,,,"Received errors [Nova Microversion- default]",0,openstack_controller,nova server dx rx err,
+openstack.nova.server.diagnostic.rx_packets,gauge,,,,"Received packets [Nova Microversion- default]",0,openstack_controller,nova server dx rx packet,
+openstack.nova.server.diagnostic.tx,gauge,,,,"Transmit rate [Nova Microversion- default]",0,openstack_controller,nova server dx tx,
+openstack.nova.server.diagnostic.tx_drop,gauge,,,,"Transmit dropped packets [Nova Microversion- default]",0,openstack_controller,nova server dx tx drop,
+openstack.nova.server.diagnostic.tx_errors,gauge,,,,"Transmit errors [Nova Microversion- default]",0,openstack_controller,nova server dx tx err,
+openstack.nova.server.diagnostic.tx_packets,gauge,,,,"Transmit packets [Nova Microversion- default]",0,openstack_controller,nova server dx tx packet,
+openstack.neutron.response_time,gauge,,millisecond,,Duration that an HTTP request takes to complete when making a request to neutron endpoint,0,openstack_controller,neutron response time,
+openstack.neutron.network.admin_state_up,gauge,,,,"The administrative state of the network, which is up or down",0,openstack_controller,neutron net admin up,
+openstack.neutron.network.l2_adjacency,gauge,,,,"Indicates whether L2 connectivity is available throughout the network.",0,openstack_controller,neutron net l2,
+openstack.neutron.network.mtu,gauge,,,,"The maximum transmission unit (MTU) value to address fragmentation. Minimum value is 68 for IPv4, and 1280 for IPv6.",0,openstack_controller,neutron net mtu,
+openstack.neutron.network.port_security_enabled,gauge,,,,"The port security status of the network. Valid values are enabled and disabled.",0,openstack_controller,neutron net port security,
+openstack.neutron.network.shared,gauge,,,,"Indicates whether this network is shared across all tenants. By default, only administrative users can change this value.",0,openstack_controller,neutron net shared,
+openstack.neutron.network.vlan_transparent,gauge,,,,"Indicates the VLAN transparency mode of the network, which is VLAN transparent or not VLAN transparent.",0,openstack_controller,neutron vlan transparent,
+openstack.neutron.network.is_default,gauge,,,,"The network is default pool or not.",0,openstack_controller,neutron vlan default,
+openstack.neutron.network.count,gauge,,,,"The total number of networks",0,openstack_controller,neutron networks count,
+openstack.neutron.quota.floatingip,gauge,,,,"The number of floating IP addresses allowed for each project. A value of -1 means no limit.",0,openstack_controller,neutron quota fl ip,
+openstack.neutron.quota.network,gauge,,,,"The number of networks allowed for each project. A value of -1 means no limit.",0,openstack_controller,neutron quota fl ip,
+openstack.neutron.quota.port,gauge,,,,"The number of ports allowed for each project. A value of -1 means no limit.",0,openstack_controller,neutron quota port,
+openstack.neutron.quota.rbac_policy,gauge,,,,"The number of role-based access control (RBAC) policies allowed for each project. A value of -1 means no limit.",0,openstack_controller,neutron quota rbac,
+openstack.neutron.quota.router,gauge,,,,"The number of routers allowed for each project. A value of -1 means no limit.",0,openstack_controller,neutron quota router,
+openstack.neutron.quota.security_group,gauge,,,,"The number of security groups allowed for each project. A value of -1 means no limit.",0,openstack_controller,neutron quota sec group,
+openstack.neutron.quota.security_group_rule,gauge,,,,"The number of security group rules allowed for each project. A value of -1 means no limit.",0,openstack_controller,neutron quota sec group rule,
+openstack.neutron.quota.subnet,gauge,,,,"The number of subnets allowed for each project. A value of -1 means no limit.",0,openstack_controller,neutron quota subnet,
+openstack.neutron.quota.subnetpool,gauge,,,,"The number of subnet pools allowed for each project. A value of -1 means no limit.",0,openstack_controller,neutron quota subnet pools,
+openstack.neutron.agent.count,gauge,,,,"Number of network agents",0,openstack_controller,neutron agent ct,
+openstack.neutron.agent.alive,gauge,,,,"If the agent is alive and running.",0,openstack_controller,neutron agent alive,
+openstack.neutron.agent.admin_state_up,gauge,,,,"The administrative state of the agent.",0,openstack_controller,neutron agent up,
+openstack.cinder.response_time,gauge,,millisecond,,Duration that an HTTP request takes to complete when making a request to cinder endpoint,0,openstack_controller,cinder response time,
+openstack.ironic.response_time,gauge,,millisecond,,Duration that an HTTP request takes to complete when making a request to ironic endpoint,0,openstack_controller,ironic response time,
+openstack.ironic.node.count,gauge,,,,Number of ironic nodes,0,openstack_controller,ironic node ct,
+openstack.ironic.node.up,gauge,,,,Number of ironic nodes up,0,openstack_controller,ironic node up,
+openstack.ironic.conductor.up,gauge,,,,Whether an ironic conductor is up,0,openstack_controller,ironic conductor up,
+openstack.ironic.conductor.count,gauge,,,,Number of ironic conductors,0,openstack_controller,ironic conductor ct,
+openstack.octavia.response_time,gauge,,millisecond,,Duration that an HTTP request takes to complete when making a request to octavia endpoint,0,openstack_controller,octavia response time,
+openstack.octavia.loadbalancer.count,gauge,,,,Number of octavia loadbalancers,0,openstack_controller,octavia loadbalancer ct,
+openstack.octavia.loadbalancer.admin_state_up,gauge,,,,"The administrative state of the loadbalancer, which is up or down",0,openstack_controller,octavia loadbalancer up,
+openstack.octavia.loadbalancer.stats.active_connections,gauge,,,,"The currently active loadbalancer connections",0,openstack_controller,octavia loadbalancer active connections,
+openstack.octavia.loadbalancer.stats.bytes_in,gauge,,,,"The total bytes received",0,openstack_controller,octavia loadbalancer bytes received,
+openstack.octavia.loadbalancer.stats.bytes_out,gauge,,,,"The total bytes sent",0,openstack_controller,octavia loadbalancer bytes sent,
+openstack.octavia.loadbalancer.stats.request_errors,gauge,,,,"The total requests that were unable to be fulfilled",0,openstack_controller,octavia loadbalancer req err,
+openstack.octavia.loadbalancer.stats.total_connections,gauge,,,,"The total connections handled",0,openstack_controller,octavia loadbalancer total connections,
+openstack.octavia.listener.count,gauge,,,,Number of octavia listeners,0,openstack_controller,octavia listener ct,
+openstack.octavia.listener.connection_limit,gauge,,,,"The maximum number of connections permitted for this listener",0,openstack_controller,octavia listener connection limit,
+openstack.octavia.listener.timeout_client_data,gauge,,millisecond,,"Frontend client inactivity timeout",0,openstack_controller,octavia listener timeout client,
+openstack.octavia.listener.timeout_member_connect,gauge,,millisecond,,"Backend member connection timeout",0,openstack_controller,octavia listener timeout member connect,
+openstack.octavia.listener.timeout_member_data,gauge,,millisecond,,"Backend member inactivity timeout",0,openstack_controller,octavia listener timeout member data,
+openstack.octavia.listener.timeout_tcp_inspect,gauge,,millisecond,,"Time to wait for additional TCP packets for content inspection",0,openstack_controller,octavia listener timeout tcp inspect,
+openstack.octavia.listener.stats.active_connections,gauge,,,,"The currently active listener connections",0,openstack_controller,octavia listener active connections,
+openstack.octavia.listener.stats.bytes_in,gauge,,,,"The total bytes received",0,openstack_controller,octavia listener bytes received,
+openstack.octavia.listener.stats.bytes_out,gauge,,,,"The total bytes sent",0,openstack_controller,octavia listener bytes sent,
+openstack.octavia.listener.stats.request_errors,gauge,,,,"The total requests that were unable to be fulfilled",0,openstack_controller,octavia listener req err,
+openstack.octavia.listener.stats.total_connections,gauge,,,,"The total connections handled",0,openstack_controller,octavia listener total connections,
+openstack.octavia.pool.count,gauge,,,,Number of octavia pools,0,openstack_controller,octavia pool ct,
+openstack.octavia.pool.admin_state_up,gauge,,,,"The administrative state of the pool, which is up or down",0,openstack_controller,octavia pool up,
+openstack.octavia.pool.member.count,gauge,,,,Number of octavia pool members,0,openstack_controller,octavia pool member ct,
+openstack.octavia.pool.member.admin_state_up,gauge,,,,"The administrative state of the pool member, which is up or down",0,openstack_controller,octavia pool member up,
+openstack.octavia.pool.member.weight,gauge,,,,"The portion of requests or connections it services compared to the other members of the pool",0,openstack_controller,octavia pool member weight,
+openstack.octavia.healthmonitor.count,gauge,,,,Number of octavia healthmonitors,0,openstack_controller,octavia healthmonitor ct,
+openstack.octavia.healthmonitor.admin_state_up,gauge,,,,"The administrative state of the healthmonitor, which is up or down",0,openstack_controller,octavia healthmonitor up,
+openstack.octavia.healthmonitor.delay,gauge,,second,,"The time between sending probes to members",0,openstack_controller,octavia healthmonitor delay,
+openstack.octavia.healthmonitor.timeout,gauge,,second,,"The maximum time that a monitor waits to connect before it times out",0,openstack_controller,octavia healthmonitor timeout,
+openstack.octavia.healthmonitor.max_retries,gauge,,,,"The number of successful checks before changing the operating status of the member to ONLINE",0,openstack_controller,octavia healthmonitor max retries,
+openstack.octavia.healthmonitor.max_retries_down,gauge,,,,"The number of allowed check failures before changing the operating status of the member to ERROR",0,openstack_controller,octavia healthmonitor max retries down,
+openstack.octavia.quota.count,gauge,,,,"Number of octavia quotas for each project",0,openstack_controller,octavia quota ct,
+openstack.octavia.quota.loadbalancer,gauge,,,,"The configured load balancer quota limit",0,openstack_controller,octavia quota loadbalancer,
+openstack.octavia.quota.load_balancer,gauge,,,,"The configured load balancer quota limit",0,openstack_controller,octavia quota loadbalancer,
+openstack.octavia.quota.listener,gauge,,,,"The configured listener quota limit",0,openstack_controller,octavia quota listener,
+openstack.octavia.quota.member,gauge,,,,"The configured member quota limit",0,openstack_controller,octavia quota member,
+openstack.octavia.quota.pool,gauge,,,,"The configured pool quota limit",0,openstack_controller,octavia quota pool,
+openstack.octavia.quota.healthmonitor,gauge,,,,"The configured health monitor quota limit",0,openstack_controller,octavia quota healthmonitor,
+openstack.octavia.quota.health_monitor,gauge,,,,"The configured health monitor quota limit",0,openstack_controller,octavia quota healthmonitor,
+openstack.octavia.quota.l7policy,gauge,,,,"The configured l7policy quota limit",0,openstack_controller,octavia quota l7policy,
+openstack.octavia.quota.l7rule,gauge,,,,"The configured l7rule quota limit",0,openstack_controller,octavia quota l7rule,
+openstack.octavia.amphora.count,gauge,,,,"Number of octavia amphora for each project",0,openstack_controller,octavia amphora ct,
+openstack.octavia.amphora.stats.active_connections,gauge,,,,"The currently active amphora connections",0,openstack_controller,octavia amphora active connections,
+openstack.octavia.amphora.stats.bytes_in,gauge,,,,"The total bytes received",0,openstack_controller,octavia amphora bytes received,
+openstack.octavia.amphora.stats.bytes_out,gauge,,,,"The total bytes sent",0,openstack_controller,octavia amphora bytes sent,
+openstack.octavia.amphora.stats.request_errors,gauge,,,,"The total requests that were unable to be fulfilled",0,openstack_controller,octavia amphora req err,
+openstack.octavia.amphora.stats.total_connections,gauge,,,,"The total connections handled",0,openstack_controller,octavia amphora total connections,
diff --git a/openstack_controller/tests/common.py b/openstack_controller/tests/common.py
index 5eb5273dc9811..c7eb8f65d5637 100644
--- a/openstack_controller/tests/common.py
+++ b/openstack_controller/tests/common.py
@@ -1,387 +1,12 @@
 # (C) Datadog, Inc. 2018-present
 # All rights reserved
 # Licensed under Simplified BSD License (see LICENSE)
-import datetime
-import os
 
-CHECK_NAME = 'openstack'
 
-FIXTURES_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'fixtures')
-TEST_OPENSTACK_CONFIG_PATH = os.path.join(FIXTURES_DIR, 'openstack_config.yaml')
-TEST_OPENSTACK_NO_AUTH_CONFIG_PATH = os.path.join(FIXTURES_DIR, 'openstack_bad_config.yaml')
-
-USE_OPENSTACK_SANDBOX = os.environ.get('USE_OPENSTACK_SANDBOX')
-
-ALL_IDS = ['server-1', 'server-2', 'other-1', 'other-2']
-EXCLUDED_NETWORK_IDS = ['server-1', 'other-.*']
-EXCLUDED_SERVER_IDS = ['server-2', 'other-.*']
-FILTERED_NETWORK_ID = 'server-2'
-FILTERED_SERVER_ID = 'server-1'
-FILTERED_BY_PROJ_SERVER_ID = ['server-1', 'server-2']
-
-CONFIG_FILE_INSTANCE = {
-    'name': 'test_name',
-    'user': {'name': 'test_name', 'password': 'test_pass', 'domain': {'id': 'test_id'}},
-    'ssl_verify': False,
-    'exclude_network_ids': EXCLUDED_NETWORK_IDS,
-    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_PATH,
-    'openstack_cloud_name': 'test_cloud',
-}
-
-KEYSTONE_INSTANCE = {
-    'name': 'test_name',
-    'keystone_server_url': 'http://10.0.2.15:5000',
-    'user': {'name': 'test_name', 'password': 'test_pass', 'domain': {'id': 'test_id'}},
-    'ssl_verify': False,
-    'exclude_network_ids': EXCLUDED_NETWORK_IDS,
-}
-
-MOCK_CONFIG = {'init_config': {}, 'instances': [KEYSTONE_INSTANCE]}
-
-EXAMPLE_AUTH_RESPONSE = {
-    u'token': {
-        u'methods': [u'password'],
-        u'roles': [
-            {u'id': u'f20c215f5a4d47b7a6e510bc65485ced', u'name': u'datadog_monitoring'},
-            {u'id': u'9fe2ff9ee4384b1894a90878d3e92bab', u'name': u'_member_'},
-        ],
-        u'expires_at': u'2015-11-02T15: 57: 43.911674Z',
-        u'project': {
-            u'domain': {u'id': u'default', u'name': u'Default'},
-            u'id': u'0850707581fe4d738221a72db0182876',
-            u'name': u'admin',
-        },
-        u'catalog': [
-            {
-                u'endpoints': [
-                    {
-                        u'url': u'http://10.0.2.15:8774/v2.1/0850707581fe4d738221a72db0182876',
-                        u'interface': u'internal',
-                        u'region': u'RegionOne',
-                        u'region_id': u'RegionOne',
-                        u'id': u'354e35ed19774e398f80dc2a90d07f4b',
-                    },
-                    {
-                        u'url': u'http://10.0.2.15:8774/v2.1/0850707581fe4d738221a72db0182876',
-                        u'interface': u'public',
-                        u'region': u'RegionOne',
-                        u'region_id': u'RegionOne',
-                        u'id': u'36e8e2bf24384105b9d56a65b0900172',
-                    },
-                    {
-                        u'url': u'http://10.0.2.15:8774/v2.1/0850707581fe4d738221a72db0182876',
-                        u'interface': u'admin',
-                        u'region': u'RegionOne',
-                        u'region_id': u'RegionOne',
-                        u'id': u'de93edcbf7f9446286687ec68423c36f',
-                    },
-                ],
-                u'type': u'compute',
-                u'id': u'2023bd4f451849ba8abeaaf283cdde4f',
-                u'name': u'nova',
-            },
-            {
-                u'endpoints': [
-                    {
-                        u'url': u'http://10.0.3.111:8776/v1/***************************4bfc1',
-                        u'interface': u'public',
-                        u'region': u'RegionOne',
-                        u'region_id': u'RegionOne',
-                        u'id': u'***************************2452f',
-                    },
-                    {
-                        u'url': u'http://10.0.2.15:8776/v1/***************************4bfc1',
-                        u'interface': u'admin',
-                        u'region': u'RegionOne',
-                        u'region_id': u'RegionOne',
-                        u'id': u'***************************8239f',
-                    },
-                    {
-                        u'url': u'http://10.0.2.15:8776/v1/***************************4bfc1',
-                        u'interface': u'internal',
-                        u'region': u'RegionOne',
-                        u'region_id': u'RegionOne',
-                        u'id': u'***************************7caa1',
-                    },
-                ],
-                u'type': u'volume',
-                u'id': u'***************************e7e16',
-                u'name': u'cinder',
-            },
-            {
-                u'endpoints': [
-                    {
-                        u'url': u'http://10.0.2.15:9292',
-                        u'interface': u'internal',
-                        u'region': u'RegionOne',
-                        u'region_id': u'RegionOne',
-                        u'id': u'7c1e318d8f7f42029fcb591598df2ef5',
-                    },
-                    {
-                        u'url': u'http://10.0.2.15:9292',
-                        u'interface': u'public',
-                        u'region': u'RegionOne',
-                        u'region_id': u'RegionOne',
-                        u'id': u'afcc88b1572f48a38bb393305dc2b584',
-                    },
-                    {
-                        u'url': u'http://10.0.2.15:9292',
-                        u'interface': u'admin',
-                        u'region': u'RegionOne',
-                        u'region_id': u'RegionOne',
-                        u'id': u'd9730dbdc07844d785913219da64a197',
-                    },
-                ],
-                u'type': u'network',
-                u'id': u'21ad241f26194bccb7d2e49ee033d5a2',
-                u'name': u'neutron',
-            },
-        ],
-        u'extras': {},
-        u'user': {
-            u'domain': {u'id': u'default', u'name': u'Default'},
-            u'id': u'5f10e63fbd6b411186e561dc62a9a675',
-            u'name': u'datadog',
-        },
-        u'audit_ids': [u'OMQQg9g3QmmxRHwKrfWxyQ'],
-        u'issued_at': u'2015-11-02T14: 57: 43.911697Z',
-    }
-}
-
-EXAMPLE_PROJECTS_RESPONSE = {
-    "projects": [
-        {
-            "domain_id": "1789d1",
-            "enabled": True,
-            "id": "263fd9",
-            "links": {"self": "https://example.com/identity/v3/projects/263fd9"},
-            "name": "Test Group",
-        }
-    ],
-    "links": {"self": "https://example.com/identity/v3/auth/projects", "previous": None, "next": None},
-}
-
-# .. server/network
-SERVERS_CACHE_MOCK = {
-    'servers': {
-        "server-1": {"id": "server-1", "name": "server-name-1", "status": "ACTIVE", "project_name": "testproj"},
-        "server-2": {"id": "server-2", "name": "server-name-2", "status": "ACTIVE", "project_name": "testproj"},
-        "other-1": {"id": "other-1", "name": "server-name-other-1", "status": "ACTIVE", "project_name": "blacklist_1"},
-        "other-2": {"id": "other-2", "name": "server-name-other-2", "status": "ACTIVE", "project_name": "blacklist_2"},
-    },
-    'change_since': datetime.datetime.utcnow().isoformat(),
-}
-
-EMPTY_NOVA_SERVERS = []
-
-# One example from MOCK_NOVA_SERVERS to emulate pagination
-MOCK_NOVA_SERVERS_PAGINATED = [
-    {
-        "OS-DCF:diskConfig": "AUTO",
-        "OS-EXT-AZ:availability_zone": "nova",
-        "OS-EXT-SRV-ATTR:host": "compute",
-        "OS-EXT-SRV-ATTR:hostname": "server-1",
-        "OS-EXT-SRV-ATTR:hypervisor_hostname": "fake-mini",
-        "OS-EXT-SRV-ATTR:instance_name": "instance-00000001",
-        "OS-EXT-SRV-ATTR:kernel_id": "",
-        "OS-EXT-SRV-ATTR:launch_index": 0,
-        "OS-EXT-SRV-ATTR:ramdisk_id": "",
-        "OS-EXT-SRV-ATTR:reservation_id": "r-iffothgx",
-        "OS-EXT-SRV-ATTR:root_device_name": "/dev/sda",
-        "OS-EXT-SRV-ATTR:user_data": "IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg==",
-        "OS-EXT-STS:power_state": 1,
-        "OS-EXT-STS:task_state": 'null',
-        "OS-EXT-STS:vm_state": "active",
-        "OS-SRV-USG:launched_at": "2017-02-14T19:24:43.891568",
-        "OS-SRV-USG:terminated_at": 'null',
-        "accessIPv4": "1.2.3.4",
-        "accessIPv6": "80fe::",
-        "hostId": "2091634baaccdc4c5a1d57069c833e402921df696b7f970791b12ec6",
-        "host_status": "UP",
-        "id": "server-1",
-        "metadata": {"My Server Name": "Apache1"},
-        "name": "new-server-test",
-        "status": "ACTIVE",
-        "tags": [],
-        "tenant_id": "6f70656e737461636b20342065766572",
-        "updated": "2017-02-14T19:24:43Z",
-        "user_id": "fake",
-    }
-]
-
-# Example response from - https://developer.openstack.org/api-ref/compute/#list-servers-detailed
-# ID and server-name values have been changed for test readability
-MOCK_NOVA_SERVERS = [
-    {
-        "OS-DCF:diskConfig": "AUTO",
-        "OS-EXT-AZ:availability_zone": "nova",
-        "OS-EXT-SRV-ATTR:host": "compute",
-        "OS-EXT-SRV-ATTR:hostname": "server-1",
-        "OS-EXT-SRV-ATTR:hypervisor_hostname": "fake-mini",
-        "OS-EXT-SRV-ATTR:instance_name": "instance-00000001",
-        "OS-EXT-SRV-ATTR:kernel_id": "",
-        "OS-EXT-SRV-ATTR:launch_index": 0,
-        "OS-EXT-SRV-ATTR:ramdisk_id": "",
-        "OS-EXT-SRV-ATTR:reservation_id": "r-iffothgx",
-        "OS-EXT-SRV-ATTR:root_device_name": "/dev/sda",
-        "OS-EXT-SRV-ATTR:user_data": "IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg==",
-        "OS-EXT-STS:power_state": 1,
-        "OS-EXT-STS:task_state": 'null',
-        "OS-EXT-STS:vm_state": "active",
-        "OS-SRV-USG:launched_at": "2017-02-14T19:24:43.891568",
-        "OS-SRV-USG:terminated_at": 'null',
-        "accessIPv4": "1.2.3.4",
-        "accessIPv6": "80fe::",
-        "hostId": "2091634baaccdc4c5a1d57069c833e402921df696b7f970791b12ec6",
-        "host_status": "UP",
-        "id": "server-1",
-        "metadata": {"My Server Name": "Apache1"},
-        "name": "new-server-test",
-        "status": "DELETED",
-        "tags": [],
-        "tenant_id": "6f70656e737461636b20342065766572",
-        "updated": "2017-02-14T19:24:43Z",
-        "user_id": "fake",
-    },
-    {
-        "OS-DCF:diskConfig": "AUTO",
-        "OS-EXT-AZ:availability_zone": "nova",
-        "OS-EXT-SRV-ATTR:host": "compute",
-        "OS-EXT-SRV-ATTR:hostname": "server-2",
-        "OS-EXT-SRV-ATTR:hypervisor_hostname": "fake-mini",
-        "OS-EXT-SRV-ATTR:instance_name": "instance-00000001",
-        "OS-EXT-SRV-ATTR:kernel_id": "",
-        "OS-EXT-SRV-ATTR:launch_index": 0,
-        "OS-EXT-SRV-ATTR:ramdisk_id": "",
-        "OS-EXT-SRV-ATTR:reservation_id": "r-iffothgx",
-        "OS-EXT-SRV-ATTR:root_device_name": "/dev/sda",
-        "OS-EXT-SRV-ATTR:user_data": "IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg==",
-        "OS-EXT-STS:power_state": 1,
-        "OS-EXT-STS:task_state": 'null',
-        "OS-EXT-STS:vm_state": "active",
-        "OS-SRV-USG:launched_at": "2017-02-14T19:24:43.891568",
-        "OS-SRV-USG:terminated_at": 'null',
-        "accessIPv4": "1.2.3.4",
-        "accessIPv6": "80fe::",
-        "hostId": "2091634baaccdc4c5a1d57069c833e402921df696b7f970791b12ec6",
-        "host_status": "UP",
-        "id": "server_newly_added",
-        "metadata": {"My Server Name": "Apache1"},
-        "name": "newly_added_server",
-        "status": "ACTIVE",
-        "tags": [],
-        "tenant_id": "6f70656e737461636b20342065766572",
-        "updated": "2017-02-14T19:24:43Z",
-        "user_id": "fake",
-    },
-]
-
-EXAMPLE_GET_FLAVORS_DETAIL_RETURN_VALUE = [
-    {'id': u'10', 'disk': 10, 'vcpus': 2, 'ram': 1024, 'OS-FLV-EXT-DATA:ephemeral': 0, 'swap': 0},
-    {
-        'id': u'625c2e4b-0a1f-4236-bb67-5ceee1a766e5',
-        'disk': 48,
-        'vcpus': 8,
-        'ram': 5934,
-        'OS-FLV-EXT-DATA:ephemeral': 0,
-        'swap': 0,
-    },
-]
-
-EXAMPLE_GET_OS_AGGREGATES_RETURN_VALUE = [{'hosts': ["compute"], 'name': "name", 'availability_zone': "london"}]
-
-EXAMPLE_GET_OS_HYPERVISORS_RETURN_VALUE = [
-    {
-        "cpu_info": {
-            "arch": "x86_64",
-            "model": "Nehalem",
-            "vendor": "Intel",
-            "features": ["pge", "clflush"],
-            "topology": {"cores": 1, "threads": 1, "sockets": 4},
-        },
-        "current_workload": 0,
-        "status": "enabled",
-        "state": "up",
-        "disk_available_least": 0,
-        "host_ip": "1.1.1.1",
-        "free_disk_gb": 1028,
-        "free_ram_mb": 7680,
-        "hypervisor_hostname": "host1",
-        "hypervisor_type": "fake",
-        "hypervisor_version": 1000,
-        "id": 2,
-        "local_gb": 1028,
-        "local_gb_used": 0,
-        "memory_mb": 8192,
-        "memory_mb_used": 512,
-        "running_vms": 0,
-        "service": {"host": "host1", "id": 7, "disabled_reason": None},
-        "vcpus": 2,
-        "vcpus_used": 0,
-    }
-]
-
-EXAMPLE_GET_PROJECT_LIMITS_RETURN_VALUE = {
-    "maxImageMeta": 128,
-    "maxPersonality": 5,
-    "maxPersonalitySize": 10240,
-    "maxSecurityGroupRules": 20,
-    "maxSecurityGroups": 10,
-    "maxServerMeta": 128,
-    "maxTotalCores": 20,
-    "maxTotalFloatingIps": 10,
-    "maxTotalInstances": 10,
-    "maxTotalKeypairs": 100,
-    "maxTotalRAMSize": 51200,
-    "maxServerGroups": 10,
-    "maxServerGroupMembers": 10,
-    "totalCoresUsed": 0,
-    "totalInstancesUsed": 0,
-    "totalRAMUsed": 0,
-    "totalSecurityGroupsUsed": 0,
-    "totalFloatingIpsUsed": 1,
-    "totalServerGroupsUsed": 0,
-}
-
-EXAMPLE_GET_NETWORKS_RETURN_VALUE = [
-    {
-        'id': u'2755452c-4fe8-4ba1-9b26-8898665b0958',
-        'name': u'net2',
-        'tenant_id': u'680031a39ce040e1b81289ea8c73fb11',
-        'admin_state_up': True,
-    }
-]
-
-DEFAULT_METRICS = [
-    'openstack.controller',
-    'openstack.nova.current_workload',
-    'openstack.nova.disk_available_least',
-    'openstack.nova.free_disk_gb',
-    'openstack.nova.free_ram_mb',
-    'openstack.nova.hypervisor_load.1',
-    'openstack.nova.hypervisor_load.15',
-    'openstack.nova.hypervisor_load.5',
-    'openstack.nova.limits.max_image_meta',
-    'openstack.nova.limits.max_personality',
-    'openstack.nova.limits.max_personality_size',
-    'openstack.nova.limits.max_security_group_rules',
-    'openstack.nova.limits.max_security_groups',
-    'openstack.nova.limits.max_server_meta',
-    'openstack.nova.limits.max_total_cores',
-    'openstack.nova.limits.max_total_floating_ips',
-    'openstack.nova.limits.max_total_instances',
-    'openstack.nova.limits.max_total_keypairs',
-    'openstack.nova.limits.max_total_ram_size',
-    'openstack.nova.limits.total_cores_used',
-    'openstack.nova.limits.total_floating_ips_used',
-    'openstack.nova.limits.total_instances_used',
-    'openstack.nova.limits.total_ram_used',
-    'openstack.nova.limits.total_security_groups_used',
-    'openstack.nova.local_gb',
-    'openstack.nova.local_gb_used',
-    'openstack.nova.memory_mb',
-    'openstack.nova.memory_mb_used',
-    'openstack.nova.running_vms',
-    'openstack.nova.vcpus',
-    'openstack.nova.vcpus_used',
-]
+def remove_service_from_catalog(d, services):
+    catalog = d.get('token', {}).get('catalog', {})
+    new_catalog = []
+    for service in catalog:
+        if service['type'] not in services:
+            new_catalog.append(service)
+    return {**d, **{'token': {**d['token'], 'catalog': new_catalog}}}
diff --git a/openstack_controller/tests/fixtures/openstack_bad_config.yaml b/openstack_controller/tests/config/openstack_bad_config.yaml
similarity index 100%
rename from openstack_controller/tests/fixtures/openstack_bad_config.yaml
rename to openstack_controller/tests/config/openstack_bad_config.yaml
diff --git a/openstack_controller/tests/config/openstack_config.yaml b/openstack_controller/tests/config/openstack_config.yaml
new file mode 100644
index 0000000000000..5ae96246b28af
--- /dev/null
+++ b/openstack_controller/tests/config/openstack_config.yaml
@@ -0,0 +1,8 @@
+clouds:
+  test_cloud:
+    auth:
+      auth_url: http://${TF_VAR_network_ip}/identity
+      username: admin
+      password: password
+      user_domain_id: default
+      
\ No newline at end of file
diff --git a/openstack_controller/tests/config/openstack_config_unit_tests.yaml b/openstack_controller/tests/config/openstack_config_unit_tests.yaml
new file mode 100644
index 0000000000000..72a99dca4418c
--- /dev/null
+++ b/openstack_controller/tests/config/openstack_config_unit_tests.yaml
@@ -0,0 +1,9 @@
+clouds:
+  test_cloud:
+    auth:
+      auth_url: http://127.0.0.1:8080/identity
+      username: admin
+      password: password
+      project_name: admin
+      user_domain_name: Default
+      project_domain_name: Default
diff --git a/openstack_controller/tests/configs.py b/openstack_controller/tests/configs.py
new file mode 100644
index 0000000000000..f8cb9c62837ce
--- /dev/null
+++ b/openstack_controller/tests/configs.py
@@ -0,0 +1,453 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+import os
+
+CONFIG_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'config')
+TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH = os.path.join(CONFIG_DIR, 'openstack_config_unit_tests.yaml')
+TEST_OPENSTACK_CONFIG_E2E_PATH = os.path.join(CONFIG_DIR, 'openstack_config.yaml')
+TEST_OPENSTACK_UPDATED_CONFIG_E2E_PATH = os.path.join(CONFIG_DIR, 'openstack_config_updated.yaml')
+TEST_OPENSTACK_BAD_CONFIG_PATH = os.path.join(CONFIG_DIR, 'openstack_bad_config.yaml')
+
+REST = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'use_legacy_check_version': False,
+}
+
+REST_EXCLUDING_DEMO_PROJECT = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'use_legacy_check_version': False,
+    'projects': {
+        'include': ['.*'],
+        'exclude': ['^demo.*'],
+    },
+}
+
+REST_EXCLUDING_DEV_SERVERS = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'use_legacy_check_version': False,
+    'projects': {
+        'include': [
+            {
+                "name": "^admin.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            "^admin.*",
+                        ],
+                        "exclude": [
+                            "^dev.*",
+                        ],
+                    },
+                },
+            },
+            "^demo.*",
+        ],
+    },
+}
+
+REST_DEMO_SERVERS_COLLECT_FALSE = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'use_legacy_check_version': False,
+    "projects": {
+        "include": [
+            {
+                "name": "^admin.*",
+            },
+            {
+                "name": "^demo.*",
+                "compute": {
+                    "servers": False,
+                },
+            },
+        ],
+    },
+}
+
+REST_DEMO_SERVERS_DIAGNOSTICS_FALSE = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'use_legacy_check_version': False,
+    "projects": {
+        "include": [
+            {
+                "name": "^admin.*",
+            },
+            {
+                "name": "^demo.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            {
+                                "name": ".*",
+                                "diagnostics": False,
+                            },
+                        ],
+                    },
+                },
+            },
+        ],
+    },
+}
+
+REST_DEMO_SERVERS_FLAVORS_FALSE = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'use_legacy_check_version': False,
+    "projects": {
+        "include": [
+            {
+                "name": "^admin.*",
+            },
+            {
+                "name": "^demo.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            {
+                                "name": ".*",
+                                "flavors": False,
+                            },
+                        ],
+                    },
+                },
+            },
+        ],
+    },
+}
+
+REST_NOVA_MICROVERSION_2_93 = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'nova_microversion': '2.93',
+    'use_legacy_check_version': False,
+}
+
+REST_NOVA_MICROVERSION_2_93_EXCLUDING_DEMO_PROJECT = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'nova_microversion': '2.93',
+    'use_legacy_check_version': False,
+    'projects': {
+        'include': ['.*'],
+        'exclude': ['^demo.*'],
+    },
+}
+
+REST_NOVA_MICROVERSION_2_93_EXCLUDING_DEV_SERVERS = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'nova_microversion': '2.93',
+    'use_legacy_check_version': False,
+    'projects': {
+        'include': [
+            {
+                "name": "^admin.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            "^admin.*",
+                        ],
+                        "exclude": [
+                            "^dev.*",
+                        ],
+                    },
+                },
+            },
+            "^demo.*",
+        ],
+    },
+}
+
+REST_NOVA_MICROVERSION_2_93_DEMO_SERVERS_DIAGNOSTICS_FALSE = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'nova_microversion': '2.93',
+    'use_legacy_check_version': False,
+    "projects": {
+        "include": [
+            {
+                "name": "^admin.*",
+            },
+            {
+                "name": "^demo.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            {
+                                "name": ".*",
+                                "diagnostics": False,
+                            },
+                        ],
+                    },
+                },
+            },
+        ],
+    },
+}
+
+REST_NOVA_MICROVERSION_2_93_DEMO_SERVERS_FLAVORS_FALSE = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'nova_microversion': '2.93',
+    'use_legacy_check_version': False,
+    "projects": {
+        "include": [
+            {
+                "name": "^admin.*",
+            },
+            {
+                "name": "^demo.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            {
+                                "name": ".*",
+                                "flavors": False,
+                            },
+                        ],
+                    },
+                },
+            },
+        ],
+    },
+}
+
+REST_IRONIC_MICROVERSION_1_80 = {
+    'keystone_server_url': 'http://127.0.0.1:8080/identity',
+    'username': 'admin',
+    'password': 'password',
+    'ironic_microversion': '1.80',
+    'use_legacy_check_version': False,
+}
+
+SDK = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'use_legacy_check_version': False,
+}
+
+SDK_EXCLUDING_DEMO_PROJECT = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'use_legacy_check_version': False,
+    'projects': {
+        'include': ['.*'],
+        'exclude': ['^demo.*'],
+    },
+}
+
+SDK_EXCLUDING_DEV_SERVERS = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'use_legacy_check_version': False,
+    'projects': {
+        'include': [
+            {
+                "name": "^admin.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            "^admin.*",
+                        ],
+                        "exclude": [
+                            "^dev.*",
+                        ],
+                    },
+                },
+            },
+            "^demo.*",
+        ],
+    },
+}
+
+SDK_DEMO_SERVERS_COLLECT_FALSE = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'use_legacy_check_version': False,
+    "projects": {
+        "include": [
+            {
+                "name": "^admin.*",
+            },
+            {
+                "name": "^demo.*",
+                "compute": {
+                    "servers": False,
+                },
+            },
+        ],
+    },
+}
+
+SDK_DEMO_SERVERS_DIAGNOSTICS_FALSE = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'use_legacy_check_version': False,
+    "projects": {
+        "include": [
+            {
+                "name": "^admin.*",
+            },
+            {
+                "name": "^demo.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            {
+                                "name": ".*",
+                                "diagnostics": False,
+                            },
+                        ],
+                    },
+                },
+            },
+        ],
+    },
+}
+
+SDK_DEMO_SERVERS_FLAVORS_FALSE = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'use_legacy_check_version': False,
+    "projects": {
+        "include": [
+            {
+                "name": "^admin.*",
+            },
+            {
+                "name": "^demo.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            {
+                                "name": ".*",
+                                "flavors": False,
+                            },
+                        ],
+                    },
+                },
+            },
+        ],
+    },
+}
+
+SDK_NOVA_MICROVERSION_2_93 = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'nova_microversion': '2.93',
+    'use_legacy_check_version': False,
+}
+
+SDK_NOVA_MICROVERSION_2_93_DEMO_SERVERS_DIAGNOSTICS_FALSE = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'nova_microversion': '2.93',
+    'use_legacy_check_version': False,
+    "projects": {
+        "include": [
+            {
+                "name": "^admin.*",
+            },
+            {
+                "name": "^demo.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            {
+                                "name": ".*",
+                                "diagnostics": False,
+                            },
+                        ],
+                    },
+                },
+            },
+        ],
+    },
+}
+
+SDK_NOVA_MICROVERSION_2_93_EXCLUDING_DEMO_PROJECT = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'nova_microversion': '2.93',
+    'use_legacy_check_version': False,
+    'projects': {
+        'include': ['.*'],
+        'exclude': ['^demo.*'],
+    },
+}
+
+SDK_NOVA_MICROVERSION_2_93_EXCLUDING_DEV_SERVERS = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'nova_microversion': '2.93',
+    'use_legacy_check_version': False,
+    'projects': {
+        'include': [
+            {
+                "name": "^admin.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            "^admin.*",
+                        ],
+                        "exclude": [
+                            "^dev.*",
+                        ],
+                    },
+                },
+            },
+            "^demo.*",
+        ],
+    },
+}
+
+SDK_NOVA_MICROVERSION_2_93_DEMO_SERVERS_FLAVORS_FALSE = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'nova_microversion': '2.93',
+    'use_legacy_check_version': False,
+    "projects": {
+        "include": [
+            {
+                "name": "^admin.*",
+            },
+            {
+                "name": "^demo.*",
+                "compute": {
+                    "servers": {
+                        "include": [
+                            {
+                                "name": ".*",
+                                "flavors": False,
+                            },
+                        ],
+                    },
+                },
+            },
+        ],
+    },
+}
+
+SDK_IRONIC_MICROVERSION_1_80 = {
+    'openstack_cloud_name': 'test_cloud',
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+    'ironic_microversion': '1.80',
+    'use_legacy_check_version': False,
+}
diff --git a/openstack_controller/tests/conftest.py b/openstack_controller/tests/conftest.py
index 98515c3698cfd..74e8607c89025 100644
--- a/openstack_controller/tests/conftest.py
+++ b/openstack_controller/tests/conftest.py
@@ -1,41 +1,81 @@
 # (C) Datadog, Inc. 2019-present
 # All rights reserved
 # Licensed under a 3-clause BSD style license (see LICENSE)
+
+import json
 import os
+import re
+from pathlib import Path
+from urllib.parse import urlparse
 
+import mock
 import pytest
+import requests
+import yaml
 
-from datadog_checks.base.utils.http import RequestsWrapper
+import tests.configs as configs
 from datadog_checks.dev import docker_run
 from datadog_checks.dev.conditions import CheckDockerLogs
 from datadog_checks.dev.fs import get_here
-from datadog_checks.dev.ssh_tunnel import socks_proxy
-from datadog_checks.dev.terraform import terraform_run
+from datadog_checks.dev.http import MockResponse
 from datadog_checks.openstack_controller import OpenStackControllerCheck
 
-from .common import CHECK_NAME, CONFIG_FILE_INSTANCE, USE_OPENSTACK_SANDBOX
+from .endpoints import IRONIC_ENDPOINTS, NOVA_ENDPOINTS
+from .ssh_tunnel import socks_proxy
+from .terraform import terraform_run
+
+USE_OPENSTACK_GCP = os.environ.get('USE_OPENSTACK_GCP')
+OPENSTACK_E2E_LEGACY = os.environ.get('OPENSTACK_E2E_LEGACY')
 
 
 @pytest.fixture(scope='session')
 def dd_environment():
-    if USE_OPENSTACK_SANDBOX:
+    if USE_OPENSTACK_GCP:
+
+        def replace_env_vars(match):
+            # Extract variable name from the matched string
+            var_name = match.group(1)
+            # Return the environment variable value or the original string if not found
+            return os.environ.get(var_name, match.group(0))
+
+        # Read the YAML file
+        with open(configs.TEST_OPENSTACK_CONFIG_E2E_PATH, 'r') as file:
+            content = file.read()
+            # Replace environment variable placeholders
+            content = re.sub(r'\$\{([^}]+)\}', replace_env_vars, content)
+        # Parse the YAML with substituted values
+        data = yaml.safe_load(content)
+        # Write the modified content back to a file:
+        with open(configs.TEST_OPENSTACK_UPDATED_CONFIG_E2E_PATH, 'w') as file:
+            yaml.dump(data, file)
+
         with terraform_run(os.path.join(get_here(), 'terraform')) as outputs:
             ip = outputs['ip']['value']
             internal_ip = outputs['internal_ip']['value']
             private_key = outputs['ssh_private_key']['value']
             instance = {
-                'name': 'test',
-                'keystone_server_url': 'http://{}/identity/v3'.format(internal_ip),
-                'user': {'name': 'admin', 'password': 'labstack', 'domain': {'id': 'default'}},
+                'keystone_server_url': 'http://{}/identity'.format(internal_ip),
+                'username': 'admin',
+                'password': 'password',
                 'ssl_verify': False,
+                'nova_microversion': '2.93',
+                'ironic_microversion': '1.80',
+                'openstack_cloud_name': 'test_cloud',
+                'openstack_config_file_path': '/home/openstack_controller/tests/config/openstack_config_updated.yaml',
+                'endpoint_region_id': 'RegionOne',
+                'use_legacy_check_version': False,
             }
-            with socks_proxy(ip, 'ubuntu', private_key) as socks:
-                print("socks: %s", socks)
+            env = dict(os.environ)
+            with socks_proxy(
+                ip,
+                re.sub('([.@])', '_', env['TF_VAR_user']).lower(),
+                private_key,
+            ) as socks:
                 socks_ip, socks_port = socks
                 agent_config = {'proxy': {'http': 'socks5://{}:{}'.format(socks_ip, socks_port)}}
                 yield instance, agent_config
-    else:
-        compose_file = os.path.join(get_here(), 'docker', 'docker-compose.yaml')
+    elif OPENSTACK_E2E_LEGACY:
+        compose_file = os.path.join(get_here(), 'legacy', 'docker', 'docker-compose.yaml')
         conditions = [
             CheckDockerLogs(identifier='openstack-keystone', patterns=['server running']),
             CheckDockerLogs(identifier='openstack-nova', patterns=['server running']),
@@ -50,19 +90,697 @@ def dd_environment():
                 'ssl_verify': False,
             }
             yield instance
+    else:
+        compose_file = os.path.join(get_here(), 'docker', 'docker-compose.yaml')
+        conditions = [
+            CheckDockerLogs(identifier='openstack-keystone', patterns=['server running']),
+            CheckDockerLogs(identifier='openstack-nova', patterns=['server running']),
+            CheckDockerLogs(identifier='openstack-cinder', patterns=['server running']),
+            CheckDockerLogs(identifier='openstack-neutron', patterns=['server running']),
+            CheckDockerLogs(identifier='openstack-ironic', patterns=['server running']),
+            CheckDockerLogs(identifier='openstack-octavia', patterns=['server running']),
+        ]
+        with docker_run(compose_file, conditions=conditions):
+            instance = {
+                'keystone_server_url': 'http://127.0.0.1:8080/identity',
+                'username': 'admin',
+                'password': 'password',
+                'ssl_verify': False,
+                'use_legacy_check_version': False,
+            }
+            yield instance
 
 
 @pytest.fixture
-def instance():
-    return CONFIG_FILE_INSTANCE
+def openstack_controller_check():
+    return lambda instance: OpenStackControllerCheck('openstack', {}, [instance])
 
 
 @pytest.fixture
 def check(instance):
-    return OpenStackControllerCheck(CHECK_NAME, {}, [instance])
+    return OpenStackControllerCheck('openstack', {}, [instance])
+
+
+def get_json_value_from_file(file_path):
+    with open(file_path, 'r') as file:
+        return json.load(file)
+
+
+@pytest.fixture(scope='function')
+def microversion_headers():
+    headers = [None, None]
+    yield headers
+
+
+@pytest.fixture
+def mock_responses(microversion_headers):
+    responses_map = {}
+
+    def process_files(dir, response_parent):
+        for file in dir.rglob('*'):
+            if file.is_file() and file.stem != ".slash":
+                relative_dir_path = (
+                    "/" + str(file.parent.relative_to(dir)) + ("/" if (file.parent / ".slash").is_file() else "")
+                )
+                if relative_dir_path not in response_parent:
+                    response_parent[relative_dir_path] = {}
+                json_data = get_json_value_from_file(file)
+                response_parent[relative_dir_path][file.stem] = json_data
+
+    def process_dir(dir, response_parent):
+        response_parent[dir.name] = {}
+        process_files(dir, response_parent[dir.name])
+
+    def create_responses_tree():
+        root_dir_path = os.path.join(get_here(), 'fixtures')
+        method_subdirs = [d for d in Path(root_dir_path).iterdir() if d.is_dir() and d.name in ['GET', 'POST']]
+        for method_subdir in method_subdirs:
+            process_dir(method_subdir, responses_map)
+        nova_subdirs = [d for d in Path(root_dir_path).iterdir() if d.is_dir() and d.name.startswith('nova')]
+        for nova_subdir in nova_subdirs:
+            process_dir(nova_subdir, responses_map)
+        ironic_subdirs = [d for d in Path(root_dir_path).iterdir() if d.is_dir() and d.name.startswith('ironic')]
+        for ironic_subdir in ironic_subdirs:
+            process_dir(ironic_subdir, responses_map)
+
+    def method(method, url, file='response', headers=None):
+        filename = file
+        url = url.replace("?", "/")
+        if any(re.search(pattern, url) for pattern in NOVA_ENDPOINTS):
+            microversion = headers.get('X-OpenStack-Nova-API-Version') if headers else microversion_headers[0]
+            filename = f'{file}-{microversion}' if microversion else file
+        if any(re.search(pattern, url) for pattern in IRONIC_ENDPOINTS):
+            microversion = headers.get('X-OpenStack-Ironic-API-Version') if headers else microversion_headers[1]
+            filename = f'{file}-{microversion}' if microversion else file
+        response = responses_map.get(method, {}).get(url, {}).get(filename)
+        return response
+
+    create_responses_tree()
+    yield method
+
+
+@pytest.fixture
+def mock_http_call(mock_responses):
+    def call(method, url, file='response', headers=None):
+        response = mock_responses(method, url, file=file, headers=headers)
+        if response:
+            return response
+        http_response = requests.models.Response()
+        http_response.status_code = 404
+        http_response.reason = "Not Found"
+        http_response.url = url
+        raise requests.exceptions.HTTPError(response=http_response)
+
+    yield call
+
+
+@pytest.fixture
+def session_auth(request, mock_responses):
+    param = request.param if hasattr(request, 'param') and request.param is not None else {}
+    catalog = param.get('catalog')
+
+    def get_access(session):
+        project_id = session.return_value.project_id if session.return_value.project_id else 'unscoped'
+        token = mock_responses('POST', '/identity/v3/auth/tokens', project_id)['token']
+        return mock.MagicMock(
+            service_catalog=mock.MagicMock(catalog=catalog if catalog is not None else token.get('catalog', [])),
+            project_id=token.get('project', {}).get('id'),
+            role_names=[role.get('name') for role in token.get('roles', [])],
+        )
+
+    return mock.MagicMock(get_access=mock.MagicMock(side_effect=get_access))
+
+
+@pytest.fixture
+def openstack_session(session_auth, microversion_headers):
+    def session(auth, session):
+        microversion_headers[0] = session.headers.get('X-OpenStack-Nova-API-Version')
+        microversion_headers[1] = session.headers.get('X-OpenStack-Ironic-API-Version')
+        return mock.MagicMock(
+            return_value=mock.MagicMock(project_id=auth.project_id),
+            auth=session_auth,
+        )
+
+    with mock.patch('keystoneauth1.session.Session', side_effect=session) as mock_session:
+        yield mock_session
 
 
 @pytest.fixture
-def requests_wrapper():
-    instance = {'timeout': 10, 'ssl_verify': False}
-    yield RequestsWrapper(instance, {})
+def connection_authorize(request, mock_responses):
+    param = request.param if hasattr(request, 'param') and request.param is not None else {}
+    http_error = param.get('http_error')
+    exception = param.get('exception')
+
+    def authorize():
+        if exception is not None:
+            raise exception
+        if http_error is not None:
+            raise requests.exceptions.HTTPError(response=http_error)
+        return mock.MagicMock(return_value=["test_token"])
+
+    return mock.MagicMock(side_effect=authorize)
+
+
+@pytest.fixture
+def connection_identity(request, mock_responses):
+    param = request.param if hasattr(request, 'param') and request.param is not None else {}
+    http_error = param.get('http_error')
+
+    def regions():
+        if http_error and 'regions' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['regions'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=region,
+                )
+            )
+            for region in mock_responses('GET', '/identity/v3/regions')['regions']
+        ]
+
+    def domains():
+        if http_error and 'domains' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['domains'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=domain,
+                )
+            )
+            for domain in mock_responses('GET', '/identity/v3/domains')['domains']
+        ]
+
+    def projects():
+        if http_error and 'projects' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['projects'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=project,
+                )
+            )
+            for project in mock_responses('GET', '/identity/v3/projects')['projects']
+        ]
+
+    def users():
+        if http_error and 'users' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['users'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=user,
+                )
+            )
+            for user in mock_responses('GET', '/identity/v3/users')['users']
+        ]
+
+    def groups():
+        if http_error and 'groups' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['groups'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=group,
+                )
+            )
+            for group in mock_responses('GET', '/identity/v3/groups')['groups']
+        ]
+
+    def group_users(group_id):
+        if http_error and 'group_users' in http_error and group_id in http_error['group_users']:
+            raise requests.exceptions.HTTPError(response=http_error['group_users'][group_id])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=user,
+                )
+            )
+            for user in mock_responses('GET', f'/identity/v3/groups/{group_id}/users')['users']
+        ]
+
+    def services():
+        if http_error and 'services' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['services'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=service,
+                )
+            )
+            for service in mock_responses('GET', '/identity/v3/services')['services']
+        ]
+
+    def registered_limits():
+        if http_error and 'registered_limits' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['registered_limits'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=registered_limit,
+                )
+            )
+            for registered_limit in mock_responses('GET', '/identity/v3/registered_limits')['registered_limits']
+        ]
+
+    def limits():
+        if http_error and 'limits' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['limits'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=registered_limit,
+                )
+            )
+            for registered_limit in mock_responses('GET', '/identity/v3/limits')['limits']
+        ]
+
+    return mock.MagicMock(
+        regions=mock.MagicMock(side_effect=regions),
+        domains=mock.MagicMock(side_effect=domains),
+        projects=mock.MagicMock(side_effect=projects),
+        users=mock.MagicMock(side_effect=users),
+        groups=mock.MagicMock(side_effect=groups),
+        group_users=mock.MagicMock(side_effect=group_users),
+        services=mock.MagicMock(side_effect=services),
+        registered_limits=mock.MagicMock(side_effect=registered_limits),
+        limits=mock.MagicMock(side_effect=limits),
+    )
+
+
+@pytest.fixture
+def connection_compute(request, mock_responses):
+    param = request.param if hasattr(request, 'param') and request.param is not None else {}
+    http_error = param.get('http_error')
+
+    def get_limits(tenant_id):
+        if http_error and 'limits' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['limits'])
+        return mock.MagicMock(
+            to_dict=mock.MagicMock(
+                return_value=mock_responses('GET', f'/compute/v2.1/limits?tenant_id={tenant_id}')['limits'],
+            )
+        )
+
+    def services():
+        if http_error and 'services' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['services'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=service,
+                )
+            )
+            for service in mock_responses('GET', '/compute/v2.1/os-services')['services']
+        ]
+
+    def aggregates():
+        if http_error and 'aggregates' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['aggregates'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=aggregate,
+                )
+            )
+            for aggregate in mock_responses('GET', '/compute/v2.1/os-aggregates')['aggregates']
+        ]
+
+    def flavors(details):
+        if http_error and 'flavors' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['flavors'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=service,
+                )
+            )
+            for service in mock_responses('GET', '/compute/v2.1/flavors/detail')['flavors']
+        ]
+
+    def hypervisors(details):
+        if http_error and 'hypervisors' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['hypervisors'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=hypervisor,
+                )
+            )
+            for hypervisor in mock_responses('GET', '/compute/v2.1/os-hypervisors/detail')['hypervisors']
+        ]
+
+    def get_hypervisor_uptime(hypervisor_id):
+        if http_error and 'hypervisor_uptime' in http_error and hypervisor_id in http_error['hypervisor_uptime']:
+            raise requests.exceptions.HTTPError(response=http_error['hypervisor_uptime'][hypervisor_id])
+        return mock.MagicMock(
+            to_dict=mock.MagicMock(
+                return_value=mock_responses('GET', f'/compute/v2.1/os-hypervisors/{hypervisor_id}/uptime')[
+                    'hypervisor'
+                ],
+            )
+        )
+
+    def get_quota_set(project_id):
+        if http_error and 'quota_sets' in http_error and project_id in http_error['quota_sets']:
+            raise requests.exceptions.HTTPError(response=http_error['quota_sets'][project_id])
+        return mock.MagicMock(
+            to_dict=mock.MagicMock(
+                return_value=mock_responses('GET', f'/compute/v2.1/os-quota-sets/{project_id}')['quota_set']
+            )
+        )
+
+    def servers(project_id, details):
+        if http_error and 'servers' in http_error and project_id in http_error['servers']:
+            raise requests.exceptions.HTTPError(response=http_error['servers'][project_id])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=server,
+                )
+            )
+            for server in mock_responses('GET', f'/compute/v2.1/servers/detail?project_id={project_id}')['servers']
+        ]
+
+    def get_flavor(flavor_id):
+        if http_error and 'flavors' in http_error and flavor_id in http_error['flavors']:
+            raise requests.exceptions.HTTPError(response=http_error['flavors'][flavor_id])
+        return mock.MagicMock(
+            to_dict=mock.MagicMock(return_value=mock_responses('GET', f'/compute/v2.1/flavors/{flavor_id}')['flavor'])
+        )
+
+    def get_server_diagnostics(server_id):
+        if http_error and 'server_diagnostics' in http_error and server_id in http_error['server_diagnostics']:
+            raise requests.exceptions.HTTPError(response=http_error['server_diagnostics'][server_id])
+        return mock.MagicMock(
+            to_dict=mock.MagicMock(
+                return_value=mock_responses('GET', f'/compute/v2.1/servers/{server_id}/diagnostics'),
+            )
+        )
+
+    return mock.MagicMock(
+        get_limits=mock.MagicMock(side_effect=get_limits),
+        services=mock.MagicMock(side_effect=services),
+        aggregates=mock.MagicMock(side_effect=aggregates),
+        flavors=mock.MagicMock(side_effect=flavors),
+        hypervisors=mock.MagicMock(side_effect=hypervisors),
+        get_hypervisor_uptime=mock.MagicMock(side_effect=get_hypervisor_uptime),
+        get_quota_set=mock.MagicMock(side_effect=get_quota_set),
+        servers=mock.MagicMock(side_effect=servers),
+        get_flavor=mock.MagicMock(side_effect=get_flavor),
+        get_server_diagnostics=mock.MagicMock(side_effect=get_server_diagnostics),
+    )
+
+
+@pytest.fixture
+def connection_network(request, mock_responses):
+    param = request.param if hasattr(request, 'param') and request.param is not None else {}
+    http_error = param.get('http_error')
+
+    def agents():
+        if http_error and 'agents' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['agents'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=agent,
+                )
+            )
+            for agent in mock_responses('GET', '/networking/v2.0/agents')['agents']
+        ]
+
+    def networks(project_id):
+        if http_error and 'networks' in http_error and project_id in http_error['networks']:
+            raise requests.exceptions.HTTPError(response=http_error['networks'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=network,
+                )
+            )
+            for network in mock_responses('GET', f'/networking/v2.0/networks?project_id={project_id}')['networks']
+        ]
+
+    def get_quota(project_id, details):
+        if http_error and 'quotas' in http_error and project_id in http_error['quotas']:
+            raise requests.exceptions.HTTPError(response=http_error['quotas'][project_id])
+        return mock.MagicMock(
+            to_dict=mock.MagicMock(
+                return_value=mock_responses('GET', f'/networking/v2.0/quotas/{project_id}')['quota'],
+            )
+        )
+
+    return mock.MagicMock(
+        agents=mock.MagicMock(side_effect=agents),
+        networks=mock.MagicMock(side_effect=networks),
+        get_quota=mock.MagicMock(side_effect=get_quota),
+    )
+
+
+@pytest.fixture
+def connection_baremetal(request, mock_responses):
+    param = request.param if hasattr(request, 'param') and request.param is not None else {}
+    http_error = param.get('http_error')
+
+    def nodes(details):
+        if http_error and 'nodes' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['nodes'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=node,
+                )
+            )
+            for node in mock_responses('GET', '/baremetal/v1/nodes/detail')['nodes']
+        ]
+
+    def conductors():
+        if http_error and 'conductors' in http_error:
+            raise requests.exceptions.HTTPError(response=http_error['conductors'])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=node,
+                )
+            )
+            for node in mock_responses('GET', '/baremetal/v1/conductors')['conductors']
+        ]
+
+    return mock.MagicMock(nodes=mock.MagicMock(side_effect=nodes), conductors=mock.MagicMock(side_effect=conductors))
+
+
+@pytest.fixture
+def connection_load_balancer(request, mock_responses):
+    param = request.param if hasattr(request, 'param') and request.param is not None else {}
+    http_error = param.get('http_error')
+
+    def load_balancers(project_id):
+        if http_error and 'load_balancers' in http_error and project_id in http_error['load_balancers']:
+            raise requests.exceptions.HTTPError(response=http_error['load_balancers'][project_id])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=loadbalancer,
+                )
+            )
+            for loadbalancer in mock_responses('GET', f'/load-balancer/v2/lbaas/loadbalancers?project_id={project_id}')[
+                'loadbalancers'
+            ]
+        ]
+
+    def get_load_balancer_statistics(loadbalancer_id):
+        if (
+            http_error
+            and 'load_balancer_statistics' in http_error
+            and loadbalancer_id in http_error['load_balancer_statistics']
+        ):
+            raise requests.exceptions.HTTPError(response=http_error['load_balancer_statistics'][loadbalancer_id])
+        return mock.MagicMock(
+            to_dict=mock.MagicMock(
+                return_value=mock_responses(
+                    'GET', f'/load-balancer/v2/lbaas/loadbalancers/{loadbalancer_id}/stats'
+                ).get('stats', {}),
+            )
+        )
+
+    def listeners(project_id):
+        if http_error and 'listeners' in http_error and project_id in http_error['listeners']:
+            raise requests.exceptions.HTTPError(response=http_error['listeners'][project_id])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=listener,
+                )
+            )
+            for listener in mock_responses('GET', f'/load-balancer/v2/lbaas/listeners?project_id={project_id}')[
+                'listeners'
+            ]
+        ]
+
+    def get_listener_statistics(listener_id):
+        if http_error and 'listener_statistics' in http_error and listener_id in http_error['listener_statistics']:
+            raise requests.exceptions.HTTPError(response=http_error['listener_statistics'][listener_id])
+        return mock.MagicMock(
+            to_dict=mock.MagicMock(
+                return_value=mock_responses('GET', f'/load-balancer/v2/lbaas/listeners/{listener_id}/stats').get(
+                    'stats', {}
+                ),
+            )
+        )
+
+    def pools(project_id):
+        if http_error and 'pools' in http_error and project_id in http_error['pools']:
+            raise requests.exceptions.HTTPError(response=http_error['pools'][project_id])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=pool,
+                )
+            )
+            for pool in mock_responses('GET', f'/load-balancer/v2/lbaas/pools?project_id={project_id}')['pools']
+        ]
+
+    def members(pool_id, project_id):
+        if http_error and 'pool_members' in http_error and pool_id in http_error['pool_members']:
+            raise requests.exceptions.HTTPError(response=http_error['pool_members'][pool_id])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=member,
+                )
+            )
+            for member in mock_responses(
+                'GET', f'/load-balancer/v2/lbaas/pools/{pool_id}/members?project_id={project_id}'
+            )['members']
+        ]
+
+    def health_monitors(project_id):
+        if http_error and 'health_monitors' in http_error and project_id in http_error['health_monitors']:
+            raise requests.exceptions.HTTPError(response=http_error['health_monitors'][project_id])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=pool,
+                )
+            )
+            for pool in mock_responses('GET', f'/load-balancer/v2/lbaas/healthmonitors?project_id={project_id}')[
+                'healthmonitors'
+            ]
+        ]
+
+    def quotas(project_id):
+        if http_error and 'quotas' in http_error and project_id in http_error['quotas']:
+            raise requests.exceptions.HTTPError(response=http_error['quotas'][project_id])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=pool,
+                )
+            )
+            for pool in mock_responses('GET', f'/load-balancer/v2/lbaas/quotas?project_id={project_id}')['quotas']
+        ]
+
+    def amphorae(project_id):
+        if http_error and 'amphorae' in http_error and project_id in http_error['amphorae']:
+            raise requests.exceptions.HTTPError(response=http_error['amphorae'][project_id])
+        return [
+            mock.MagicMock(
+                to_dict=mock.MagicMock(
+                    return_value=amphora,
+                )
+            )
+            for amphora in mock_responses('GET', f'/load-balancer/v2/octavia/amphorae?project_id={project_id}')[
+                'amphorae'
+            ]
+        ]
+
+    return mock.MagicMock(
+        load_balancers=mock.MagicMock(side_effect=load_balancers),
+        get_load_balancer_statistics=mock.MagicMock(side_effect=get_load_balancer_statistics),
+        listeners=mock.MagicMock(side_effect=listeners),
+        get_listener_statistics=mock.MagicMock(side_effect=get_listener_statistics),
+        pools=mock.MagicMock(side_effect=pools),
+        members=mock.MagicMock(side_effect=members),
+        health_monitors=mock.MagicMock(side_effect=health_monitors),
+        quotas=mock.MagicMock(side_effect=quotas),
+        amphorae=mock.MagicMock(side_effect=amphorae),
+    )
+
+
+@pytest.fixture
+def openstack_connection(
+    openstack_session,
+    connection_authorize,
+    connection_identity,
+    connection_compute,
+    connection_network,
+    connection_baremetal,
+    connection_load_balancer,
+):
+    def connection(cloud, session, region_name):
+        return mock.MagicMock(
+            session=session,
+            authorize=connection_authorize,
+            identity=connection_identity,
+            compute=connection_compute,
+            network=connection_network,
+            baremetal=connection_baremetal,
+            load_balancer=connection_load_balancer,
+        )
+
+    with mock.patch('openstack.connection.Connection', side_effect=connection) as mock_connection:
+        yield mock_connection
+
+
+def get_url_path(url):
+    parsed_url = urlparse(url)
+    return parsed_url.path + "?" + parsed_url.query if parsed_url.query else parsed_url.path
+
+
+@pytest.fixture
+def mock_http_get(request, monkeypatch, mock_http_call):
+    param = request.param if hasattr(request, 'param') and request.param is not None else {}
+    http_error = param.pop('http_error', {})
+
+    def get(url, *args, **kwargs):
+        method = 'GET'
+        url = get_url_path(url)
+        if http_error and url in http_error:
+            raise requests.exceptions.HTTPError(response=http_error[url])
+        json_data = mock_http_call(method, url, headers=kwargs.get('headers'))
+        return MockResponse(json_data=json_data, status_code=200)
+
+    mock_get = mock.MagicMock(side_effect=get)
+    monkeypatch.setattr('requests.get', mock_get)
+    return mock_get
+
+
+@pytest.fixture
+def mock_http_post(request, monkeypatch, mock_http_call):
+    param = request.param if hasattr(request, 'param') and request.param is not None else {}
+    replace = param.get('replace')
+    exception = param.get('exception')
+    http_error = param.get('http_error')
+
+    def post(url, *args, **kwargs):
+        method = 'POST'
+        url = get_url_path(url)
+        if exception and url in exception:
+            raise exception[url]
+        if http_error and url in http_error:
+            raise requests.exceptions.HTTPError(response=http_error[url])
+        if url == '/identity/v3/auth/tokens':
+            data = kwargs['json']
+            scope = data.get('auth', {}).get('scope', 'unscoped')
+            if isinstance(scope, dict):
+                scope = scope.get('project', {}).get('id')
+            json_data = mock_http_call(method, url, scope, headers=kwargs.get('headers'))
+            headers = {'X-Subject-Token': f'token_{scope}'}
+        else:
+            json_data = mock_http_call(method, url)
+        if replace and url in replace:
+            json_data = replace[url](json_data)
+        return MockResponse(json_data=json_data, status_code=200, headers=headers)
+
+    mock_post = mock.MagicMock(side_effect=post)
+    monkeypatch.setattr('requests.post', mock_post)
+    return mock_post
diff --git a/openstack_controller/tests/docker/docker-compose.yaml b/openstack_controller/tests/docker/docker-compose.yaml
index 72feede33cd11..cfbee9df6f242 100644
--- a/openstack_controller/tests/docker/docker-compose.yaml
+++ b/openstack_controller/tests/docker/docker-compose.yaml
@@ -3,9 +3,10 @@ version: "3"
 services:
   openstack-keystone:
     image: caddy:2.6.2-alpine
+    build: .
     container_name: openstack-keystone
     volumes:
-      - ./fixtures/keystone:/usr/share/caddy
+      - ../fixtures:/usr/share/caddy
       - ./etc/caddy/keystone:/etc/caddy/
     ports:
       - "8080:80"
@@ -13,7 +14,7 @@ services:
     image: caddy:2.6.2-alpine
     container_name: openstack-nova
     volumes:
-      - ./fixtures/nova:/usr/share/caddy
+      - ../fixtures:/usr/share/caddy
       - ./etc/caddy/nova:/etc/caddy/
     ports:
       - "8774:80"
@@ -21,15 +22,31 @@ services:
     image: caddy:2.6.2-alpine
     container_name: openstack-neutron
     volumes:
-      - ./fixtures/neutron:/usr/share/caddy
+      - ../fixtures:/usr/share/caddy
       - ./etc/caddy/neutron:/etc/caddy/
     ports:
       - "9696:80"
+  openstack-cinder:
+    image: caddy:2.6.2-alpine
+    container_name: openstack-cinder
+    volumes:
+      - ../fixtures:/usr/share/caddy
+      - ./etc/caddy/cinder:/etc/caddy/
+    ports:
+      - "8776:80"
   openstack-ironic:
     image: caddy:2.6.2-alpine
     container_name: openstack-ironic
     volumes:
-      - ./fixtures/ironic:/usr/share/caddy
+      - ../fixtures:/usr/share/caddy
       - ./etc/caddy/ironic:/etc/caddy/
     ports:
       - "6385:80"
+  openstack-octavia:
+    image: caddy:2.6.2-alpine
+    container_name: openstack-octavia
+    volumes:
+      - ../fixtures:/usr/share/caddy
+      - ./etc/caddy/octavia:/etc/caddy/
+    ports:
+      - "9876:80"
diff --git a/openstack_controller/tests/docker/etc/caddy/cinder/Caddyfile b/openstack_controller/tests/docker/etc/caddy/cinder/Caddyfile
new file mode 100644
index 0000000000000..85a9d9e4b8db9
--- /dev/null
+++ b/openstack_controller/tests/docker/etc/caddy/cinder/Caddyfile
@@ -0,0 +1,16 @@
+{
+    debug
+    admin :2019
+}
+:80 {
+    root * /usr/share/caddy/
+    @get_volume_v3 {
+        method GET
+        path /volume/v3/
+    }
+    route @get_volume_v3 {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    file_server browse
+}
diff --git a/openstack_controller/tests/docker/etc/caddy/ironic/Caddyfile b/openstack_controller/tests/docker/etc/caddy/ironic/Caddyfile
index 504be62d1c753..511f58ea4d6c5 100644
--- a/openstack_controller/tests/docker/etc/caddy/ironic/Caddyfile
+++ b/openstack_controller/tests/docker/etc/caddy/ironic/Caddyfile
@@ -4,22 +4,30 @@
 }
 :80 {
     root * /usr/share/caddy/
-    @get_v1_conductors {
+    @get_baremetal {
+        method GET
+        path /baremetal
+    }
+    route @get_baremetal {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_baremetal_v1_nodes {
         method GET
         header X-Auth-Token "demo_test"
-        path /v1/conductors
+        path /baremetal/v1/nodes/detail
     }
-    route @get_v1_conductors {
-        rewrite /v1/conductors /v1/conductors/get.json
+    route @get_baremetal_v1_nodes {
+        rewrite * /GET{http.request.uri.path}/response.json
         file_server
     }
-    @get_v1_nodes {
+    @get_baremetal_v1_conductors {
         method GET
         header X-Auth-Token "demo_test"
-        path /v1/nodes
+        path /baremetal/v1/conductors
     }
-    route @get_v1_nodes {
-        rewrite /v1/nodes /v1/nodes/get.json
+    route @get_baremetal_v1_conductors {
+        rewrite * /GET{http.request.uri.path}/response.json
         file_server
     }
     file_server browse
diff --git a/openstack_controller/tests/docker/etc/caddy/keystone/Caddyfile b/openstack_controller/tests/docker/etc/caddy/keystone/Caddyfile
index 9aab840ca2f6c..4cc1fb3060a31 100644
--- a/openstack_controller/tests/docker/etc/caddy/keystone/Caddyfile
+++ b/openstack_controller/tests/docker/etc/caddy/keystone/Caddyfile
@@ -4,31 +4,112 @@
 }
 :80 {
     root * /usr/share/caddy/
-    @post_auth_tokens {
+    @post_identity_v3_auth_tokens {
         method POST
+        header_regexp authType X-Auth-Type ^(?P<token_id>[a-zA-Z0-9_-]+)$
         path /identity/v3/auth/tokens
     }
-    route @post_auth_tokens {
-        rewrite /identity/v3/auth/tokens /identity/v3/auth/tokens/post.json
-        header /identity/v3/auth/tokens/post.json X-Subject-Token "demo_test"
+    route @post_identity_v3_auth_tokens {
+        rewrite * /POST{http.request.uri.path}/{http.regexp.authType.token_id}.json
+        header * X-Subject-Token "demo_test"
         file_server
     }
-    @get_auth_projects {
+    @get_identity_v3_auth_projects {
         method GET
-        header X-Auth-Token "demo_test"
+        header "X-Auth-Token" "demo_test"
         path /identity/v3/auth/projects
     }
-    route @get_auth_projects {
-        rewrite /identity/v3/auth/projects /identity/v3/auth/projects/get.json
+    route @get_identity_v3_auth_projects {
+        rewrite * /GET{http.request.uri.path}/response.json
         file_server
     }
-    @get_projects {
+    @get_identity {
         method GET
-        header X-Auth-Token "demo_test"
+        path /identity
+    }
+    route @get_identity {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_identity_v3_regions {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /identity/v3/regions
+    }
+    route @get_identity_v3_regions {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_identity_v3_domains {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /identity/v3/domains
+    }
+    route @get_identity_v3_domains {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_identity_v3_projects {
+        method GET
+        header "X-Auth-Token" "demo_test"
         path /identity/v3/projects
     }
-    route @get_projects {
-        rewrite /identity/v3/projects /identity/v3/projects/get.json
+    route @get_identity_v3_projects {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_identity_v3_groups {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /identity/v3/groups
+    }
+    route @get_identity_v3_groups {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_identity_v3_users {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /identity/v3/users
+    }
+    route @get_identity_v3_users {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_identity_v3_groups_users {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /identity/v3/groups/*/users
+    }
+    route @get_identity_v3_groups_users {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_identity_v3_services {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /identity/v3/services
+    }
+    route @get_identity_v3_services {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_identity_v3_registered_limits {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /identity/v3/registered_limits
+    }
+    route @get_identity_v3_registered_limits {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_identity_v3_limits {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /identity/v3/limits
+    }
+    route @get_identity_v3_limits {
+        rewrite * /GET{http.request.uri.path}/response.json
         file_server
     }
     file_server browse
diff --git a/openstack_controller/tests/docker/etc/caddy/neutron/Caddyfile b/openstack_controller/tests/docker/etc/caddy/neutron/Caddyfile
index a17b8c94e2618..74fdf2c2689a0 100644
--- a/openstack_controller/tests/docker/etc/caddy/neutron/Caddyfile
+++ b/openstack_controller/tests/docker/etc/caddy/neutron/Caddyfile
@@ -4,22 +4,30 @@
 }
 :80 {
     root * /usr/share/caddy/
-    @get_root {
+    @get_networking {
+        method GET
+        path /networking
+    }
+    route @get_networking {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_networking_v_2_0_agents {
         method GET
         header X-Auth-Token "demo_test"
-        path /
+        path /networking/v2.0/agents
     }
-    route @get_root {
-        rewrite / /get.json
+    route @get_networking_v_2_0_agents {
+        rewrite * /GET{http.request.uri.path}/response.json
         file_server
     }
-    @get_v2_0_networks {
+    @get_networking_v_2_0_quotas {
         method GET
         header X-Auth-Token "demo_test"
-        path /v2.0/networks
+        path /networking/v2.0/quotas/*
     }
-    route @get_v2_0_networks {
-        rewrite /v2.0/networks /v2.0/networks/get.json
+    route @get_networking_v_2_0_quotas {
+        rewrite * /GET{http.request.uri.path}/response.json
         file_server
     }
     file_server browse
diff --git a/openstack_controller/tests/docker/etc/caddy/nova/Caddyfile b/openstack_controller/tests/docker/etc/caddy/nova/Caddyfile
index eac6354820ffa..c58c1ddb36498 100644
--- a/openstack_controller/tests/docker/etc/caddy/nova/Caddyfile
+++ b/openstack_controller/tests/docker/etc/caddy/nova/Caddyfile
@@ -4,58 +4,93 @@
 }
 :80 {
     root * /usr/share/caddy/
-    @get_v2_1_4bfc1 {
+    @get_compute_v_2_1 {
         method GET
-        header X-Auth-Token "demo_test"
-        path /v2.1/4bfc1
+        path /compute/v2.1
     }
-    route @get_v2_1_4bfc1 {
-        rewrite /v2.1/4bfc1 /v2.1/4bfc1/get.json
+    route @get_compute_v_2_1 {
+        rewrite * /GET/compute/v2.1/response.json
         file_server
     }
-    @get_limits {
+    @get_compute_v_2_1_limits {
         method GET
-        header X-Auth-Token "demo_test"
-        path /v2.1/4bfc1/limits
+        header "X-Auth-Token" "demo_test"
+        path /compute/v2.1/limits
     }
-    route @get_limits {
-        rewrite /v2.1/4bfc1/limits /v2.1/4bfc1/limits/{query.tenant_id}.json
+    route @get_compute_v_2_1_limits {
+        rewrite * /GET/compute/v2.1/limits/response.json
         file_server
     }
-    @get_servers_detail {
+    @get_compute_v_2_1_os_services {
         method GET
-        header X-Auth-Token "demo_test"
-        path /v2.1/4bfc1/servers/detail
+        header "X-Auth-Token" "demo_test"
+        path /compute/v2.1/os-services
     }
-    route @get_servers_detail {
-        rewrite /v2.1/4bfc1/servers/detail /v2.1/4bfc1/servers/detail/get.json
+    route @get_compute_v_2_1_os_services {
+        rewrite * /GET/compute/v2.1/os-services/response.json
         file_server
     }
-    @get_os_hypervisors_detail {
+    @get_compute_v_2_1_flavors_detail {
         method GET
-        header X-Auth-Token "demo_test"
-        path /v2.1/4bfc1/os-hypervisors/detail
+        header "X-Auth-Token" "demo_test"
+        path /compute/v2.1/flavors/detail
     }
-    route @get_os_hypervisors_detail {
-        rewrite /v2.1/4bfc1/os-hypervisors/detail /v2.1/4bfc1/os-hypervisors/detail/get.json
+    route @get_compute_v_2_1_flavors_detail {
+        rewrite * /GET/compute/v2.1/flavors/detail/response.json
         file_server
     }
-    @get_os_aggregates_detail {
+    @get_compute_v_2_1_hypervisors_detail {
         method GET
-        header X-Auth-Token "demo_test"
-        path /v2.1/4bfc1/os-aggregates
+        header "X-Auth-Token" "demo_test"
+        path /compute/v2.1/os-hypervisors/detail
     }
-    route @get_os_aggregates_detail {
-        rewrite /v2.1/4bfc1/os-aggregates /v2.1/4bfc1/os-aggregates/get.json
+    route @get_compute_v_2_1_hypervisors_detail {
+        rewrite * /GET/compute/v2.1/os-hypervisors/detail/response.json
         file_server
     }
-    @get_os_hypervisors_uptime {
+    @get_compute_v_2_1_hypervisors_1_uptime {
         method GET
-        header X-Auth-Token "demo_test"
-        path /v2.1/4bfc1/os-hypervisors/*/uptime
+        header "X-Auth-Token" "demo_test"
+        path /compute/v2.1/os-hypervisors/1/uptime
     }
-    route @get_os_hypervisors_uptime {
-        rewrite /v2.1/4bfc1/os-hypervisors/*/uptime /v2.1/4bfc1/os-hypervisors/uptime/get.json
+    route @get_compute_v_2_1_hypervisors_1_uptime {
+        rewrite * /GET/compute/v2.1/os-hypervisors/1/uptime/response.json
+        file_server
+    }
+    @get_compute_v_2_1_quota_sets {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /compute/v2.1/os-quota-sets/*
+    }
+    route @get_compute_v_2_1_quota_sets {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_compute_v_2_1_servers_detail {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /compute/v2.1/servers/detail
+    }
+    route @get_compute_v_2_1_servers_detail {
+        rewrite * /GET{http.request.uri.path}/{query}/response.json
+        file_server
+    }
+    @get_compute_v_2_1_flavors_id {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /compute/v2.1/flavors/*
+    }
+    route @get_compute_v_2_1_flavors_id {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_compute_v_2_1_servers_diagnostic {
+        method GET
+        header "X-Auth-Token" "demo_test"
+        path /compute/v2.1/servers/*/diagnostics
+    }
+    route @get_compute_v_2_1_servers_diagnostic {
+        rewrite * /GET{http.request.uri.path}/response.json
         file_server
     }
     file_server browse
diff --git a/openstack_controller/tests/docker/etc/caddy/octavia/Caddyfile b/openstack_controller/tests/docker/etc/caddy/octavia/Caddyfile
new file mode 100644
index 0000000000000..8d20a5f5f1e94
--- /dev/null
+++ b/openstack_controller/tests/docker/etc/caddy/octavia/Caddyfile
@@ -0,0 +1,52 @@
+{
+    debug
+    admin :2019
+}
+:80 {
+    root * /usr/share/caddy/
+    @get_load_balancer {
+        method GET
+        path /load-balancer
+    }
+    route @get_load_balancer {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_load_balancer_v2_load_balancers {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /load-balancer/v2/lbaas/loadbalancers
+    }
+    route @get_load_balancer_v2_load_balancers {
+        rewrite * /GET{http.request.uri.path}/{query}/response.json
+        file_server
+    }
+    @get_load_balancer_v2_load_balancers_stats {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /load-balancer/v2/lbaas/loadbalancers/*/stats
+    }
+    route @get_load_balancer_v2_load_balancers_stats {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    @get_load_balancer_v2_load_listeners {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /load-balancer/v2/lbaas/listeners
+    }
+    route @get_load_balancer_v2_load_listeners {
+        rewrite * /GET{http.request.uri.path}/{query}/response.json
+        file_server
+    }
+    @get_load_balancer_v2_load_listeners_stats {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /load-balancer/v2/lbaas/listeners/*/stats
+    }
+    route @get_load_balancer_v2_load_listeners_stats {
+        rewrite * /GET{http.request.uri.path}/response.json
+        file_server
+    }
+    file_server browse
+}
diff --git a/openstack_controller/tests/e2e-gcp/agent-integrations-openstack b/openstack_controller/tests/e2e-gcp/agent-integrations-openstack
new file mode 100755
index 0000000000000..09aef9dbd142f
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/agent-integrations-openstack
@@ -0,0 +1,13 @@
+#!/bin/bash
+#
+# source agent-integrations-openstack type
+#
+
+VM_TYPE=${1:-default}
+
+export TF_VAR_credentials_file="${GCP_SERVICE_ACCOUNT_PATH:-$HOME/service_accounts/agent-integrations-openstack.json}"
+export TF_VAR_instance_name="agent-integrations-openstack-${VM_TYPE}"
+export TF_VAR_user=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")
+export TF_VAR_desired_status="RUNNING"
+export TF_VAR_nat_ip="$(gcloud compute addresses list --project "datadog-integrations-lab" --filter="name=('${TF_VAR_instance_name}')" --format="get(address)")"
+export TF_VAR_network_ip="$(gcloud compute addresses list --project "datadog-integrations-lab" --filter="name=('${TF_VAR_instance_name}-int')" --format="get(address)")"
\ No newline at end of file
diff --git a/openstack_controller/tests/e2e-gcp/create-vm.sh b/openstack_controller/tests/e2e-gcp/create-vm.sh
new file mode 100755
index 0000000000000..48dd10477dc17
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/create-vm.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# create-vm type
+#
+
+VM_TYPE=${1:-default}
+
+DIR_OF_SCRIPT="$(dirname "$(realpath "$0")")"
+TEMP_DIR=$(mktemp -d)
+
+source "$DIR_OF_SCRIPT/agent-integrations-openstack" $VM_TYPE
+
+echo $TEMP_DIR
+
+cp -r "$DIR_OF_SCRIPT/$VM_TYPE" "$TEMP_DIR"
+cd "$TEMP_DIR/$VM_TYPE"
+
+terraform init
+terraform apply -auto-approve -input=false
+
+rm -rf $TEMP_DIR
\ No newline at end of file
diff --git a/openstack_controller/tests/e2e-gcp/default/gke_config.tf b/openstack_controller/tests/e2e-gcp/default/gke_config.tf
new file mode 100644
index 0000000000000..b50ec35ff7a5c
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/default/gke_config.tf
@@ -0,0 +1,24 @@
+variable "credentials_file" {
+  type = string
+}
+
+variable "desired_status" {
+  type = string
+}
+
+variable "network_ip" {
+  type = string
+}
+
+variable "nat_ip" {
+  type = string
+}
+
+variable "instance_name" {
+  type = string
+}
+
+resource "tls_private_key" "ssh-key" {
+  algorithm = "RSA"
+  rsa_bits = 4096
+}
diff --git a/openstack_controller/tests/e2e-gcp/default/main.tf b/openstack_controller/tests/e2e-gcp/default/main.tf
new file mode 100644
index 0000000000000..41fc272317fe9
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/default/main.tf
@@ -0,0 +1,54 @@
+resource "google_compute_instance" "openstack" {
+  desired_status = var.desired_status
+  name = var.instance_name
+  machine_type = "n1-standard-4"
+  tags = ["openstack", "lab"]
+  boot_disk {
+    initialize_params {
+      image = "ubuntu-os-cloud/ubuntu-2004-lts"
+      size = 100
+    }
+  }
+  network_interface {
+    network = "default"
+    network_ip = var.network_ip
+    access_config {
+      nat_ip = var.nat_ip
+    }
+  }
+  metadata = {
+    enable-oslogin = "TRUE"
+    ssh-keys = "ubuntu:${tls_private_key.ssh-key.public_key_openssh} ubuntu"
+  }
+  connection {
+    type = "ssh"
+    user = "ubuntu"
+    private_key = "${tls_private_key.ssh-key.private_key_pem}"
+    host = "${google_compute_instance.openstack.network_interface.0.access_config.0.nat_ip}"
+  }
+  provisioner "remote-exec" {
+    script = "script.sh"
+  }
+}
+
+data "google_compute_instance" "openstack" {
+  name = google_compute_instance.openstack.name
+  depends_on = [google_compute_instance.openstack]
+}
+
+output "ip" {
+  value = data.google_compute_instance.openstack.network_interface[0].access_config[0].nat_ip
+}
+
+output "internal_ip" {
+  value = data.google_compute_instance.openstack.network_interface[0].network_ip
+}
+
+output "ssh_private_key" {
+  value = "${tls_private_key.ssh-key.private_key_pem}"
+  sensitive = true
+}
+
+output "ssh_public_key" {
+  value = "${tls_private_key.ssh-key.public_key_openssh}"
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/e2e-gcp/default/providers.tf b/openstack_controller/tests/e2e-gcp/default/providers.tf
new file mode 100644
index 0000000000000..3f77a38de0ea0
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/default/providers.tf
@@ -0,0 +1,6 @@
+provider "google" {
+  credentials = var.credentials_file
+  project = "datadog-integrations-lab"
+  region = "europe-west4"
+  zone = "europe-west4-a"
+}
diff --git a/openstack_controller/tests/e2e-gcp/default/script.sh b/openstack_controller/tests/e2e-gcp/default/script.sh
new file mode 100644
index 0000000000000..d1d5023886c44
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/default/script.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+sudo apt update
+sudo apt upgrade -y
+sudo useradd -s /bin/bash -d /opt/stack -m stack
+echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers
+cd /opt/stack
+sudo git clone https://opendev.org/openstack/devstack
+cd devstack
+sudo git checkout origin/stable/zed
+cat <<EOF | sudo tee -a local.conf
+[[local|localrc]]
+DATABASE_PASSWORD=password
+ADMIN_PASSWORD=password
+SERVICE_PASSWORD=password
+SERVICE_TOKEN=password
+RABBIT_PASSWORD=password
+# Enable Logging
+LOGFILE=/opt/stack/logs/stack.sh.log
+VERBOSE=True
+LOG_COLOR=True
+EOF
+sudo chown stack:stack /opt/stack/devstack -R
+sudo -u stack -H ./stack.sh
\ No newline at end of file
diff --git a/openstack_controller/tests/e2e-gcp/ironic/gke_config.tf b/openstack_controller/tests/e2e-gcp/ironic/gke_config.tf
new file mode 100644
index 0000000000000..b50ec35ff7a5c
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/ironic/gke_config.tf
@@ -0,0 +1,24 @@
+variable "credentials_file" {
+  type = string
+}
+
+variable "desired_status" {
+  type = string
+}
+
+variable "network_ip" {
+  type = string
+}
+
+variable "nat_ip" {
+  type = string
+}
+
+variable "instance_name" {
+  type = string
+}
+
+resource "tls_private_key" "ssh-key" {
+  algorithm = "RSA"
+  rsa_bits = 4096
+}
diff --git a/openstack_controller/tests/e2e-gcp/ironic/main.tf b/openstack_controller/tests/e2e-gcp/ironic/main.tf
new file mode 100644
index 0000000000000..41fc272317fe9
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/ironic/main.tf
@@ -0,0 +1,54 @@
+resource "google_compute_instance" "openstack" {
+  desired_status = var.desired_status
+  name = var.instance_name
+  machine_type = "n1-standard-4"
+  tags = ["openstack", "lab"]
+  boot_disk {
+    initialize_params {
+      image = "ubuntu-os-cloud/ubuntu-2004-lts"
+      size = 100
+    }
+  }
+  network_interface {
+    network = "default"
+    network_ip = var.network_ip
+    access_config {
+      nat_ip = var.nat_ip
+    }
+  }
+  metadata = {
+    enable-oslogin = "TRUE"
+    ssh-keys = "ubuntu:${tls_private_key.ssh-key.public_key_openssh} ubuntu"
+  }
+  connection {
+    type = "ssh"
+    user = "ubuntu"
+    private_key = "${tls_private_key.ssh-key.private_key_pem}"
+    host = "${google_compute_instance.openstack.network_interface.0.access_config.0.nat_ip}"
+  }
+  provisioner "remote-exec" {
+    script = "script.sh"
+  }
+}
+
+data "google_compute_instance" "openstack" {
+  name = google_compute_instance.openstack.name
+  depends_on = [google_compute_instance.openstack]
+}
+
+output "ip" {
+  value = data.google_compute_instance.openstack.network_interface[0].access_config[0].nat_ip
+}
+
+output "internal_ip" {
+  value = data.google_compute_instance.openstack.network_interface[0].network_ip
+}
+
+output "ssh_private_key" {
+  value = "${tls_private_key.ssh-key.private_key_pem}"
+  sensitive = true
+}
+
+output "ssh_public_key" {
+  value = "${tls_private_key.ssh-key.public_key_openssh}"
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/e2e-gcp/ironic/providers.tf b/openstack_controller/tests/e2e-gcp/ironic/providers.tf
new file mode 100644
index 0000000000000..3f77a38de0ea0
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/ironic/providers.tf
@@ -0,0 +1,6 @@
+provider "google" {
+  credentials = var.credentials_file
+  project = "datadog-integrations-lab"
+  region = "europe-west4"
+  zone = "europe-west4-a"
+}
diff --git a/openstack_controller/tests/e2e-gcp/ironic/script.sh b/openstack_controller/tests/e2e-gcp/ironic/script.sh
new file mode 100644
index 0000000000000..4b18555f018e3
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/ironic/script.sh
@@ -0,0 +1,108 @@
+#!/bin/bash
+sudo apt update
+sudo apt upgrade -y
+sudo useradd -s /bin/bash -d /opt/stack -m stack
+echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers
+cd /opt/stack
+sudo git clone https://opendev.org/openstack/devstack
+cd devstack
+sudo git checkout stable/zed
+cat <<EOF | sudo tee -a local.conf
+[[local|localrc]]
+# Credentials
+ADMIN_PASSWORD=password
+DATABASE_PASSWORD=password
+RABBIT_PASSWORD=password
+SERVICE_PASSWORD=password
+SERVICE_TOKEN=password
+
+# Set glance's default limit to be baremetal image friendly
+GLANCE_LIMIT_IMAGE_SIZE_TOTAL=5000
+
+# Configure ironic from ironic devstack plugin.
+enable_plugin ironic https://opendev.org/openstack/ironic stable/zed
+enable_plugin ironic-ui https://github.com/openstack/ironic-ui stable/zed
+
+# Create 3 virtual machines to pose as Ironic's baremetal nodes.
+IRONIC_VM_COUNT=3
+IRONIC_BAREMETAL_BASIC_OPS=True
+DEFAULT_INSTANCE_TYPE=baremetal
+
+# Enable services
+enable_service horizon
+enable_service g-api
+enable_service key
+enable_service memory_tracker
+enable_service mysql
+enable_service q-agt
+enable_service q-dhcp
+enable_service q-l3
+enable_service q-meta
+enable_service q-metering
+enable_service q-svc
+enable_service rabbit
+
+# Enable Ironic API and Ironic Conductor
+enable_service ironic
+enable_service ir-api
+enable_service ir-cond
+
+# Disable nova novnc service, ironic does not support it anyway.
+disable_service n-novnc
+
+# Disable Cinder
+disable_service cinder c-sch c-api c-vol
+
+# Disable Tempest
+disable_service tempest
+
+IRONIC_RPC_TRANSPORT=json-rpc
+IRONIC_RAMDISK_TYPE=tinyipa
+IRONIC_RAMDISK_TYPE=tinyipa
+
+# Enable additional hardware types, if needed.
+IRONIC_ENABLED_HARDWARE_TYPES=ipmi,fake-hardware
+# Don't forget that many hardware types require enabling of additional
+# interfaces, most often power and management:
+IRONIC_ENABLED_MANAGEMENT_INTERFACES=ipmitool,fake
+IRONIC_ENABLED_POWER_INTERFACES=ipmitool,fake
+IRONIC_DEFAULT_DEPLOY_INTERFACE=direct
+
+# Change this to alter the default driver for nodes created by devstack.
+# This driver should be in the enabled list above.
+IRONIC_DEPLOY_DRIVER="ipmi"
+
+# The parameters below represent the minimum possible values to create
+# functional nodes.
+IRONIC_VM_SPECS_RAM=1024
+IRONIC_VM_SPECS_DISK=3
+
+# Size of the ephemeral partition in GB. Use 0 for no ephemeral partition.
+IRONIC_VM_EPHEMERAL_DISK=0
+
+# To build your own IPA ramdisk from source, set this to True
+IRONIC_BUILD_DEPLOY_RAMDISK=False
+
+INSTALL_TEMPEST=False
+VIRT_DRIVER=ironic
+
+# By default, DevStack creates a 10.0.0.0/24 network for instances.
+# If this overlaps with the hosts network, you may adjust with the
+# following.
+IP_VERSION=4
+FIXED_RANGE=10.1.0.0/20
+IPV4_ADDRS_SAFE_TO_USE=10.1.0.0/20
+NETWORK_GATEWAY=10.1.0.1
+
+Q_AGENT=openvswitch
+Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch
+Q_ML2_TENANT_NETWORK_TYPE=vxlan
+
+# Log all output to files
+LOGFILE=/opt/stack/devstack.log
+LOGDIR=/opt/stack/logs
+IRONIC_VM_LOG_DIR=/opt/stack/ironic-bm-logs
+EOF
+sudo chown stack:stack /opt/stack/devstack -R
+sudo -u stack -H ./stack.sh
+
diff --git a/openstack_controller/tests/e2e-gcp/octavia/gke_config.tf b/openstack_controller/tests/e2e-gcp/octavia/gke_config.tf
new file mode 100644
index 0000000000000..b50ec35ff7a5c
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/octavia/gke_config.tf
@@ -0,0 +1,24 @@
+variable "credentials_file" {
+  type = string
+}
+
+variable "desired_status" {
+  type = string
+}
+
+variable "network_ip" {
+  type = string
+}
+
+variable "nat_ip" {
+  type = string
+}
+
+variable "instance_name" {
+  type = string
+}
+
+resource "tls_private_key" "ssh-key" {
+  algorithm = "RSA"
+  rsa_bits = 4096
+}
diff --git a/openstack_controller/tests/e2e-gcp/octavia/main.tf b/openstack_controller/tests/e2e-gcp/octavia/main.tf
new file mode 100644
index 0000000000000..41fc272317fe9
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/octavia/main.tf
@@ -0,0 +1,54 @@
+resource "google_compute_instance" "openstack" {
+  desired_status = var.desired_status
+  name = var.instance_name
+  machine_type = "n1-standard-4"
+  tags = ["openstack", "lab"]
+  boot_disk {
+    initialize_params {
+      image = "ubuntu-os-cloud/ubuntu-2004-lts"
+      size = 100
+    }
+  }
+  network_interface {
+    network = "default"
+    network_ip = var.network_ip
+    access_config {
+      nat_ip = var.nat_ip
+    }
+  }
+  metadata = {
+    enable-oslogin = "TRUE"
+    ssh-keys = "ubuntu:${tls_private_key.ssh-key.public_key_openssh} ubuntu"
+  }
+  connection {
+    type = "ssh"
+    user = "ubuntu"
+    private_key = "${tls_private_key.ssh-key.private_key_pem}"
+    host = "${google_compute_instance.openstack.network_interface.0.access_config.0.nat_ip}"
+  }
+  provisioner "remote-exec" {
+    script = "script.sh"
+  }
+}
+
+data "google_compute_instance" "openstack" {
+  name = google_compute_instance.openstack.name
+  depends_on = [google_compute_instance.openstack]
+}
+
+output "ip" {
+  value = data.google_compute_instance.openstack.network_interface[0].access_config[0].nat_ip
+}
+
+output "internal_ip" {
+  value = data.google_compute_instance.openstack.network_interface[0].network_ip
+}
+
+output "ssh_private_key" {
+  value = "${tls_private_key.ssh-key.private_key_pem}"
+  sensitive = true
+}
+
+output "ssh_public_key" {
+  value = "${tls_private_key.ssh-key.public_key_openssh}"
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/e2e-gcp/octavia/providers.tf b/openstack_controller/tests/e2e-gcp/octavia/providers.tf
new file mode 100644
index 0000000000000..3f77a38de0ea0
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/octavia/providers.tf
@@ -0,0 +1,6 @@
+provider "google" {
+  credentials = var.credentials_file
+  project = "datadog-integrations-lab"
+  region = "europe-west4"
+  zone = "europe-west4-a"
+}
diff --git a/openstack_controller/tests/e2e-gcp/octavia/script.sh b/openstack_controller/tests/e2e-gcp/octavia/script.sh
new file mode 100644
index 0000000000000..d982b0aef2a21
--- /dev/null
+++ b/openstack_controller/tests/e2e-gcp/octavia/script.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+sudo apt update
+sudo apt upgrade -y
+sudo useradd -s /bin/bash -d /opt/stack -m stack
+echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers
+cd /opt/stack
+sudo git clone https://opendev.org/openstack/devstack
+cd devstack
+sudo git checkout stable/zed
+cat <<EOF | sudo tee -a local.conf
+# Sample ``local.conf`` that builds a devstack with neutron LBaaS Version 2
+
+# NOTE: Copy this file to the root DevStack directory for it to work properly.
+
+# ``local.conf`` is a user-maintained settings file that is sourced from ``stackrc``.
+# This gives it the ability to override any variables set in ``stackrc``.
+# Also, most of the settings in ``stack.sh`` are written to only be set if no
+# value has already been set; this lets ``local.conf`` effectively override the
+# default values.
+
+# The ``localrc`` section replaces the old ``localrc`` configuration file.
+# Note that if ``localrc`` is present it will be used in favor of this section.
+
+[[local|localrc]]
+# ===== BEGIN localrc =====
+DATABASE_PASSWORD=password
+ADMIN_PASSWORD=password
+SERVICE_PASSWORD=password
+SERVICE_TOKEN=password
+RABBIT_PASSWORD=password
+# Optional settings:
+# OCTAVIA_AMP_BASE_OS=centos
+# OCTAVIA_AMP_DISTRIBUTION_RELEASE_ID=9-stream
+# OCTAVIA_AMP_IMAGE_SIZE=3
+# OCTAVIA_LB_TOPOLOGY=ACTIVE_STANDBY
+# OCTAVIA_ENABLE_AMPHORAV2_JOBBOARD=True
+# LIBS_FROM_GIT+=octavia-lib,
+# Enable Logging
+LOGFILE=/opt/stack/logs/stack.sh.log
+VERBOSE=True
+LOG_COLOR=True
+enable_service rabbit
+enable_plugin neutron https://opendev.org/openstack/neutron stable/zed
+# Octavia supports using QoS policies on the VIP port:
+enable_service q-qos
+enable_service placement-api placement-client
+# Octavia services
+enable_plugin octavia https://opendev.org/openstack/octavia stable/zed
+enable_plugin octavia-dashboard https://opendev.org/openstack/octavia-dashboard stable/zed
+enable_plugin ovn-octavia-provider https://opendev.org/openstack/ovn-octavia-provider stable/zed
+#enable_plugin octavia-tempest-plugin https://opendev.org/openstack/octavia-tempest-plugin master
+enable_service octavia o-api o-cw o-hm o-hk o-da
+# If you are enabling barbican for TLS offload in Octavia, include it here.
+# enable_plugin barbican https://opendev.org/openstack/barbican stable/zed
+# enable_service barbican
+# Cinder (optional)
+disable_service c-api c-vol c-sch
+# Tempest
+#enable_service tempest
+# ===== END localrc =====
+EOF
+sudo chown stack:stack /opt/stack/devstack -R
+sudo -u stack -H ./stack.sh
\ No newline at end of file
diff --git a/openstack_controller/tests/endpoints.py b/openstack_controller/tests/endpoints.py
new file mode 100644
index 0000000000000..81e9caf305431
--- /dev/null
+++ b/openstack_controller/tests/endpoints.py
@@ -0,0 +1,19 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+NOVA_ENDPOINTS = [
+    '^/compute/v2\\.1/limits$',
+    '^/compute/v2\\.1/os-services$',
+    '^/compute/v2\\.1/flavors/detail$',
+    '^/compute/v2\\.1/os-hypervisors/detail$',
+    '^/compute/v2\\.1/os-quota-sets/[^/]+$',
+    '^/compute/v2\\.1/servers/detail/project_id=[^/]+$',
+    '^/compute/v2\\.1/servers/[^/]+/diagnostics$',
+]
+
+IRONIC_ENDPOINTS = [
+    '^/baremetal/v1/nodes/detail$',
+    '^/baremetal/v1/nodes/detail=True$',
+    '^/baremetal/v1/conductors$',
+]
diff --git a/openstack_controller/tests/fixtures/GET/baremetal/response.json b/openstack_controller/tests/fixtures/GET/baremetal/response.json
new file mode 100644
index 0000000000000..fb8437c66e34a
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/baremetal/response.json
@@ -0,0 +1,30 @@
+{
+  "name": "OpenStack Ironic API",
+  "description": "Ironic is an OpenStack project which enables the provision and management of baremetal machines.",
+  "default_version": {
+    "id": "v1",
+    "links": [
+      {
+        "href": "http://34.141.226.224/baremetal/v1/",
+        "rel": "self"
+      }
+    ],
+    "status": "CURRENT",
+    "min_version": "1.1",
+    "version": "1.80"
+  },
+  "versions": [
+    {
+      "id": "v1",
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/",
+          "rel": "self"
+        }
+      ],
+      "status": "CURRENT",
+      "min_version": "1.1",
+      "version": "1.80"
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/conductors/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/conductors/response-1.80.json
new file mode 100644
index 0000000000000..0f0facdbcd48a
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/conductors/response-1.80.json
@@ -0,0 +1,19 @@
+{
+    "conductors": [
+      {
+        "hostname": "agent-integrations-openstack-ironic",
+        "conductor_group": "",
+        "links": [
+          {
+            "href": "http://34.141.226.224/baremetal/v1/conductors/agent-integrations-openstack-ironic",
+            "rel": "self"
+          },
+          {
+            "href": "http://34.141.226.224/baremetal/conductors/agent-integrations-openstack-ironic",
+            "rel": "bookmark"
+          }
+        ],
+        "alive": true
+      }
+    ]
+  }
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/response-1.80.json
new file mode 100644
index 0000000000000..aaefca8954218
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/response-1.80.json
@@ -0,0 +1,535 @@
+{
+  "nodes": [
+    {
+      "uuid": "9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+      "created_at": "2023-04-06T15:26:48+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "automated_clean": null,
+      "bios_interface": "no-bios",
+      "boot_interface": "ipxe",
+      "boot_mode": null,
+      "clean_step": {},
+      "conductor_group": "",
+      "console_enabled": false,
+      "console_interface": "no-console",
+      "deploy_interface": "direct",
+      "deploy_step": {},
+      "description": null,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6230
+      },
+      "driver_internal_info": {
+        "clean_steps": null,
+        "agent_erase_devices_iterations": 1,
+        "agent_erase_devices_zeroize": true,
+        "agent_continue_if_secure_erase_failed": false,
+        "agent_continue_if_ata_erase_failed": false,
+        "agent_enable_nvme_secure_erase": true,
+        "agent_enable_ata_secure_erase": true,
+        "disk_erasure_concurrency": 4,
+        "agent_erase_skip_read_only": false,
+        "last_power_state_change": "2023-04-06T16:52:27.251280",
+        "agent_version": "9.5.0.dev4",
+        "agent_last_heartbeat": "2023-04-06T15:32:50.985822",
+        "hardware_manager_version": {
+          "generic_hardware_manager": "1.1"
+        },
+        "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:43.388480"
+      },
+      "extra": {},
+      "fault": "power failure",
+      "inspection_finished_at": null,
+      "inspection_started_at": null,
+      "inspect_interface": "no-inspect",
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "lessee": null,
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "management_interface": "ipmitool",
+      "name": "node-0",
+      "network_data": {},
+      "network_interface": "flat",
+      "owner": "01b21103a92d4997ab09e46ff8346bd5",
+      "power_interface": "ipmitool",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "protected": false,
+      "protected_reason": null,
+      "provision_state": "active",
+      "provision_updated_at": "2023-04-06T16:58:16+00:00",
+      "raid_config": {},
+      "raid_interface": "no-raid",
+      "rescue_interface": "no-rescue",
+      "reservation": null,
+      "resource_class": "baremetal",
+      "retired": false,
+      "retired_reason": null,
+      "secure_boot": null,
+      "storage_interface": "noop",
+      "target_power_state": null,
+      "target_provision_state": null,
+      "target_raid_config": {},
+      "traits": [
+        "CUSTOM_GOLD"
+      ],
+      "vendor_interface": "ipmitool",
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+          "rel": "bookmark"
+        }
+      ],
+      "conductor": "agent-integrations-openstack-ironic",
+      "allocation_uuid": null,
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports",
+          "rel": "bookmark"
+        }
+      ],
+      "states": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/states",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/states",
+          "rel": "bookmark"
+        }
+      ],
+      "portgroups": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/portgroups",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/portgroups",
+          "rel": "bookmark"
+        }
+      ],
+      "volume": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/volume",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/volume",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+      "created_at": "2023-04-06T15:27:05+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "automated_clean": null,
+      "bios_interface": "no-bios",
+      "boot_interface": "ipxe",
+      "boot_mode": null,
+      "clean_step": {},
+      "conductor_group": "",
+      "console_enabled": false,
+      "console_interface": "no-console",
+      "deploy_interface": "direct",
+      "deploy_step": {},
+      "description": null,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6231
+      },
+      "driver_internal_info": {
+        "clean_steps": null,
+        "agent_erase_devices_iterations": 1,
+        "agent_erase_devices_zeroize": true,
+        "agent_continue_if_secure_erase_failed": false,
+        "agent_continue_if_ata_erase_failed": false,
+        "agent_enable_nvme_secure_erase": true,
+        "agent_enable_ata_secure_erase": true,
+        "disk_erasure_concurrency": 4,
+        "agent_erase_skip_read_only": false,
+        "last_power_state_change": "2023-04-06T16:54:04.258902",
+        "agent_version": "9.5.0.dev4",
+        "agent_last_heartbeat": "2023-04-06T15:32:56.433647",
+        "hardware_manager_version": {
+          "generic_hardware_manager": "1.1"
+        },
+        "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:49.508661"
+      },
+      "extra": {},
+      "fault": "power failure",
+      "inspection_finished_at": null,
+      "inspection_started_at": null,
+      "inspect_interface": "no-inspect",
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "lessee": null,
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "management_interface": "ipmitool",
+      "name": "node-1",
+      "network_data": {},
+      "network_interface": "flat",
+      "owner": "01b21103a92d4997ab09e46ff8346bd5",
+      "power_interface": "ipmitool",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "protected": false,
+      "protected_reason": null,
+      "provision_state": "available",
+      "provision_updated_at": "2023-04-06T15:33:46+00:00",
+      "raid_config": {},
+      "raid_interface": "no-raid",
+      "rescue_interface": "no-rescue",
+      "reservation": null,
+      "resource_class": "baremetal",
+      "retired": false,
+      "retired_reason": null,
+      "secure_boot": null,
+      "storage_interface": "noop",
+      "target_power_state": null,
+      "target_provision_state": null,
+      "target_raid_config": {},
+      "traits": [
+        "CUSTOM_GOLD"
+      ],
+      "vendor_interface": "ipmitool",
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+          "rel": "bookmark"
+        }
+      ],
+      "conductor": "agent-integrations-openstack-ironic",
+      "allocation_uuid": null,
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports",
+          "rel": "bookmark"
+        }
+      ],
+      "states": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/states",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/states",
+          "rel": "bookmark"
+        }
+      ],
+      "portgroups": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/portgroups",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/portgroups",
+          "rel": "bookmark"
+        }
+      ],
+      "volume": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/volume",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/volume",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "54855e59-83ca-46f8-a78f-55d3370e0656",
+      "created_at": "2023-04-06T15:27:22+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "automated_clean": null,
+      "bios_interface": "no-bios",
+      "boot_interface": "ipxe",
+      "boot_mode": null,
+      "clean_step": {},
+      "conductor_group": "",
+      "console_enabled": false,
+      "console_interface": "no-console",
+      "deploy_interface": "direct",
+      "deploy_step": {},
+      "description": null,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6232
+      },
+      "driver_internal_info": {
+        "clean_steps": null,
+        "agent_erase_devices_iterations": 1,
+        "agent_erase_devices_zeroize": true,
+        "agent_continue_if_secure_erase_failed": false,
+        "agent_continue_if_ata_erase_failed": false,
+        "agent_enable_nvme_secure_erase": true,
+        "agent_enable_ata_secure_erase": true,
+        "disk_erasure_concurrency": 4,
+        "agent_erase_skip_read_only": false,
+        "last_power_state_change": "2023-04-06T16:54:09.291881",
+        "agent_version": "9.5.0.dev4",
+        "agent_last_heartbeat": "2023-04-06T15:32:56.628016",
+        "hardware_manager_version": {
+          "generic_hardware_manager": "1.1"
+        },
+        "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:49.857774"
+      },
+      "extra": {},
+      "fault": "power failure",
+      "inspection_finished_at": null,
+      "inspection_started_at": null,
+      "inspect_interface": "no-inspect",
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "lessee": null,
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "management_interface": "ipmitool",
+      "name": "node-2",
+      "network_data": {},
+      "network_interface": "flat",
+      "owner": "01b21103a92d4997ab09e46ff8346bd5",
+      "power_interface": "ipmitool",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "protected": false,
+      "protected_reason": null,
+      "provision_state": "available",
+      "provision_updated_at": "2023-04-06T15:33:44+00:00",
+      "raid_config": {},
+      "raid_interface": "no-raid",
+      "rescue_interface": "no-rescue",
+      "reservation": null,
+      "resource_class": "baremetal",
+      "retired": false,
+      "retired_reason": null,
+      "secure_boot": null,
+      "storage_interface": "noop",
+      "target_power_state": null,
+      "target_provision_state": null,
+      "target_raid_config": {},
+      "traits": [
+        "CUSTOM_GOLD"
+      ],
+      "vendor_interface": "ipmitool",
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656",
+          "rel": "bookmark"
+        }
+      ],
+      "conductor": "agent-integrations-openstack-ironic",
+      "allocation_uuid": null,
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports",
+          "rel": "bookmark"
+        }
+      ],
+      "states": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/states",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/states",
+          "rel": "bookmark"
+        }
+      ],
+      "portgroups": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/portgroups",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/portgroups",
+          "rel": "bookmark"
+        }
+      ],
+      "volume": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/volume",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/volume",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "20512deb-e493-4796-a046-5d6e4e072c95",
+      "created_at": "2023-04-06T16:55:34+00:00",
+      "updated_at": "2023-04-06T16:57:38+00:00",
+      "automated_clean": null,
+      "bios_interface": "fake",
+      "boot_interface": "fake",
+      "boot_mode": null,
+      "clean_step": {},
+      "conductor_group": "",
+      "console_enabled": false,
+      "console_interface": "fake",
+      "deploy_interface": "direct",
+      "deploy_step": {},
+      "description": null,
+      "driver": "fake-hardware",
+      "driver_info": {},
+      "driver_internal_info": {
+        "last_power_state_change": "2023-04-06T16:55:42.474124"
+      },
+      "extra": {},
+      "fault": null,
+      "inspection_finished_at": null,
+      "inspection_started_at": null,
+      "inspect_interface": "fake",
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": null,
+      "lessee": null,
+      "maintenance": false,
+      "maintenance_reason": null,
+      "management_interface": "fake",
+      "name": "test",
+      "network_data": {},
+      "network_interface": "flat",
+      "owner": "01b21103a92d4997ab09e46ff8346bd5",
+      "power_interface": "fake",
+      "power_state": "power on",
+      "properties": {},
+      "protected": false,
+      "protected_reason": null,
+      "provision_state": "active",
+      "provision_updated_at": "2023-04-06T16:56:21+00:00",
+      "raid_config": {},
+      "raid_interface": "fake",
+      "rescue_interface": "fake",
+      "reservation": null,
+      "resource_class": null,
+      "retired": false,
+      "retired_reason": null,
+      "secure_boot": null,
+      "storage_interface": "noop",
+      "target_power_state": null,
+      "target_provision_state": null,
+      "target_raid_config": {},
+      "traits": [],
+      "vendor_interface": "fake",
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95",
+          "rel": "bookmark"
+        }
+      ],
+      "conductor": "agent-integrations-openstack-ironic",
+      "allocation_uuid": null,
+      "chassis_uuid": null,
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports",
+          "rel": "bookmark"
+        }
+      ],
+      "states": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/states",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/states",
+          "rel": "bookmark"
+        }
+      ],
+      "portgroups": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/portgroups",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/portgroups",
+          "rel": "bookmark"
+        }
+      ],
+      "volume": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/volume",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/volume",
+          "rel": "bookmark"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/response.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/response.json
new file mode 100644
index 0000000000000..919c14c90ffbb
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/response.json
@@ -0,0 +1,208 @@
+{
+  "nodes": [
+    {
+      "uuid": "9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+      "created_at": "2023-04-06T15:26:48+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "console_enabled": false,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6230
+      },
+      "extra": {},
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "provision_state": "active",
+      "provision_updated_at": "2023-04-06T16:58:16+00:00",
+      "reservation": null,
+      "target_power_state": null,
+      "target_provision_state": null,
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+          "rel": "bookmark"
+        }
+      ],
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+      "created_at": "2023-04-06T15:27:05+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "console_enabled": false,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6231
+      },
+      "extra": {},
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "provision_state": null,
+      "provision_updated_at": "2023-04-06T15:33:46+00:00",
+      "reservation": null,
+      "target_power_state": null,
+      "target_provision_state": null,
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+          "rel": "bookmark"
+        }
+      ],
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "54855e59-83ca-46f8-a78f-55d3370e0656",
+      "created_at": "2023-04-06T15:27:22+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "console_enabled": false,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6232
+      },
+      "extra": {},
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "provision_state": null,
+      "provision_updated_at": "2023-04-06T15:33:44+00:00",
+      "reservation": null,
+      "target_power_state": null,
+      "target_provision_state": null,
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656",
+          "rel": "bookmark"
+        }
+      ],
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "20512deb-e493-4796-a046-5d6e4e072c95",
+      "created_at": "2023-04-06T16:55:34+00:00",
+      "updated_at": "2023-04-06T16:57:38+00:00",
+      "console_enabled": false,
+      "driver": "fake-hardware",
+      "driver_info": {},
+      "extra": {},
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": null,
+      "maintenance": false,
+      "maintenance_reason": null,
+      "power_state": "power on",
+      "properties": {},
+      "provision_state": "active",
+      "provision_updated_at": "2023-04-06T16:56:21+00:00",
+      "reservation": null,
+      "target_power_state": null,
+      "target_provision_state": null,
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95",
+          "rel": "bookmark"
+        }
+      ],
+      "chassis_uuid": null,
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports",
+          "rel": "bookmark"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/response-1.80.json
new file mode 100644
index 0000000000000..aaefca8954218
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/response-1.80.json
@@ -0,0 +1,535 @@
+{
+  "nodes": [
+    {
+      "uuid": "9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+      "created_at": "2023-04-06T15:26:48+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "automated_clean": null,
+      "bios_interface": "no-bios",
+      "boot_interface": "ipxe",
+      "boot_mode": null,
+      "clean_step": {},
+      "conductor_group": "",
+      "console_enabled": false,
+      "console_interface": "no-console",
+      "deploy_interface": "direct",
+      "deploy_step": {},
+      "description": null,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6230
+      },
+      "driver_internal_info": {
+        "clean_steps": null,
+        "agent_erase_devices_iterations": 1,
+        "agent_erase_devices_zeroize": true,
+        "agent_continue_if_secure_erase_failed": false,
+        "agent_continue_if_ata_erase_failed": false,
+        "agent_enable_nvme_secure_erase": true,
+        "agent_enable_ata_secure_erase": true,
+        "disk_erasure_concurrency": 4,
+        "agent_erase_skip_read_only": false,
+        "last_power_state_change": "2023-04-06T16:52:27.251280",
+        "agent_version": "9.5.0.dev4",
+        "agent_last_heartbeat": "2023-04-06T15:32:50.985822",
+        "hardware_manager_version": {
+          "generic_hardware_manager": "1.1"
+        },
+        "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:43.388480"
+      },
+      "extra": {},
+      "fault": "power failure",
+      "inspection_finished_at": null,
+      "inspection_started_at": null,
+      "inspect_interface": "no-inspect",
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "lessee": null,
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "management_interface": "ipmitool",
+      "name": "node-0",
+      "network_data": {},
+      "network_interface": "flat",
+      "owner": "01b21103a92d4997ab09e46ff8346bd5",
+      "power_interface": "ipmitool",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "protected": false,
+      "protected_reason": null,
+      "provision_state": "active",
+      "provision_updated_at": "2023-04-06T16:58:16+00:00",
+      "raid_config": {},
+      "raid_interface": "no-raid",
+      "rescue_interface": "no-rescue",
+      "reservation": null,
+      "resource_class": "baremetal",
+      "retired": false,
+      "retired_reason": null,
+      "secure_boot": null,
+      "storage_interface": "noop",
+      "target_power_state": null,
+      "target_provision_state": null,
+      "target_raid_config": {},
+      "traits": [
+        "CUSTOM_GOLD"
+      ],
+      "vendor_interface": "ipmitool",
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+          "rel": "bookmark"
+        }
+      ],
+      "conductor": "agent-integrations-openstack-ironic",
+      "allocation_uuid": null,
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports",
+          "rel": "bookmark"
+        }
+      ],
+      "states": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/states",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/states",
+          "rel": "bookmark"
+        }
+      ],
+      "portgroups": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/portgroups",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/portgroups",
+          "rel": "bookmark"
+        }
+      ],
+      "volume": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/volume",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/volume",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+      "created_at": "2023-04-06T15:27:05+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "automated_clean": null,
+      "bios_interface": "no-bios",
+      "boot_interface": "ipxe",
+      "boot_mode": null,
+      "clean_step": {},
+      "conductor_group": "",
+      "console_enabled": false,
+      "console_interface": "no-console",
+      "deploy_interface": "direct",
+      "deploy_step": {},
+      "description": null,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6231
+      },
+      "driver_internal_info": {
+        "clean_steps": null,
+        "agent_erase_devices_iterations": 1,
+        "agent_erase_devices_zeroize": true,
+        "agent_continue_if_secure_erase_failed": false,
+        "agent_continue_if_ata_erase_failed": false,
+        "agent_enable_nvme_secure_erase": true,
+        "agent_enable_ata_secure_erase": true,
+        "disk_erasure_concurrency": 4,
+        "agent_erase_skip_read_only": false,
+        "last_power_state_change": "2023-04-06T16:54:04.258902",
+        "agent_version": "9.5.0.dev4",
+        "agent_last_heartbeat": "2023-04-06T15:32:56.433647",
+        "hardware_manager_version": {
+          "generic_hardware_manager": "1.1"
+        },
+        "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:49.508661"
+      },
+      "extra": {},
+      "fault": "power failure",
+      "inspection_finished_at": null,
+      "inspection_started_at": null,
+      "inspect_interface": "no-inspect",
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "lessee": null,
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "management_interface": "ipmitool",
+      "name": "node-1",
+      "network_data": {},
+      "network_interface": "flat",
+      "owner": "01b21103a92d4997ab09e46ff8346bd5",
+      "power_interface": "ipmitool",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "protected": false,
+      "protected_reason": null,
+      "provision_state": "available",
+      "provision_updated_at": "2023-04-06T15:33:46+00:00",
+      "raid_config": {},
+      "raid_interface": "no-raid",
+      "rescue_interface": "no-rescue",
+      "reservation": null,
+      "resource_class": "baremetal",
+      "retired": false,
+      "retired_reason": null,
+      "secure_boot": null,
+      "storage_interface": "noop",
+      "target_power_state": null,
+      "target_provision_state": null,
+      "target_raid_config": {},
+      "traits": [
+        "CUSTOM_GOLD"
+      ],
+      "vendor_interface": "ipmitool",
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+          "rel": "bookmark"
+        }
+      ],
+      "conductor": "agent-integrations-openstack-ironic",
+      "allocation_uuid": null,
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports",
+          "rel": "bookmark"
+        }
+      ],
+      "states": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/states",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/states",
+          "rel": "bookmark"
+        }
+      ],
+      "portgroups": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/portgroups",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/portgroups",
+          "rel": "bookmark"
+        }
+      ],
+      "volume": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/volume",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/volume",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "54855e59-83ca-46f8-a78f-55d3370e0656",
+      "created_at": "2023-04-06T15:27:22+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "automated_clean": null,
+      "bios_interface": "no-bios",
+      "boot_interface": "ipxe",
+      "boot_mode": null,
+      "clean_step": {},
+      "conductor_group": "",
+      "console_enabled": false,
+      "console_interface": "no-console",
+      "deploy_interface": "direct",
+      "deploy_step": {},
+      "description": null,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6232
+      },
+      "driver_internal_info": {
+        "clean_steps": null,
+        "agent_erase_devices_iterations": 1,
+        "agent_erase_devices_zeroize": true,
+        "agent_continue_if_secure_erase_failed": false,
+        "agent_continue_if_ata_erase_failed": false,
+        "agent_enable_nvme_secure_erase": true,
+        "agent_enable_ata_secure_erase": true,
+        "disk_erasure_concurrency": 4,
+        "agent_erase_skip_read_only": false,
+        "last_power_state_change": "2023-04-06T16:54:09.291881",
+        "agent_version": "9.5.0.dev4",
+        "agent_last_heartbeat": "2023-04-06T15:32:56.628016",
+        "hardware_manager_version": {
+          "generic_hardware_manager": "1.1"
+        },
+        "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:49.857774"
+      },
+      "extra": {},
+      "fault": "power failure",
+      "inspection_finished_at": null,
+      "inspection_started_at": null,
+      "inspect_interface": "no-inspect",
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "lessee": null,
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "management_interface": "ipmitool",
+      "name": "node-2",
+      "network_data": {},
+      "network_interface": "flat",
+      "owner": "01b21103a92d4997ab09e46ff8346bd5",
+      "power_interface": "ipmitool",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "protected": false,
+      "protected_reason": null,
+      "provision_state": "available",
+      "provision_updated_at": "2023-04-06T15:33:44+00:00",
+      "raid_config": {},
+      "raid_interface": "no-raid",
+      "rescue_interface": "no-rescue",
+      "reservation": null,
+      "resource_class": "baremetal",
+      "retired": false,
+      "retired_reason": null,
+      "secure_boot": null,
+      "storage_interface": "noop",
+      "target_power_state": null,
+      "target_provision_state": null,
+      "target_raid_config": {},
+      "traits": [
+        "CUSTOM_GOLD"
+      ],
+      "vendor_interface": "ipmitool",
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656",
+          "rel": "bookmark"
+        }
+      ],
+      "conductor": "agent-integrations-openstack-ironic",
+      "allocation_uuid": null,
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports",
+          "rel": "bookmark"
+        }
+      ],
+      "states": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/states",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/states",
+          "rel": "bookmark"
+        }
+      ],
+      "portgroups": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/portgroups",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/portgroups",
+          "rel": "bookmark"
+        }
+      ],
+      "volume": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/volume",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/volume",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "20512deb-e493-4796-a046-5d6e4e072c95",
+      "created_at": "2023-04-06T16:55:34+00:00",
+      "updated_at": "2023-04-06T16:57:38+00:00",
+      "automated_clean": null,
+      "bios_interface": "fake",
+      "boot_interface": "fake",
+      "boot_mode": null,
+      "clean_step": {},
+      "conductor_group": "",
+      "console_enabled": false,
+      "console_interface": "fake",
+      "deploy_interface": "direct",
+      "deploy_step": {},
+      "description": null,
+      "driver": "fake-hardware",
+      "driver_info": {},
+      "driver_internal_info": {
+        "last_power_state_change": "2023-04-06T16:55:42.474124"
+      },
+      "extra": {},
+      "fault": null,
+      "inspection_finished_at": null,
+      "inspection_started_at": null,
+      "inspect_interface": "fake",
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": null,
+      "lessee": null,
+      "maintenance": false,
+      "maintenance_reason": null,
+      "management_interface": "fake",
+      "name": "test",
+      "network_data": {},
+      "network_interface": "flat",
+      "owner": "01b21103a92d4997ab09e46ff8346bd5",
+      "power_interface": "fake",
+      "power_state": "power on",
+      "properties": {},
+      "protected": false,
+      "protected_reason": null,
+      "provision_state": "active",
+      "provision_updated_at": "2023-04-06T16:56:21+00:00",
+      "raid_config": {},
+      "raid_interface": "fake",
+      "rescue_interface": "fake",
+      "reservation": null,
+      "resource_class": null,
+      "retired": false,
+      "retired_reason": null,
+      "secure_boot": null,
+      "storage_interface": "noop",
+      "target_power_state": null,
+      "target_provision_state": null,
+      "target_raid_config": {},
+      "traits": [],
+      "vendor_interface": "fake",
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95",
+          "rel": "bookmark"
+        }
+      ],
+      "conductor": "agent-integrations-openstack-ironic",
+      "allocation_uuid": null,
+      "chassis_uuid": null,
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports",
+          "rel": "bookmark"
+        }
+      ],
+      "states": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/states",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/states",
+          "rel": "bookmark"
+        }
+      ],
+      "portgroups": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/portgroups",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/portgroups",
+          "rel": "bookmark"
+        }
+      ],
+      "volume": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/volume",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/volume",
+          "rel": "bookmark"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/response.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/response.json
new file mode 100644
index 0000000000000..919c14c90ffbb
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/response.json
@@ -0,0 +1,208 @@
+{
+  "nodes": [
+    {
+      "uuid": "9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+      "created_at": "2023-04-06T15:26:48+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "console_enabled": false,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6230
+      },
+      "extra": {},
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "provision_state": "active",
+      "provision_updated_at": "2023-04-06T16:58:16+00:00",
+      "reservation": null,
+      "target_power_state": null,
+      "target_provision_state": null,
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0",
+          "rel": "bookmark"
+        }
+      ],
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+      "created_at": "2023-04-06T15:27:05+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "console_enabled": false,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6231
+      },
+      "extra": {},
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "provision_state": null,
+      "provision_updated_at": "2023-04-06T15:33:46+00:00",
+      "reservation": null,
+      "target_power_state": null,
+      "target_provision_state": null,
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e",
+          "rel": "bookmark"
+        }
+      ],
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "54855e59-83ca-46f8-a78f-55d3370e0656",
+      "created_at": "2023-04-06T15:27:22+00:00",
+      "updated_at": "2023-04-11T19:10:40+00:00",
+      "console_enabled": false,
+      "driver": "ipmi",
+      "driver_info": {
+        "ipmi_address": "10.164.0.32",
+        "ipmi_username": "admin",
+        "ipmi_password": "******",
+        "ipmi_port": 6232
+      },
+      "extra": {},
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "maintenance": true,
+      "maintenance_reason": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.",
+      "power_state": null,
+      "properties": {
+        "cpu_arch": "x86_64",
+        "capabilities": "boot_mode:uefi",
+        "vendor": "unknown",
+        "root_device": {
+          "vendor": "0x1af4"
+        }
+      },
+      "provision_state": null,
+      "provision_updated_at": "2023-04-06T15:33:44+00:00",
+      "reservation": null,
+      "target_power_state": null,
+      "target_provision_state": null,
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656",
+          "rel": "bookmark"
+        }
+      ],
+      "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504",
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports",
+          "rel": "bookmark"
+        }
+      ]
+    },
+    {
+      "uuid": "20512deb-e493-4796-a046-5d6e4e072c95",
+      "created_at": "2023-04-06T16:55:34+00:00",
+      "updated_at": "2023-04-06T16:57:38+00:00",
+      "console_enabled": false,
+      "driver": "fake-hardware",
+      "driver_info": {},
+      "extra": {},
+      "instance_info": {},
+      "instance_uuid": null,
+      "last_error": null,
+      "maintenance": false,
+      "maintenance_reason": null,
+      "power_state": "power on",
+      "properties": {},
+      "provision_state": "active",
+      "provision_updated_at": "2023-04-06T16:56:21+00:00",
+      "reservation": null,
+      "target_power_state": null,
+      "target_provision_state": null,
+      "links": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95",
+          "rel": "bookmark"
+        }
+      ],
+      "chassis_uuid": null,
+      "ports": [
+        {
+          "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports",
+          "rel": "self"
+        },
+        {
+          "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports",
+          "rel": "bookmark"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/1/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/1/GET.json
new file mode 100644
index 0000000000000..8b0b750fda465
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/1/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "1",
+    "name": "m1.tiny",
+    "ram": 512,
+    "disk": 1,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 1,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/1"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/1"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/2/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/2/GET.json
new file mode 100644
index 0000000000000..f1154ebee5737
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/2/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "2",
+    "name": "m1.small",
+    "ram": 2048,
+    "disk": 20,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 1,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/2"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/2"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/3/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/3/GET.json
new file mode 100644
index 0000000000000..6c42b12acdccc
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/3/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "3",
+    "name": "m1.medium",
+    "ram": 4096,
+    "disk": 40,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 2,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/3"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/3"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/4/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/4/GET.json
new file mode 100644
index 0000000000000..c3df84f7b4fd5
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/4/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "4",
+    "name": "m1.large",
+    "ram": 8192,
+    "disk": 80,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 4,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/4"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/4"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/42/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/42/GET.json
new file mode 100644
index 0000000000000..679b4132c9127
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/42/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "42",
+    "name": "m1.nano",
+    "ram": 128,
+    "disk": 1,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 1,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/42"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/42"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/5/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/5/GET.json
new file mode 100644
index 0000000000000..79d3ffebb3d5a
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/5/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "5",
+    "name": "m1.xlarge",
+    "ram": 16384,
+    "disk": 160,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 8,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/5"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/5"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/84/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/84/GET.json
new file mode 100644
index 0000000000000..bbdb078aeb1f7
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/84/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "84",
+    "name": "m1.micro",
+    "ram": 192,
+    "disk": 1,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 1,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/84"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/84"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/c1/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/c1/response.json
new file mode 100644
index 0000000000000..75743a363f879
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/c1/response.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "c1",
+    "name": "cirros256",
+    "ram": 256,
+    "disk": 1,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 1,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/c1"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/c1"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d1/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d1/GET.json
new file mode 100644
index 0000000000000..f30676d66e085
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d1/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "d1",
+    "name": "ds512M",
+    "ram": 512,
+    "disk": 5,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 1,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/d1"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/d1"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d2/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d2/GET.json
new file mode 100644
index 0000000000000..6cf51229bcf29
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d2/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "d2",
+    "name": "ds1G",
+    "ram": 1024,
+    "disk": 10,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 1,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/d2"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/d2"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d3/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d3/GET.json
new file mode 100644
index 0000000000000..51b62aef721ca
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d3/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "d3",
+    "name": "ds2G",
+    "ram": 2048,
+    "disk": 10,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 2,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/d3"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/d3"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d4/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d4/GET.json
new file mode 100644
index 0000000000000..a9f7c526666a6
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/d4/GET.json
@@ -0,0 +1,24 @@
+{
+  "flavor": {
+    "id": "d4",
+    "name": "ds4G",
+    "ram": 4096,
+    "disk": 20,
+    "swap": "",
+    "OS-FLV-EXT-DATA:ephemeral": 0,
+    "OS-FLV-DISABLED:disabled": false,
+    "vcpus": 4,
+    "os-flavor-access:is_public": true,
+    "rxtx_factor": 1,
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/flavors/d4"
+      },
+      {
+        "rel": "bookmark",
+        "href": "http://34.91.114.145/compute/flavors/d4"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/detail/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/detail/response-2.93.json
new file mode 100644
index 0000000000000..68e46e7514a12
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/detail/response-2.93.json
@@ -0,0 +1,317 @@
+{
+    "flavors": [
+      {
+        "id": "1",
+        "name": "m1.tiny",
+        "ram": 512,
+        "disk": 1,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 1,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/1"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/1"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "2",
+        "name": "m1.small",
+        "ram": 2048,
+        "disk": 20,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 1,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/2"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/2"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "3",
+        "name": "m1.medium",
+        "ram": 4096,
+        "disk": 40,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 2,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/3"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/3"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "4",
+        "name": "m1.large",
+        "ram": 8192,
+        "disk": 80,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 4,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/4"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/4"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "42",
+        "name": "m1.nano",
+        "ram": 128,
+        "disk": 1,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 1,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/42"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/42"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "5",
+        "name": "m1.xlarge",
+        "ram": 16384,
+        "disk": 160,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 8,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/5"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/5"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "84",
+        "name": "m1.micro",
+        "ram": 192,
+        "disk": 1,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 1,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/84"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/84"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "c1",
+        "name": "cirros256",
+        "ram": 256,
+        "disk": 1,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 1,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/c1"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/c1"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "d1",
+        "name": "ds512M",
+        "ram": 512,
+        "disk": 5,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 1,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/d1"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/d1"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "d2",
+        "name": "ds1G",
+        "ram": 1024,
+        "disk": 10,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 1,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/d2"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/d2"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "d3",
+        "name": "ds2G",
+        "ram": 2048,
+        "disk": 10,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 2,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/d3"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/d3"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      {
+        "id": "d4",
+        "name": "ds4G",
+        "ram": 4096,
+        "disk": 20,
+        "swap": 0,
+        "OS-FLV-EXT-DATA:ephemeral": 0,
+        "OS-FLV-DISABLED:disabled": false,
+        "vcpus": 4,
+        "os-flavor-access:is_public": true,
+        "rxtx_factor": 1,
+        "links": [
+          {
+            "rel": "self",
+            "href": "http://34.91.114.145/compute/v2.1/flavors/d4"
+          },
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/flavors/d4"
+          }
+        ],
+        "description": null,
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      }
+    ]
+  }
+  
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/detail/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/detail/response.json
new file mode 100644
index 0000000000000..da4809d1ee447
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/flavors/detail/response.json
@@ -0,0 +1,268 @@
+{
+  "flavors": [
+    {
+      "id": "1",
+      "name": "m1.tiny",
+      "ram": 512,
+      "disk": 1,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 1,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/1"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/1"
+        }
+      ]
+    },
+    {
+      "id": "2",
+      "name": "m1.small",
+      "ram": 2048,
+      "disk": 20,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 1,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/2"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/2"
+        }
+      ]
+    },
+    {
+      "id": "3",
+      "name": "m1.medium",
+      "ram": 4096,
+      "disk": 40,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 2,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/3"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/3"
+        }
+      ]
+    },
+    {
+      "id": "4",
+      "name": "m1.large",
+      "ram": 8192,
+      "disk": 80,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 4,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/4"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/4"
+        }
+      ]
+    },
+    {
+      "id": "42",
+      "name": "m1.nano",
+      "ram": 128,
+      "disk": 1,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 1,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/42"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/42"
+        }
+      ]
+    },
+    {
+      "id": "5",
+      "name": "m1.xlarge",
+      "ram": 16384,
+      "disk": 160,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 8,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/5"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/5"
+        }
+      ]
+    },
+    {
+      "id": "84",
+      "name": "m1.micro",
+      "ram": 192,
+      "disk": 1,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 1,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/84"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/84"
+        }
+      ]
+    },
+    {
+      "id": "c1",
+      "name": "cirros256",
+      "ram": 256,
+      "disk": 1,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 1,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/c1"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/c1"
+        }
+      ]
+    },
+    {
+      "id": "d1",
+      "name": "ds512M",
+      "ram": 512,
+      "disk": 5,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 1,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/d1"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/d1"
+        }
+      ]
+    },
+    {
+      "id": "d2",
+      "name": "ds1G",
+      "ram": 1024,
+      "disk": 10,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 1,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/d2"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/d2"
+        }
+      ]
+    },
+    {
+      "id": "d3",
+      "name": "ds2G",
+      "ram": 2048,
+      "disk": 10,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 2,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/d3"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/d3"
+        }
+      ]
+    },
+    {
+      "id": "d4",
+      "name": "ds4G",
+      "ram": 4096,
+      "disk": 20,
+      "swap": "",
+      "OS-FLV-EXT-DATA:ephemeral": 0,
+      "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 4,
+      "os-flavor-access:is_public": true,
+      "rxtx_factor": 1,
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/flavors/d4"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/flavors/d4"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=1e6e233e637d4d55a50a62b63398ad15/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=1e6e233e637d4d55a50a62b63398ad15/response-2.93.json
new file mode 100644
index 0000000000000..cbee1bc874e49
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=1e6e233e637d4d55a50a62b63398ad15/response-2.93.json
@@ -0,0 +1,19 @@
+{
+    "limits": {
+      "rate": [],
+      "absolute": {
+        "maxTotalInstances": 10,
+        "maxTotalCores": 20,
+        "maxTotalRAMSize": 51200,
+        "maxServerMeta": 128,
+        "maxTotalKeypairs": 100,
+        "maxServerGroups": 10,
+        "maxServerGroupMembers": 10,
+        "totalRAMUsed": 2048,
+        "totalCoresUsed": 8,
+        "totalInstancesUsed": 8,
+        "totalServerGroupsUsed": 0
+      }
+    }
+  }
+  
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..bca1b6ddc9fba
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,26 @@
+{
+  "limits": {
+    "rate": [],
+    "absolute": {
+      "maxTotalInstances": 10,
+      "maxTotalCores": 20,
+      "maxTotalRAMSize": 51200,
+      "maxServerMeta": 128,
+      "maxImageMeta": 128,
+      "maxPersonality": 5,
+      "maxPersonalitySize": 10240,
+      "maxTotalKeypairs": 100,
+      "maxServerGroups": 10,
+      "maxServerGroupMembers": 10,
+      "maxTotalFloatingIps": -1,
+      "maxSecurityGroups": -1,
+      "maxSecurityGroupRules": -1,
+      "totalRAMUsed": 2048,
+      "totalCoresUsed": 8,
+      "totalInstancesUsed": 8,
+      "totalFloatingIpsUsed": 0,
+      "totalSecurityGroupsUsed": 0,
+      "totalServerGroupsUsed": 0
+    }
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=6e39099cccde4f809b003d9e0dd09304/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=6e39099cccde4f809b003d9e0dd09304/response-2.93.json
new file mode 100644
index 0000000000000..cbee1bc874e49
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=6e39099cccde4f809b003d9e0dd09304/response-2.93.json
@@ -0,0 +1,19 @@
+{
+    "limits": {
+      "rate": [],
+      "absolute": {
+        "maxTotalInstances": 10,
+        "maxTotalCores": 20,
+        "maxTotalRAMSize": 51200,
+        "maxServerMeta": 128,
+        "maxTotalKeypairs": 100,
+        "maxServerGroups": 10,
+        "maxServerGroupMembers": 10,
+        "totalRAMUsed": 2048,
+        "totalCoresUsed": 8,
+        "totalInstancesUsed": 8,
+        "totalServerGroupsUsed": 0
+      }
+    }
+  }
+  
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..bca1b6ddc9fba
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/limits/tenant_id=6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,26 @@
+{
+  "limits": {
+    "rate": [],
+    "absolute": {
+      "maxTotalInstances": 10,
+      "maxTotalCores": 20,
+      "maxTotalRAMSize": 51200,
+      "maxServerMeta": 128,
+      "maxImageMeta": 128,
+      "maxPersonality": 5,
+      "maxPersonalitySize": 10240,
+      "maxTotalKeypairs": 100,
+      "maxServerGroups": 10,
+      "maxServerGroupMembers": 10,
+      "maxTotalFloatingIps": -1,
+      "maxSecurityGroups": -1,
+      "maxSecurityGroupRules": -1,
+      "totalRAMUsed": 2048,
+      "totalCoresUsed": 8,
+      "totalInstancesUsed": 8,
+      "totalFloatingIpsUsed": 0,
+      "totalSecurityGroupsUsed": 0,
+      "totalServerGroupsUsed": 0
+    }
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-aggregates/GET.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-aggregates/GET.json
new file mode 100644
index 0000000000000..3c745169ecdc6
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-aggregates/GET.json
@@ -0,0 +1,19 @@
+{
+  "aggregates": [
+    {
+      "id": 3,
+      "name": "my-aggregate",
+      "hosts": [
+        "agent-integrations-openstack-default"
+      ],
+      "metadata": {
+        "availability_zone": "availability-zone"
+      },
+      "created_at": "2023-03-21T13:39:06.000000",
+      "updated_at": null,
+      "deleted_at": null,
+      "deleted": false,
+      "availability_zone": "availability-zone"
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-aggregates/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-aggregates/response.json
new file mode 100644
index 0000000000000..85340a8384a04
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-aggregates/response.json
@@ -0,0 +1,34 @@
+{
+  "aggregates": [
+    {
+      "id": 1,
+      "name": "primary-aggregate",
+      "hosts": [
+        "agent-integrations-openstack-default"
+      ],
+      "metadata": {
+        "availability_zone": "availability-zone"
+      },
+      "created_at": "2023-03-21T13:39:06.000000",
+      "updated_at": null,
+      "deleted_at": null,
+      "deleted": false,
+      "availability_zone": "availability-zone"
+    },
+    {
+      "id": 2,
+      "name": "secondary-aggregate",
+      "hosts": [
+        "agent-integrations-openstack-default"
+      ],
+      "metadata": {
+        "availability_zone": "availability-zone"
+      },
+      "created_at": "2023-03-21T13:39:06.000000",
+      "updated_at": null,
+      "deleted_at": null,
+      "deleted": false,
+      "availability_zone": "availability-zone"
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-hypervisors/1/uptime/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-hypervisors/1/uptime/response.json
new file mode 100644
index 0000000000000..2bfffedd2ac4f
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-hypervisors/1/uptime/response.json
@@ -0,0 +1,9 @@
+{
+  "hypervisor": {
+    "id": 1,
+    "hypervisor_hostname": "agent-integrations-openstack-default",
+    "state": "up",
+    "status": "enabled",
+    "uptime": " 12:18:37 up 36 days, 6 min,  0 users,  load average: 0.29, 0.36, 0.35\n"
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-hypervisors/detail/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-hypervisors/detail/response-2.93.json
new file mode 100644
index 0000000000000..851bb835b388c
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-hypervisors/detail/response-2.93.json
@@ -0,0 +1,19 @@
+{
+  "hypervisors": [
+    {
+      "id": "d884b51a-e464-49dc-916c-766da0237661",
+      "hypervisor_hostname": "agent-integrations-openstack-default",
+      "state": "up",
+      "status": "enabled",
+      "hypervisor_type": "QEMU",
+      "hypervisor_version": 4002001,
+      "host_ip": "10.164.0.11",
+      "service": {
+        "id": "7bf08d7e-a939-46c3-bdae-fbe3ebfe78a4",
+        "host": "agent-integrations-openstack-default",
+        "disabled_reason": null
+      },
+      "uptime": " 12:18:59 up 36 days, 7 min,  0 users,  load average: 0.28, 0.35, 0.35\n"
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-hypervisors/detail/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-hypervisors/detail/response.json
new file mode 100644
index 0000000000000..1cd84f9602aa8
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-hypervisors/detail/response.json
@@ -0,0 +1,30 @@
+{
+  "hypervisors": [
+    {
+      "id": 1,
+      "hypervisor_hostname": "agent-integrations-openstack-default",
+      "state": "up",
+      "status": "enabled",
+      "hypervisor_type": "QEMU",
+      "hypervisor_version": 4002001,
+      "host_ip": "10.164.0.11",
+      "service": {
+        "id": 3,
+        "host": "agent-integrations-openstack-default",
+        "disabled_reason": null
+      },
+      "vcpus": 4,
+      "memory_mb": 14990,
+      "local_gb": 96,
+      "vcpus_used": 12,
+      "memory_mb_used": 3584,
+      "local_gb_used": 0,
+      "free_ram_mb": 11406,
+      "free_disk_gb": 96,
+      "current_workload": 0,
+      "running_vms": 12,
+      "disk_available_least": 59,
+      "cpu_info": "{\"arch\": \"x86_64\", \"model\": \"Westmere-IBRS\", \"vendor\": \"Intel\", \"topology\": {\"cells\": 1, \"sockets\": 1, \"cores\": 2, \"threads\": 2}, \"features\": [\"xsavec\", \"ht\", \"syscall\", \"sse\", \"smep\", \"clwb\", \"ssse3\", \"fsgsbase\", \"sse4.1\", \"fpu\", \"cx16\", \"avx512cd\", \"hle\", \"xsaves\", \"smap\", \"pse\", \"msr\", \"spec-ctrl\", \"pat\", \"cmov\", \"xgetbv1\", \"mmx\", \"invtsc\", \"sse2\", \"tsc_adjust\", \"bmi2\", \"f16c\", \"pge\", \"avx512vl\", \"clflush\", \"ssbd\", \"fma\", \"sse4.2\", \"pni\", \"pdpe1gb\", \"apic\", \"avx2\", \"avx512bw\", \"mpx\", \"ss\", \"mtrr\", \"rdrand\", \"rdtscp\", \"lahf_lm\", \"xsave\", \"rtm\", \"rdseed\", \"de\", \"pse36\", \"arat\", \"abm\", \"pcid\", \"cx8\", \"nx\", \"xsaveopt\", \"erms\", \"movbe\", \"invpcid\", \"avx\", \"lm\", \"sep\", \"pae\", \"adx\", \"arch-capabilities\", \"bmi1\", \"x2apic\", \"aes\", \"mca\", \"clflushopt\", \"pclmuldq\", \"fxsr\", \"tsc\", \"stibp\", \"3dnowprefetch\", \"avx512dq\", \"vme\", \"mce\", \"hypervisor\", \"md-clear\", \"avx512f\", \"popcnt\"]}"
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/1e6e233e637d4d55a50a62b63398ad15/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/1e6e233e637d4d55a50a62b63398ad15/response-2.93.json
new file mode 100644
index 0000000000000..8d95a55ea93c4
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/1e6e233e637d4d55a50a62b63398ad15/response-2.93.json
@@ -0,0 +1,12 @@
+{
+  "quota_set": {
+    "id": "1e6e233e637d4d55a50a62b63398ad15",
+    "cores": 20,
+    "instances": 10,
+    "key_pairs": 100,
+    "metadata_items": 128,
+    "ram": 51200,
+    "server_group_members": 10,
+    "server_groups": 10
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..fc033235240ec
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,19 @@
+{
+  "quota_set": {
+    "id": "1e6e233e637d4d55a50a62b63398ad15",
+    "cores": 20,
+    "fixed_ips": -1,
+    "floating_ips": -1,
+    "injected_file_content_bytes": 10240,
+    "injected_file_path_bytes": 255,
+    "injected_files": 5,
+    "instances": 10,
+    "key_pairs": 100,
+    "metadata_items": 128,
+    "ram": 51200,
+    "security_group_rules": -1,
+    "security_groups": -1,
+    "server_group_members": 10,
+    "server_groups": 10
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/6e39099cccde4f809b003d9e0dd09304/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/6e39099cccde4f809b003d9e0dd09304/response-2.93.json
new file mode 100644
index 0000000000000..6e169097439cb
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/6e39099cccde4f809b003d9e0dd09304/response-2.93.json
@@ -0,0 +1,12 @@
+{
+  "quota_set": {
+    "id": "6e39099cccde4f809b003d9e0dd09304",
+    "cores": 20,
+    "instances": 5,
+    "key_pairs": 100,
+    "metadata_items": 128,
+    "ram": 51200,
+    "server_group_members": 10,
+    "server_groups": 10
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..709e63bb09628
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-quota-sets/6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,19 @@
+{
+  "quota_set": {
+    "id": "6e39099cccde4f809b003d9e0dd09304",
+    "cores": 20,
+    "fixed_ips": -1,
+    "floating_ips": -1,
+    "injected_file_content_bytes": 10240,
+    "injected_file_path_bytes": 255,
+    "injected_files": 5,
+    "instances": 5,
+    "key_pairs": 100,
+    "metadata_items": 128,
+    "ram": 51200,
+    "security_group_rules": -1,
+    "security_groups": -1,
+    "server_group_members": 10,
+    "server_groups": 10
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-services/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-services/response-2.93.json
new file mode 100644
index 0000000000000..4f28564133c8c
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-services/response-2.93.json
@@ -0,0 +1,48 @@
+{
+  "services": [
+    {
+      "binary": "nova-conductor",
+      "host": "agent-integrations-openstack-default",
+      "id": "aadbda65-f523-419a-b3df-c287d196a2c1",
+      "zone": "internal",
+      "status": "enabled",
+      "state": "up",
+      "updated_at": "2023-04-20T07:16:52.000000",
+      "disabled_reason": null,
+      "forced_down": false
+    },
+    {
+      "binary": "nova-compute",
+      "host": "agent-integrations-openstack-default",
+      "id": "7bf08d7e-a939-46c3-bdae-fbe3ebfe78a4",
+      "zone": "availability-zone",
+      "status": "enabled",
+      "state": "up",
+      "updated_at": "2023-04-20T07:16:52.000000",
+      "disabled_reason": null,
+      "forced_down": false
+    },
+    {
+      "binary": "nova-scheduler",
+      "host": "agent-integrations-openstack-default",
+      "id": "2ec2027d-ac70-4e2b-95ed-fb1756d24996",
+      "zone": "internal",
+      "status": "enabled",
+      "state": "up",
+      "updated_at": "2023-04-20T07:16:52.000000",
+      "disabled_reason": null,
+      "forced_down": false
+    },
+    {
+      "binary": "nova-conductor",
+      "host": "agent-integrations-openstack-default",
+      "id": "df55f706-a60e-4d3d-8cd6-30f5b33d79ce",
+      "zone": "internal",
+      "status": "enabled",
+      "state": "up",
+      "updated_at": "2023-04-20T07:16:52.000000",
+      "disabled_reason": null,
+      "forced_down": false
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/os-services/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-services/response.json
new file mode 100644
index 0000000000000..83fa6c9ba8a04
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/os-services/response.json
@@ -0,0 +1,44 @@
+{
+  "services": [
+    {
+      "binary": "nova-conductor",
+      "host": "agent-integrations-openstack-default",
+      "id": 1,
+      "zone": "internal",
+      "status": "enabled",
+      "state": "up",
+      "updated_at": "2023-04-20T07:16:22.000000",
+      "disabled_reason": null
+    },
+    {
+      "binary": "nova-compute",
+      "host": "agent-integrations-openstack-default",
+      "id": 3,
+      "zone": "availability-zone",
+      "status": "enabled",
+      "state": "up",
+      "updated_at": "2023-04-20T07:16:22.000000",
+      "disabled_reason": null
+    },
+    {
+      "binary": "nova-scheduler",
+      "host": "agent-integrations-openstack-default",
+      "id": 2,
+      "zone": "internal",
+      "status": "enabled",
+      "state": "up",
+      "updated_at": "2023-04-20T07:16:22.000000",
+      "disabled_reason": null
+    },
+    {
+      "binary": "nova-conductor",
+      "host": "agent-integrations-openstack-default",
+      "id": 5,
+      "zone": "internal",
+      "status": "enabled",
+      "state": "up",
+      "updated_at": "2023-04-20T07:16:22.000000",
+      "disabled_reason": null
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/response.json
new file mode 100644
index 0000000000000..6b642ef0d5c24
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/response.json
@@ -0,0 +1,26 @@
+{
+  "version": {
+    "id": "v2.1",
+    "status": "CURRENT",
+    "version": "2.93",
+    "min_version": "2.1",
+    "updated": "2013-07-23T11:33:21Z",
+    "links": [
+      {
+        "rel": "self",
+        "href": "http://34.91.114.145/compute/v2.1/"
+      },
+      {
+        "rel": "describedby",
+        "type": "text/html",
+        "href": "http://docs.openstack.org/"
+      }
+    ],
+    "media-types": [
+      {
+        "base": "application/json",
+        "type": "application/vnd.openstack.compute+json;version=2.1"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/2c653a68-b520-4582-a05d-41a68067d76c/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/2c653a68-b520-4582-a05d-41a68067d76c/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..fd3bcdcd2de89
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/2c653a68-b520-4582-a05d-41a68067d76c/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 3016853,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 43921408,
+      "write_requests": 409,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 18614820000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:fe:84:d5",
+      "rx_octets": 179152,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 3095,
+      "rx_rate": null,
+      "tx_octets": 409609,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 9144,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/2c653a68-b520-4582-a05d-41a68067d76c/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/2c653a68-b520-4582-a05d-41a68067d76c/diagnostics/response.json
new file mode 100644
index 0000000000000..7d4a62f621374
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/2c653a68-b520-4582-a05d-41a68067d76c/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 18614670000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 409,
+  "vda_write": 43921408,
+  "vda_errors": -1,
+  "tapd8b7c889-aa_rx": 179152,
+  "tapd8b7c889-aa_rx_packets": 3095,
+  "tapd8b7c889-aa_rx_errors": 0,
+  "tapd8b7c889-aa_rx_drop": 0,
+  "tapd8b7c889-aa_tx": 409609,
+  "tapd8b7c889-aa_tx_packets": 9144,
+  "tapd8b7c889-aa_tx_errors": 0,
+  "tapd8b7c889-aa_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 62834,
+  "memory-unused": 178396,
+  "memory-available": 231388,
+  "memory-usable": 200496,
+  "memory-last_update": 1682079513,
+  "memory-disk_caches": 19232,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 254248
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/3b27b706-c0ad-4528-a865-7afaf7712130/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/3b27b706-c0ad-4528-a865-7afaf7712130/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..ff6f01be70e94
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/3b27b706-c0ad-4528-a865-7afaf7712130/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 1126974,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 43180032,
+      "write_requests": 495,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 7023440000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:ea:85:7d",
+      "rx_octets": 73698,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 1236,
+      "rx_rate": null,
+      "tx_octets": 379243,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 8731,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/3b27b706-c0ad-4528-a865-7afaf7712130/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/3b27b706-c0ad-4528-a865-7afaf7712130/diagnostics/response.json
new file mode 100644
index 0000000000000..b6d17054d75d3
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/3b27b706-c0ad-4528-a865-7afaf7712130/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 7023280000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 495,
+  "vda_write": 43180032,
+  "vda_errors": -1,
+  "tap4cbe47fa-97_rx": 73698,
+  "tap4cbe47fa-97_rx_packets": 1236,
+  "tap4cbe47fa-97_rx_errors": 0,
+  "tap4cbe47fa-97_rx_drop": 0,
+  "tap4cbe47fa-97_tx": 379243,
+  "tap4cbe47fa-97_tx_packets": 8731,
+  "tap4cbe47fa-97_tx_errors": 0,
+  "tap4cbe47fa-97_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 43336,
+  "memory-unused": 178488,
+  "memory-available": 231388,
+  "memory-usable": 200532,
+  "memory-last_update": 1682079505,
+  "memory-disk_caches": 19164,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 251804
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/4caf78dc-2e5d-40a7-8d56-1c2f7f664283/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/4caf78dc-2e5d-40a7-8d56-1c2f7f664283/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..088de5480465c
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/4caf78dc-2e5d-40a7-8d56-1c2f7f664283/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 1126948,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 43143168,
+      "write_requests": 532,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 7098090000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:4b:3d:11",
+      "rx_octets": 73558,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 1234,
+      "rx_rate": null,
+      "tx_octets": 379244,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 8731,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/4caf78dc-2e5d-40a7-8d56-1c2f7f664283/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/4caf78dc-2e5d-40a7-8d56-1c2f7f664283/diagnostics/response.json
new file mode 100644
index 0000000000000..fab4dc1329cdf
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/4caf78dc-2e5d-40a7-8d56-1c2f7f664283/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 7097930000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 532,
+  "vda_write": 43143168,
+  "vda_errors": -1,
+  "tap5e8a8701-75_rx": 73558,
+  "tap5e8a8701-75_rx_packets": 1234,
+  "tap5e8a8701-75_rx_errors": 0,
+  "tap5e8a8701-75_rx_drop": 0,
+  "tap5e8a8701-75_tx": 379244,
+  "tap5e8a8701-75_tx_packets": 8731,
+  "tap5e8a8701-75_tx_errors": 0,
+  "tap5e8a8701-75_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 43226,
+  "memory-unused": 178488,
+  "memory-available": 231388,
+  "memory-usable": 200528,
+  "memory-last_update": 1682079505,
+  "memory-disk_caches": 19156,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 252032
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/5102fbbf-7156-48dc-8355-af7ab992266f/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/5102fbbf-7156-48dc-8355-af7ab992266f/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..1d7b950cf764e
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/5102fbbf-7156-48dc-8355-af7ab992266f/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 1132424,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 42684416,
+      "write_requests": 302,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 7211680000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:06:5c:6f",
+      "rx_octets": 73838,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 1238,
+      "rx_rate": null,
+      "tx_octets": 380111,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 8752,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/5102fbbf-7156-48dc-8355-af7ab992266f/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/5102fbbf-7156-48dc-8355-af7ab992266f/diagnostics/response.json
new file mode 100644
index 0000000000000..2dbf4ceabb83d
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/5102fbbf-7156-48dc-8355-af7ab992266f/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 7211540000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 302,
+  "vda_write": 42684416,
+  "vda_errors": -1,
+  "tap561263b9-f0_rx": 73838,
+  "tap561263b9-f0_rx_packets": 1238,
+  "tap561263b9-f0_rx_errors": 0,
+  "tap561263b9-f0_rx_drop": 0,
+  "tap561263b9-f0_tx": 380111,
+  "tap561263b9-f0_tx_packets": 8752,
+  "tap561263b9-f0_tx_errors": 0,
+  "tap561263b9-f0_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 43183,
+  "memory-unused": 178516,
+  "memory-available": 231388,
+  "memory-usable": 200500,
+  "memory-last_update": 1682079512,
+  "memory-disk_caches": 19112,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 256004
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..7c0ee4fdf4b4b
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 1126989,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 42962944,
+      "write_requests": 332,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 6866370000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:65:61:fe",
+      "rx_octets": 73628,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 1235,
+      "rx_rate": null,
+      "tx_octets": 379640,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 8737,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955/diagnostics/response.json
new file mode 100644
index 0000000000000..9325b97f114fc
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 6866230000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 332,
+  "vda_write": 42962944,
+  "vda_errors": -1,
+  "tap455c2c46-84_rx": 73628,
+  "tap455c2c46-84_rx_packets": 1235,
+  "tap455c2c46-84_rx_errors": 0,
+  "tap455c2c46-84_rx_drop": 0,
+  "tap455c2c46-84_tx": 379640,
+  "tap455c2c46-84_tx_packets": 8737,
+  "tap455c2c46-84_tx_errors": 0,
+  "tap455c2c46-84_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 43364,
+  "memory-unused": 178520,
+  "memory-available": 231388,
+  "memory-usable": 200540,
+  "memory-last_update": 1682079508,
+  "memory-disk_caches": 19148,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 248144
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/7994720d-62a5-4b48-9158-f941d98db5c1/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/7994720d-62a5-4b48-9158-f941d98db5c1/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..e589352002261
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/7994720d-62a5-4b48-9158-f941d98db5c1/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 1126947,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 43220992,
+      "write_requests": 503,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 7099050000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:c5:ea:99",
+      "rx_octets": 73628,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 1235,
+      "rx_rate": null,
+      "tx_octets": 379244,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 8731,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/7994720d-62a5-4b48-9158-f941d98db5c1/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/7994720d-62a5-4b48-9158-f941d98db5c1/diagnostics/response.json
new file mode 100644
index 0000000000000..3e9f5a67c6b5a
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/7994720d-62a5-4b48-9158-f941d98db5c1/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 7098900000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 503,
+  "vda_write": 43220992,
+  "vda_errors": -1,
+  "tapb95d2455-0a_rx": 73628,
+  "tapb95d2455-0a_rx_packets": 1235,
+  "tapb95d2455-0a_rx_errors": 0,
+  "tapb95d2455-0a_rx_drop": 0,
+  "tapb95d2455-0a_tx": 379244,
+  "tapb95d2455-0a_tx_packets": 8731,
+  "tapb95d2455-0a_tx_errors": 0,
+  "tapb95d2455-0a_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 43258,
+  "memory-unused": 178424,
+  "memory-available": 231388,
+  "memory-usable": 200464,
+  "memory-last_update": 1682079507,
+  "memory-disk_caches": 19164,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 253496
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/954441a8-552a-476c-985e-6564e6fe93d6/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/954441a8-552a-476c-985e-6564e6fe93d6/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..d48ac1f3f4dea
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/954441a8-552a-476c-985e-6564e6fe93d6/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 1132948,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 42672128,
+      "write_requests": 301,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 6970900000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:dd:51:b8",
+      "rx_octets": 73908,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 1239,
+      "rx_rate": null,
+      "tx_octets": 380498,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 8761,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/954441a8-552a-476c-985e-6564e6fe93d6/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/954441a8-552a-476c-985e-6564e6fe93d6/diagnostics/response.json
new file mode 100644
index 0000000000000..5b66ca5560b56
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/954441a8-552a-476c-985e-6564e6fe93d6/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 6970750000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 301,
+  "vda_write": 42672128,
+  "vda_errors": -1,
+  "tapb7d90692-96_rx": 73908,
+  "tapb7d90692-96_rx_packets": 1239,
+  "tapb7d90692-96_rx_errors": 0,
+  "tapb7d90692-96_rx_drop": 0,
+  "tapb7d90692-96_tx": 380498,
+  "tapb7d90692-96_tx_packets": 8761,
+  "tapb7d90692-96_tx_errors": 0,
+  "tapb7d90692-96_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 43202,
+  "memory-unused": 178580,
+  "memory-available": 231388,
+  "memory-usable": 200560,
+  "memory-last_update": 1682079508,
+  "memory-disk_caches": 19104,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 255876
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/97dec705-edab-4b3a-bbe6-b2121a85a603/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/97dec705-edab-4b3a-bbe6-b2121a85a603/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..579b237f93522
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/97dec705-edab-4b3a-bbe6-b2121a85a603/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 1126939,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 43180032,
+      "write_requests": 525,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 7161400000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:c4:2b:f1",
+      "rx_octets": 73628,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 1235,
+      "rx_rate": null,
+      "tx_octets": 379243,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 8731,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/97dec705-edab-4b3a-bbe6-b2121a85a603/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/97dec705-edab-4b3a-bbe6-b2121a85a603/diagnostics/response.json
new file mode 100644
index 0000000000000..06280472ff525
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/97dec705-edab-4b3a-bbe6-b2121a85a603/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 7161260000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 525,
+  "vda_write": 43180032,
+  "vda_errors": -1,
+  "tap9f31d2c6-47_rx": 73628,
+  "tap9f31d2c6-47_rx_packets": 1235,
+  "tap9f31d2c6-47_rx_errors": 0,
+  "tap9f31d2c6-47_rx_drop": 0,
+  "tap9f31d2c6-47_tx": 379243,
+  "tap9f31d2c6-47_tx_packets": 8731,
+  "tap9f31d2c6-47_tx_errors": 0,
+  "tap9f31d2c6-47_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 43291,
+  "memory-unused": 178504,
+  "memory-available": 231388,
+  "memory-usable": 200544,
+  "memory-last_update": 1682079504,
+  "memory-disk_caches": 19164,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 245688
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/9e80aa16-5a28-4ec0-bfce-f83bf56d0c86/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/9e80aa16-5a28-4ec0-bfce-f83bf56d0c86/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..93d13a0dd8e54
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/9e80aa16-5a28-4ec0-bfce-f83bf56d0c86/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 1126937,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 43069440,
+      "write_requests": 403,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 6929630000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:74:5b:1f",
+      "rx_octets": 73768,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 1237,
+      "rx_rate": null,
+      "tx_octets": 379243,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 8731,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/9e80aa16-5a28-4ec0-bfce-f83bf56d0c86/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/9e80aa16-5a28-4ec0-bfce-f83bf56d0c86/diagnostics/response.json
new file mode 100644
index 0000000000000..cd5237cb84cba
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/9e80aa16-5a28-4ec0-bfce-f83bf56d0c86/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 6929490000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 403,
+  "vda_write": 43069440,
+  "vda_errors": -1,
+  "tap07c7eda3-3b_rx": 73768,
+  "tap07c7eda3-3b_rx_packets": 1237,
+  "tap07c7eda3-3b_rx_errors": 0,
+  "tap07c7eda3-3b_rx_drop": 0,
+  "tap07c7eda3-3b_tx": 379243,
+  "tap07c7eda3-3b_tx_packets": 8731,
+  "tap07c7eda3-3b_tx_errors": 0,
+  "tap07c7eda3-3b_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 43269,
+  "memory-unused": 178488,
+  "memory-available": 231388,
+  "memory-usable": 200524,
+  "memory-last_update": 1682079515,
+  "memory-disk_caches": 19156,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 248220
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/cca55639-448f-44cc-ae6a-150afe0fa6b3/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/cca55639-448f-44cc-ae6a-150afe0fa6b3/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..076b74e86ba01
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/cca55639-448f-44cc-ae6a-150afe0fa6b3/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 1126978,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 43220992,
+      "write_requests": 335,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 7081770000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:4e:8f:a5",
+      "rx_octets": 73698,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 1236,
+      "rx_rate": null,
+      "tx_octets": 379244,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 8731,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/cca55639-448f-44cc-ae6a-150afe0fa6b3/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/cca55639-448f-44cc-ae6a-150afe0fa6b3/diagnostics/response.json
new file mode 100644
index 0000000000000..f293d1b0014f0
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/cca55639-448f-44cc-ae6a-150afe0fa6b3/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 7081620000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 335,
+  "vda_write": 43220992,
+  "vda_errors": -1,
+  "tap7b006f54-d9_rx": 73698,
+  "tap7b006f54-d9_rx_packets": 1236,
+  "tap7b006f54-d9_rx_errors": 0,
+  "tap7b006f54-d9_rx_drop": 0,
+  "tap7b006f54-d9_tx": 379244,
+  "tap7b006f54-d9_tx_packets": 8731,
+  "tap7b006f54-d9_tx_errors": 0,
+  "tap7b006f54-d9_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 43194,
+  "memory-unused": 178488,
+  "memory-available": 231388,
+  "memory-usable": 200536,
+  "memory-last_update": 1682079513,
+  "memory-disk_caches": 19172,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 255472
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/d34c4531-7cd1-4454-b39e-356463af7700/diagnostics/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/d34c4531-7cd1-4454-b39e-356463af7700/diagnostics/response-2.93.json
new file mode 100644
index 0000000000000..621030bacede2
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/d34c4531-7cd1-4454-b39e-356463af7700/diagnostics/response-2.93.json
@@ -0,0 +1,46 @@
+{
+  "state": "running",
+  "driver": "libvirt",
+  "hypervisor": "qemu",
+  "hypervisor_os": "linux",
+  "uptime": 1126943,
+  "config_drive": false,
+  "num_cpus": 1,
+  "num_nics": 1,
+  "num_disks": 1,
+  "disk_details": [
+    {
+      "read_bytes": 23407104,
+      "read_requests": 861,
+      "write_bytes": 43057152,
+      "write_requests": 528,
+      "errors_count": -1
+    }
+  ],
+  "cpu_details": [
+    {
+      "id": 0,
+      "time": 7135070000000,
+      "utilisation": null
+    }
+  ],
+  "nic_details": [
+    {
+      "mac_address": "fa:16:3e:f5:f8:f2",
+      "rx_octets": 73628,
+      "rx_errors": 0,
+      "rx_drop": 0,
+      "rx_packets": 1235,
+      "rx_rate": null,
+      "tx_octets": 379243,
+      "tx_errors": 0,
+      "tx_drop": 0,
+      "tx_packets": 8731,
+      "tx_rate": null
+    }
+  ],
+  "memory_details": {
+    "maximum": 0,
+    "used": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/d34c4531-7cd1-4454-b39e-356463af7700/diagnostics/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/d34c4531-7cd1-4454-b39e-356463af7700/diagnostics/response.json
new file mode 100644
index 0000000000000..bfa95114e5c11
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/d34c4531-7cd1-4454-b39e-356463af7700/diagnostics/response.json
@@ -0,0 +1,30 @@
+{
+  "cpu0_time": 7134920000000,
+  "vda_read_req": 861,
+  "vda_read": 23407104,
+  "vda_write_req": 528,
+  "vda_write": 43057152,
+  "vda_errors": -1,
+  "tap8a25ad14-30_rx": 73628,
+  "tap8a25ad14-30_rx_packets": 1235,
+  "tap8a25ad14-30_rx_errors": 0,
+  "tap8a25ad14-30_rx_drop": 0,
+  "tap8a25ad14-30_tx": 379243,
+  "tap8a25ad14-30_tx_packets": 8731,
+  "tap8a25ad14-30_tx_errors": 0,
+  "tap8a25ad14-30_tx_drop": 0,
+  "memory": 262144,
+  "memory-actual": 262144,
+  "memory-swap_in": 0,
+  "memory-swap_out": 0,
+  "memory-major_fault": 0,
+  "memory-minor_fault": 43204,
+  "memory-unused": 178512,
+  "memory-available": 231388,
+  "memory-usable": 200552,
+  "memory-last_update": 1682079511,
+  "memory-disk_caches": 19148,
+  "memory-hugetlb_pgalloc": 0,
+  "memory-hugetlb_pgfail": 0,
+  "memory-rss": 244160
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=1e6e233e637d4d55a50a62b63398ad15/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=1e6e233e637d4d55a50a62b63398ad15/response-2.93.json
new file mode 100644
index 0000000000000..ad111bbdd0213
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=1e6e233e637d4d55a50a62b63398ad15/response-2.93.json
@@ -0,0 +1,660 @@
+{
+  "servers": [
+    {
+      "id": "3b27b706-c0ad-4528-a865-7afaf7712130",
+      "name": "demo-2",
+      "status": "ERROR",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:03Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.51",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:ea:85:7d"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/3b27b706-c0ad-4528-a865-7afaf7712130"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/3b27b706-c0ad-4528-a865-7afaf7712130"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:02.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-0000004d",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-7l9f6y1k",
+      "OS-EXT-SRV-ATTR:launch_index": 1,
+      "OS-EXT-SRV-ATTR:hostname": "demo-2",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "ebbab6ad-a768-4098-9853-065bd545abe4",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "4caf78dc-2e5d-40a7-8d56-1c2f7f664283",
+      "name": "demo-5",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:28Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.184",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:4b:3d:11"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/4caf78dc-2e5d-40a7-8d56-1c2f7f664283"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/4caf78dc-2e5d-40a7-8d56-1c2f7f664283"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:28.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000050",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-7l9f6y1k",
+      "OS-EXT-SRV-ATTR:launch_index": 4,
+      "OS-EXT-SRV-ATTR:hostname": "demo-5",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "b0b1aaff-f67d-4719-9127-a62b97df26d5",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "67ca710a-e73f-4801-a12f-d0c55ccb8955",
+      "name": "demo-1",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:15:49Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.119",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:65:61:fe"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:15:48.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-0000004c",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-7l9f6y1k",
+      "OS-EXT-SRV-ATTR:launch_index": 0,
+      "OS-EXT-SRV-ATTR:hostname": "demo-1",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "055253bd-4202-4dd8-ba85-383108c8f4b5",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "7994720d-62a5-4b48-9158-f941d98db5c1",
+      "name": "demo-6",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:31Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.102",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:c5:ea:99"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/7994720d-62a5-4b48-9158-f941d98db5c1"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/7994720d-62a5-4b48-9158-f941d98db5c1"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:30.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000051",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-7l9f6y1k",
+      "OS-EXT-SRV-ATTR:launch_index": 5,
+      "OS-EXT-SRV-ATTR:hostname": "demo-6",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "05a608a4-db2c-4099-80e9-cfd778c72711",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "97dec705-edab-4b3a-bbe6-b2121a85a603",
+      "name": "demo-3",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:39Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.97",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:c4:2b:f1"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/97dec705-edab-4b3a-bbe6-b2121a85a603"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/97dec705-edab-4b3a-bbe6-b2121a85a603"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:38.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-0000004e",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-7l9f6y1k",
+      "OS-EXT-SRV-ATTR:launch_index": 2,
+      "OS-EXT-SRV-ATTR:hostname": "demo-3",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "f3dccc8a-f576-4811-9124-2165f4f28d3f",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "9e80aa16-5a28-4ec0-bfce-f83bf56d0c86",
+      "name": "demo-8",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:41Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.79",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:74:5b:1f"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/9e80aa16-5a28-4ec0-bfce-f83bf56d0c86"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/9e80aa16-5a28-4ec0-bfce-f83bf56d0c86"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:40.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000053",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-7l9f6y1k",
+      "OS-EXT-SRV-ATTR:launch_index": 7,
+      "OS-EXT-SRV-ATTR:hostname": "demo-8",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "1a6258ae-5c6a-4eed-9d97-252f4d3b45d8",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "cca55639-448f-44cc-ae6a-150afe0fa6b3",
+      "name": "demo-4",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:00Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.139",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:4e:8f:a5"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/cca55639-448f-44cc-ae6a-150afe0fa6b3"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/cca55639-448f-44cc-ae6a-150afe0fa6b3"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:15:59.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-0000004f",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-7l9f6y1k",
+      "OS-EXT-SRV-ATTR:launch_index": 3,
+      "OS-EXT-SRV-ATTR:hostname": "demo-4",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "9244a0bf-b741-4aef-9ce0-92823c03670d",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "d34c4531-7cd1-4454-b39e-356463af7700",
+      "name": "demo-7",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:35Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.63",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:f5:f8:f2"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/d34c4531-7cd1-4454-b39e-356463af7700"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/d34c4531-7cd1-4454-b39e-356463af7700"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:34.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000052",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-7l9f6y1k",
+      "OS-EXT-SRV-ATTR:launch_index": 6,
+      "OS-EXT-SRV-ATTR:hostname": "demo-7",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "10e550d3-70ff-448c-91e0-9e203312afbd",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..cfdbac8358e83
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,532 @@
+{
+  "servers": [
+    {
+      "id": "3b27b706-c0ad-4528-a865-7afaf7712130",
+      "name": "demo-2",
+      "status": "ERROR",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:03Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.51",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:ea:85:7d"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/3b27b706-c0ad-4528-a865-7afaf7712130"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/3b27b706-c0ad-4528-a865-7afaf7712130"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:02.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-0000004d",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "ebbab6ad-a768-4098-9853-065bd545abe4"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "4caf78dc-2e5d-40a7-8d56-1c2f7f664283",
+      "name": "demo-5",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:28Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.184",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:4b:3d:11"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/4caf78dc-2e5d-40a7-8d56-1c2f7f664283"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/4caf78dc-2e5d-40a7-8d56-1c2f7f664283"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:28.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000050",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "b0b1aaff-f67d-4719-9127-a62b97df26d5"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "67ca710a-e73f-4801-a12f-d0c55ccb8955",
+      "name": "demo-1",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:15:49Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.119",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:65:61:fe"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:15:48.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-0000004c",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "055253bd-4202-4dd8-ba85-383108c8f4b5"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "7994720d-62a5-4b48-9158-f941d98db5c1",
+      "name": "demo-6",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:31Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.102",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:c5:ea:99"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/7994720d-62a5-4b48-9158-f941d98db5c1"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/7994720d-62a5-4b48-9158-f941d98db5c1"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:30.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000051",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "05a608a4-db2c-4099-80e9-cfd778c72711"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "97dec705-edab-4b3a-bbe6-b2121a85a603",
+      "name": "demo-3",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:39Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.97",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:c4:2b:f1"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/97dec705-edab-4b3a-bbe6-b2121a85a603"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/97dec705-edab-4b3a-bbe6-b2121a85a603"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:38.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-0000004e",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "f3dccc8a-f576-4811-9124-2165f4f28d3f"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "9e80aa16-5a28-4ec0-bfce-f83bf56d0c86",
+      "name": "demo-8",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:41Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.79",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:74:5b:1f"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/9e80aa16-5a28-4ec0-bfce-f83bf56d0c86"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/9e80aa16-5a28-4ec0-bfce-f83bf56d0c86"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:40.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000053",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "1a6258ae-5c6a-4eed-9d97-252f4d3b45d8"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "cca55639-448f-44cc-ae6a-150afe0fa6b3",
+      "name": "demo-4",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:00Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.139",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:4e:8f:a5"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/cca55639-448f-44cc-ae6a-150afe0fa6b3"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/cca55639-448f-44cc-ae6a-150afe0fa6b3"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:15:59.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-0000004f",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "9244a0bf-b741-4aef-9ce0-92823c03670d"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "d34c4531-7cd1-4454-b39e-356463af7700",
+      "name": "demo-7",
+      "status": "ACTIVE",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "1ef00efcf95709f5083a0604bdd4642524c02085d41fbfdd404a707f",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-04-08T11:15:18Z",
+      "updated": "2023-04-08T11:16:35Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.63",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:f5:f8:f2"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/1e6e233e637d4d55a50a62b63398ad15/servers/d34c4531-7cd1-4454-b39e-356463af7700"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/1e6e233e637d4d55a50a62b63398ad15/servers/d34c4531-7cd1-4454-b39e-356463af7700"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T11:16:34.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000052",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "10e550d3-70ff-448c-91e0-9e203312afbd"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=6e39099cccde4f809b003d9e0dd09304/response-2.93.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=6e39099cccde4f809b003d9e0dd09304/response-2.93.json
new file mode 100644
index 0000000000000..74b44799c6e39
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=6e39099cccde4f809b003d9e0dd09304/response-2.93.json
@@ -0,0 +1,252 @@
+{
+  "servers": [
+    {
+      "id": "5102fbbf-7156-48dc-8355-af7ab992266f",
+      "name": "admin-1",
+      "status": "ACTIVE",
+      "tenant_id": "6e39099cccde4f809b003d9e0dd09304",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "817ebf69d75b4cbd4ce16ed833468d628f7214b96bda065353b23549",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-04-08T09:45:02Z",
+      "updated": "2023-04-08T09:45:15Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.137",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:06:5c:6f"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/6e39099cccde4f809b003d9e0dd09304/servers/5102fbbf-7156-48dc-8355-af7ab992266f"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/6e39099cccde4f809b003d9e0dd09304/servers/5102fbbf-7156-48dc-8355-af7ab992266f"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T09:45:15.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-0000004a",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-1xl867r2",
+      "OS-EXT-SRV-ATTR:launch_index": 0,
+      "OS-EXT-SRV-ATTR:hostname": "a",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "00c5fbda-cefc-4a00-94e6-26982e0c13d9",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "954441a8-552a-476c-985e-6564e6fe93d6",
+      "name": "admin-2",
+      "status": "ACTIVE",
+      "tenant_id": "6e39099cccde4f809b003d9e0dd09304",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "817ebf69d75b4cbd4ce16ed833468d628f7214b96bda065353b23549",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-04-08T09:36:12Z",
+      "updated": "2023-04-08T09:36:31Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.212",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:dd:51:b8"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/6e39099cccde4f809b003d9e0dd09304/servers/954441a8-552a-476c-985e-6564e6fe93d6"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/6e39099cccde4f809b003d9e0dd09304/servers/954441a8-552a-476c-985e-6564e6fe93d6"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T09:36:31.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000049",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-k97y23ox",
+      "OS-EXT-SRV-ATTR:launch_index": 0,
+      "OS-EXT-SRV-ATTR:hostname": "test",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "ee975988-f570-4b6c-a94e-98b8d3a189e8",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "2c653a68-b520-4582-a05d-41a68067d76c",
+      "name": "dev-1",
+      "status": "ACTIVE",
+      "tenant_id": "6e39099cccde4f809b003d9e0dd09304",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {
+        "sw_runtime_java_version": "null"
+      },
+      "hostId": "817ebf69d75b4cbd4ce16ed833468d628f7214b96bda065353b23549",
+      "image": "",
+      "flavor": {
+        "vcpus": 1,
+        "ram": 256,
+        "disk": 1,
+        "ephemeral": 0,
+        "swap": 0,
+        "original_name": "cirros256",
+        "extra_specs": {
+          "hw_rng:allowed": "True"
+        }
+      },
+      "created": "2023-03-17T14:17:54Z",
+      "updated": "2023-04-03T07:51:44Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.80",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:fe:84:d5"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/6e39099cccde4f809b003d9e0dd09304/servers/2c653a68-b520-4582-a05d-41a68067d76c"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/6e39099cccde4f809b003d9e0dd09304/servers/2c653a68-b520-4582-a05d-41a68067d76c"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-03-17T14:18:06.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000004",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:reservation_id": "r-dyo2vpre",
+      "OS-EXT-SRV-ATTR:launch_index": 0,
+      "OS-EXT-SRV-ATTR:hostname": "server",
+      "OS-EXT-SRV-ATTR:kernel_id": "",
+      "OS-EXT-SRV-ATTR:ramdisk_id": "",
+      "OS-EXT-SRV-ATTR:root_device_name": "/dev/vda",
+      "OS-EXT-SRV-ATTR:user_data": null,
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "267a47aa-ef2b-46ae-820f-77afb9f014ae",
+          "delete_on_termination": false
+        }
+      ],
+      "locked": false,
+      "locked_reason": null,
+      "description": null,
+      "tags": [],
+      "trusted_image_certificates": null,
+      "host_status": "UP",
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..6a63571d93dd1
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/compute/v2.1/servers/detail/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,204 @@
+{
+  "servers": [
+    {
+      "id": "5102fbbf-7156-48dc-8355-af7ab992266f",
+      "name": "admin-1",
+      "status": "ACTIVE",
+      "tenant_id": "6e39099cccde4f809b003d9e0dd09304",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "817ebf69d75b4cbd4ce16ed833468d628f7214b96bda065353b23549",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/6e39099cccde4f809b003d9e0dd09304/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-04-08T09:45:02Z",
+      "updated": "2023-04-08T09:45:15Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.137",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:06:5c:6f"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/6e39099cccde4f809b003d9e0dd09304/servers/5102fbbf-7156-48dc-8355-af7ab992266f"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/6e39099cccde4f809b003d9e0dd09304/servers/5102fbbf-7156-48dc-8355-af7ab992266f"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T09:45:15.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-0000004a",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "00c5fbda-cefc-4a00-94e6-26982e0c13d9"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "954441a8-552a-476c-985e-6564e6fe93d6",
+      "name": "admin-2",
+      "status": "ACTIVE",
+      "tenant_id": "6e39099cccde4f809b003d9e0dd09304",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {},
+      "hostId": "817ebf69d75b4cbd4ce16ed833468d628f7214b96bda065353b23549",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/6e39099cccde4f809b003d9e0dd09304/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-04-08T09:36:12Z",
+      "updated": "2023-04-08T09:36:31Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.212",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:dd:51:b8"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/6e39099cccde4f809b003d9e0dd09304/servers/954441a8-552a-476c-985e-6564e6fe93d6"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/6e39099cccde4f809b003d9e0dd09304/servers/954441a8-552a-476c-985e-6564e6fe93d6"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-04-08T09:36:31.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000049",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "ee975988-f570-4b6c-a94e-98b8d3a189e8"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    },
+    {
+      "id": "2c653a68-b520-4582-a05d-41a68067d76c",
+      "name": "dev-1",
+      "status": "ACTIVE",
+      "tenant_id": "6e39099cccde4f809b003d9e0dd09304",
+      "user_id": "78205c506b534738bc851d3e189a00c3",
+      "metadata": {
+        "sw_runtime_java_version": "null"
+      },
+      "hostId": "817ebf69d75b4cbd4ce16ed833468d628f7214b96bda065353b23549",
+      "image": "",
+      "flavor": {
+        "id": "c1",
+        "links": [
+          {
+            "rel": "bookmark",
+            "href": "http://34.91.114.145/compute/6e39099cccde4f809b003d9e0dd09304/flavors/c1"
+          }
+        ]
+      },
+      "created": "2023-03-17T14:17:54Z",
+      "updated": "2023-04-03T07:51:44Z",
+      "addresses": {
+        "shared": [
+          {
+            "version": 4,
+            "addr": "192.168.233.80",
+            "OS-EXT-IPS:type": "fixed",
+            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:fe:84:d5"
+          }
+        ]
+      },
+      "accessIPv4": "",
+      "accessIPv6": "",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/compute/v2.1/6e39099cccde4f809b003d9e0dd09304/servers/2c653a68-b520-4582-a05d-41a68067d76c"
+        },
+        {
+          "rel": "bookmark",
+          "href": "http://34.91.114.145/compute/6e39099cccde4f809b003d9e0dd09304/servers/2c653a68-b520-4582-a05d-41a68067d76c"
+        }
+      ],
+      "OS-DCF:diskConfig": "AUTO",
+      "progress": 0,
+      "OS-EXT-AZ:availability_zone": "availability-zone",
+      "config_drive": "",
+      "key_name": null,
+      "OS-SRV-USG:launched_at": "2023-03-17T14:18:06.000000",
+      "OS-SRV-USG:terminated_at": null,
+      "OS-EXT-SRV-ATTR:host": "agent-integrations-openstack-default",
+      "OS-EXT-SRV-ATTR:instance_name": "instance-00000004",
+      "OS-EXT-SRV-ATTR:hypervisor_hostname": "agent-integrations-openstack-default",
+      "OS-EXT-STS:task_state": null,
+      "OS-EXT-STS:vm_state": "active",
+      "OS-EXT-STS:power_state": 1,
+      "os-extended-volumes:volumes_attached": [
+        {
+          "id": "267a47aa-ef2b-46ae-820f-77afb9f014ae"
+        }
+      ],
+      "security_groups": [
+        {
+          "name": "default"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/identity/response.json b/openstack_controller/tests/fixtures/GET/identity/response.json
new file mode 100644
index 0000000000000..9cc212496d943
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/response.json
@@ -0,0 +1,23 @@
+{
+    "versions": {
+      "values": [
+        {
+          "id": "v3.14",
+          "status": "stable",
+          "updated": "2020-04-07T00:00:00Z",
+          "links": [
+            {
+              "rel": "self",
+              "href": "http://10.164.0.71/identity/v3/"
+            }
+          ],
+          "media-types": [
+            {
+              "base": "application/json",
+              "type": "application/vnd.openstack.identity-v3+json"
+            }
+          ]
+        }
+      ]
+    }
+  }
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/auth/projects/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/auth/projects/response.json
new file mode 100644
index 0000000000000..b34876f5d1b69
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/auth/projects/response.json
@@ -0,0 +1,37 @@
+{
+  "projects": [
+    {
+      "id": "1e6e233e637d4d55a50a62b63398ad15",
+      "name": "demo",
+      "domain_id": "default",
+      "description": "",
+      "enabled": true,
+      "parent_id": "default",
+      "is_domain": false,
+      "tags": [],
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/projects/1e6e233e637d4d55a50a62b63398ad15"
+      }
+    },
+    {
+      "id": "6e39099cccde4f809b003d9e0dd09304",
+      "name": "admin",
+      "domain_id": "default",
+      "description": "Bootstrap project for initializing the cloud.",
+      "enabled": true,
+      "parent_id": "default",
+      "is_domain": false,
+      "tags": [],
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/projects/6e39099cccde4f809b003d9e0dd09304"
+      }
+    }
+  ],
+  "links": {
+    "next": null,
+    "self": "http://10.164.0.11/identity/v3/auth/projects",
+    "previous": null
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/domains/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/domains/response.json
new file mode 100644
index 0000000000000..a143fea1d66fd
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/domains/response.json
@@ -0,0 +1,31 @@
+{
+  "domains": [
+    {
+      "id": "03e40b01788d403e98e4b9a20210492e",
+      "name": "New domain",
+      "description": "",
+      "enabled": true,
+      "tags": [],
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/domains/03e40b01788d403e98e4b9a20210492e"
+      }
+    },
+    {
+      "id": "default",
+      "name": "Default",
+      "description": "The default domain",
+      "enabled": true,
+      "tags": [],
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/domains/default"
+      }
+    }
+  ],
+  "links": {
+    "next": null,
+    "self": "http://10.164.0.11/identity/v3/domains",
+    "previous": null
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/groups/89b36a4c32c44b0ea8856b6357f101ea/users/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/groups/89b36a4c32c44b0ea8856b6357f101ea/users/response.json
new file mode 100644
index 0000000000000..1b94b0662b701
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/groups/89b36a4c32c44b0ea8856b6357f101ea/users/response.json
@@ -0,0 +1,20 @@
+{
+  "users": [
+    {
+      "id": "78205c506b534738bc851d3e189a00c3",
+      "name": "admin",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/78205c506b534738bc851d3e189a00c3"
+      }
+    }
+  ],
+  "links": {
+    "next": null,
+    "self": "http://10.164.0.11/identity/v3/groups/89b36a4c32c44b0ea8856b6357f101ea/users",
+    "previous": null
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/groups/9acda6caf16e4828935f4f681ee8b3e5/users/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/groups/9acda6caf16e4828935f4f681ee8b3e5/users/response.json
new file mode 100644
index 0000000000000..20762b6334bf4
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/groups/9acda6caf16e4828935f4f681ee8b3e5/users/response.json
@@ -0,0 +1,8 @@
+{
+  "users": [],
+  "links": {
+    "next": null,
+    "self": "http://10.164.0.11/identity/v3/groups/9acda6caf16e4828935f4f681ee8b3e5/users",
+    "previous": null
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/groups/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/groups/response.json
new file mode 100644
index 0000000000000..cf97b3168b43b
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/groups/response.json
@@ -0,0 +1,27 @@
+{
+  "groups": [
+    {
+      "id": "89b36a4c32c44b0ea8856b6357f101ea",
+      "name": "admins",
+      "domain_id": "default",
+      "description": "openstack admin group",
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/groups/89b36a4c32c44b0ea8856b6357f101ea"
+      }
+    },
+    {
+      "id": "9acda6caf16e4828935f4f681ee8b3e5",
+      "name": "nonadmins",
+      "domain_id": "default",
+      "description": "non-admin group",
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/groups/9acda6caf16e4828935f4f681ee8b3e5"
+      }
+    }
+  ],
+  "links": {
+    "next": null,
+    "self": "http://10.164.0.11/identity/v3/groups",
+    "previous": null
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/limits/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/limits/response.json
new file mode 100644
index 0000000000000..5040cd070cadb
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/limits/response.json
@@ -0,0 +1,35 @@
+{
+  "limits": [
+    {
+      "resource_name": "volume",
+      "region_id": null,
+      "links": {
+          "self": "http://10.3.150.25/identity/v3/limits/25a04c7a065c430590881c646cdcdd58"
+      },
+      "service_id": "9408080f1970482aa0e38bc2d4ea34b7",
+      "project_id": "3a705b9f56bb439381b43c4fe59dccce",
+      "domain_id": null,
+      "id": "25a04c7a065c430590881c646cdcdd58",
+      "resource_limit": 11,
+      "description": "Number of volumes for project 3a705b9f56bb439381b43c4fe59dccce"
+  },
+  {
+      "resource_name": "snapshot",
+      "region_id": "RegionOne",
+      "links": {
+          "self": "http://10.3.150.25/identity/v3/limits/3229b3849f584faea483d6851f7aab05"
+      },
+      "service_id": "9408080f1970482aa0e38bc2d4ea34b7",
+      "project_id": "3a705b9f56bb439381b43c4fe59dccce",
+      "domain_id": null,
+      "id": "3229b3849f584faea483d6851f7aab05",
+      "resource_limit": 5,
+      "description": null
+  }
+  ],
+  "links": {
+    "next": null,
+    "self": "http://10.164.0.11/identity/v3/limits",
+    "previous": null
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/projects/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/projects/response.json
new file mode 100644
index 0000000000000..085766a0946ba
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/projects/response.json
@@ -0,0 +1,79 @@
+{
+  "projects": [
+    {
+      "id": "1e6e233e637d4d55a50a62b63398ad15",
+      "name": "demo",
+      "domain_id": "default",
+      "description": "",
+      "enabled": true,
+      "parent_id": "default",
+      "is_domain": false,
+      "tags": ["foo", "bar"],
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/projects/1e6e233e637d4d55a50a62b63398ad15"
+      }
+    },
+    {
+      "id": "6e39099cccde4f809b003d9e0dd09304",
+      "name": "admin",
+      "domain_id": "default",
+      "description": "Bootstrap project for initializing the cloud.",
+      "enabled": true,
+      "parent_id": "default",
+      "is_domain": false,
+      "tags": [],
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/projects/6e39099cccde4f809b003d9e0dd09304"
+      }
+    },
+    {
+      "id": "b0700d860b244dcbb038541976cd8f32",
+      "name": "alt_demo",
+      "domain_id": "default",
+      "description": "",
+      "enabled": true,
+      "parent_id": "default",
+      "is_domain": false,
+      "tags": [],
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/projects/b0700d860b244dcbb038541976cd8f32"
+      }
+    },
+    {
+      "id": "c1147335eac0402ea9cabaae59c267e1",
+      "name": "invisible_to_admin",
+      "domain_id": "default",
+      "description": "",
+      "enabled": false,
+      "parent_id": "default",
+      "is_domain": false,
+      "tags": [],
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/projects/c1147335eac0402ea9cabaae59c267e1"
+      }
+    },
+    {
+      "id": "e9e405ed5811407db982e3113e52d26b",
+      "name": "service",
+      "domain_id": "default",
+      "description": "",
+      "enabled": true,
+      "parent_id": "default",
+      "is_domain": false,
+      "tags": [],
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/projects/e9e405ed5811407db982e3113e52d26b"
+      }
+    }
+  ],
+  "links": {
+    "next": null,
+    "self": "http://10.164.0.11/identity/v3/projects",
+    "previous": null
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/regions/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/regions/response.json
new file mode 100644
index 0000000000000..2f4c54aaeef9b
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/regions/response.json
@@ -0,0 +1,26 @@
+{
+    "regions": [
+      {
+        "enabled": true,
+        "id": "my-region",
+        "description": "",
+        "parent_region_id": null,
+        "links": {
+          "self": "http://10.164.0.11/identity/v3/regions/my-region"
+        }
+      },
+      {
+        "id": "RegionOne",
+        "description": "",
+        "parent_region_id": null,
+        "links": {
+          "self": "http://10.164.0.11/identity/v3/regions/RegionOne"
+        }
+      }
+    ],
+    "links": {
+      "next": null,
+      "self": "http://10.164.0.11/identity/v3/regions",
+      "previous": null
+    }
+  }
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/registered_limits/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/registered_limits/response.json
new file mode 100644
index 0000000000000..bad5bb15d8275
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/registered_limits/response.json
@@ -0,0 +1,53 @@
+{
+  "registered_limits": [
+    {
+      "id": "dd4fefa5602a4414b1c0a01ac7514b97",
+      "service_id": "82624ab61fb04f058d043facf315fa3c",
+      "region_id": "RegionOne",
+      "resource_name": "image_size_total",
+      "default_limit": 1000,
+      "description": null,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/registered_limits/dd4fefa5602a4414b1c0a01ac7514b97"
+      }
+    },
+    {
+      "id": "5e7d44c9d30d47919187a5c1a58a8885",
+      "service_id": "82624ab61fb04f058d043facf315fa3c",
+      "region_id": "RegionOne",
+      "resource_name": "image_stage_total",
+      "default_limit": 1000,
+      "description": null,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/registered_limits/5e7d44c9d30d47919187a5c1a58a8885"
+      }
+    },
+    {
+      "id": "9f489d63900841f4a70fe58036c81339",
+      "service_id": "82624ab61fb04f058d043facf315fa3c",
+      "region_id": "RegionOne",
+      "resource_name": "image_count_total",
+      "default_limit": 100,
+      "description": null,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/registered_limits/9f489d63900841f4a70fe58036c81339"
+      }
+    },
+    {
+      "id": "5d26b57b414c4e25848cd34b38f56606",
+      "service_id": "82624ab61fb04f058d043facf315fa3c",
+      "region_id": "RegionOne",
+      "resource_name": "image_count_uploading",
+      "default_limit": 100,
+      "description": null,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/registered_limits/5d26b57b414c4e25848cd34b38f56606"
+      }
+    }
+  ],
+  "links": {
+    "next": null,
+    "self": "http://10.164.0.11/identity/v3/registered_limits",
+    "previous": null
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/services/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/services/response.json
new file mode 100644
index 0000000000000..7450d7f7a4bee
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/services/response.json
@@ -0,0 +1,88 @@
+{
+  "services": [
+    {
+      "name": "placement",
+      "description": "Placement Service",
+      "id": "155d28a57a054d5fae86410b566ffca1",
+      "type": "placement",
+      "enabled": true,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/services/155d28a57a054d5fae86410b566ffca1"
+      }
+    },
+    {
+      "name": "nova_legacy",
+      "description": "Nova Compute Service (Legacy 2.0)",
+      "id": "17d8088bf93b41b19ae971eb6f2aa7a5",
+      "type": "compute_legacy",
+      "enabled": true,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/services/17d8088bf93b41b19ae971eb6f2aa7a5"
+      }
+    },
+    {
+      "name": "keystone",
+      "id": "271afc4cc62e493592b6be9b87bfb108",
+      "type": "identity",
+      "enabled": true,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/services/271afc4cc62e493592b6be9b87bfb108"
+      }
+    },
+    {
+      "name": "cinderv3",
+      "description": "Cinder Volume Service V3",
+      "id": "3ef836a26c2c40acabb07a6415384f20",
+      "type": "volumev3",
+      "enabled": true,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/services/3ef836a26c2c40acabb07a6415384f20"
+      }
+    },
+    {
+      "name": "cinder",
+      "description": "Cinder Volume Service",
+      "id": "55b21161725a461793a2222749229306",
+      "type": "block-storage",
+      "enabled": true,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/services/55b21161725a461793a2222749229306"
+      }
+    },
+    {
+      "name": "neutron",
+      "description": "Neutron Service",
+      "id": "7dca0a2e55d74d66995f3105ed69608f",
+      "type": "network",
+      "enabled": true,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/services/7dca0a2e55d74d66995f3105ed69608f"
+      }
+    },
+    {
+      "name": "glance",
+      "description": "Glance Image Service",
+      "id": "82624ab61fb04f058d043facf315fa3c",
+      "type": "image",
+      "enabled": true,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/services/82624ab61fb04f058d043facf315fa3c"
+      }
+    },
+    {
+      "name": "nova",
+      "description": "Nova Compute Service",
+      "id": "9aca42df11e84366924013b2f1a1259b",
+      "type": "compute",
+      "enabled": true,
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/services/9aca42df11e84366924013b2f1a1259b"
+      }
+    }
+  ],
+  "links": {
+    "next": null,
+    "self": "http://10.164.0.11/identity/v3/services",
+    "previous": null
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/identity/v3/users/response.json b/openstack_controller/tests/fixtures/GET/identity/v3/users/response.json
new file mode 100644
index 0000000000000..b6f691e5dd5b9
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/identity/v3/users/response.json
@@ -0,0 +1,159 @@
+{
+  "users": [
+    {
+      "id": "78205c506b534738bc851d3e189a00c3",
+      "name": "admin",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/78205c506b534738bc851d3e189a00c3"
+      }
+    },
+    {
+      "email": "demo@example.com",
+      "id": "2059bc7347c94546bef812b1092cc5cf",
+      "name": "demo",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/2059bc7347c94546bef812b1092cc5cf"
+      }
+    },
+    {
+      "email": "demo_reader@example.com",
+      "id": "e3e3e90d24b34e52970a54c9e8656778",
+      "name": "demo_reader",
+      "domain_id": "default",
+      "enabled": false,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/e3e3e90d24b34e52970a54c9e8656778"
+      }
+    },
+    {
+      "email": "alt_demo@example.com",
+      "id": "3472440960de4595be3b975d230979d3",
+      "name": "alt_demo",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/3472440960de4595be3b975d230979d3"
+      }
+    },
+    {
+      "email": "alt_demo_member@example.com",
+      "id": "87e289ddac6d4dce8626a659c5ea88ae",
+      "name": "alt_demo_member",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/87e289ddac6d4dce8626a659c5ea88ae"
+      }
+    },
+    {
+      "email": "alt_demo_reader@example.com",
+      "id": "61f0cd4dec604f968ff6cc92d4c1c278",
+      "name": "alt_demo_reader",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/61f0cd4dec604f968ff6cc92d4c1c278"
+      }
+    },
+    {
+      "email": "system_member@example.com",
+      "id": "5d0c9a6896c9430b8a1528424c9ee6f6",
+      "name": "system_member",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/5d0c9a6896c9430b8a1528424c9ee6f6"
+      }
+    },
+    {
+      "email": "system_reader@example.com",
+      "id": "aeaa8e9835284e4380583e10bb2575fd",
+      "name": "system_reader",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/aeaa8e9835284e4380583e10bb2575fd"
+      }
+    },
+    {
+      "id": "bc603ecd6ed940119be9a3a933c39509",
+      "name": "nova",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/bc603ecd6ed940119be9a3a933c39509"
+      }
+    },
+    {
+      "id": "ad9f72f911744acbbf69379e45a3ef37",
+      "name": "glance",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/ad9f72f911744acbbf69379e45a3ef37"
+      }
+    },
+    {
+      "id": "94fb5df1e547496894f9304a9b4a06d4",
+      "name": "neutron",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/94fb5df1e547496894f9304a9b4a06d4"
+      }
+    },
+    {
+      "id": "af4653d4f2dc4a38b8af36cbd3993d5a",
+      "name": "cinder",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/af4653d4f2dc4a38b8af36cbd3993d5a"
+      }
+    },
+    {
+      "id": "fc7c3571bed548e98e7df266f57a50f7",
+      "name": "placement",
+      "domain_id": "default",
+      "enabled": true,
+      "password_expires_at": null,
+      "options": {},
+      "links": {
+        "self": "http://10.164.0.11/identity/v3/users/fc7c3571bed548e98e7df266f57a50f7"
+      }
+    }
+  ],
+  "links": {
+    "next": null,
+    "self": "http://10.164.0.11/identity/v3/users",
+    "previous": null
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/response.json
new file mode 100644
index 0000000000000..923a27de384ed
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/response.json
@@ -0,0 +1,301 @@
+{
+  "versions": [
+    {
+      "id": "v2.0",
+      "status": "SUPPORTED",
+      "updated": "2016-12-11T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.1",
+      "status": "SUPPORTED",
+      "updated": "2018-04-20T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.2",
+      "status": "SUPPORTED",
+      "updated": "2018-07-31T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.3",
+      "status": "SUPPORTED",
+      "updated": "2018-12-18T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.4",
+      "status": "SUPPORTED",
+      "updated": "2018-12-19T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.5",
+      "status": "SUPPORTED",
+      "updated": "2019-01-21T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.6",
+      "status": "SUPPORTED",
+      "updated": "2019-01-25T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.7",
+      "status": "SUPPORTED",
+      "updated": "2018-01-25T12:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.8",
+      "status": "SUPPORTED",
+      "updated": "2019-02-12T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.9",
+      "status": "SUPPORTED",
+      "updated": "2019-03-04T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.10",
+      "status": "SUPPORTED",
+      "updated": "2019-03-05T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.11",
+      "status": "SUPPORTED",
+      "updated": "2019-06-24T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.12",
+      "status": "SUPPORTED",
+      "updated": "2019-09-11T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.13",
+      "status": "SUPPORTED",
+      "updated": "2019-09-13T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.14",
+      "status": "SUPPORTED",
+      "updated": "2019-11-10T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.15",
+      "status": "SUPPORTED",
+      "updated": "2020-03-10T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.16",
+      "status": "SUPPORTED",
+      "updated": "2020-03-15T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.17",
+      "status": "SUPPORTED",
+      "updated": "2020-04-29T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.18",
+      "status": "SUPPORTED",
+      "updated": "2020-04-29T01:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.19",
+      "status": "SUPPORTED",
+      "updated": "2020-05-12T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.20",
+      "status": "SUPPORTED",
+      "updated": "2020-08-02T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.21",
+      "status": "SUPPORTED",
+      "updated": "2020-09-03T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.22",
+      "status": "SUPPORTED",
+      "updated": "2020-09-04T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.23",
+      "status": "SUPPORTED",
+      "updated": "2020-09-07T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.24",
+      "status": "SUPPORTED",
+      "updated": "2020-10-15T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.25",
+      "status": "SUPPORTED",
+      "updated": "2021-10-02T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    },
+    {
+      "id": "v2.26",
+      "status": "CURRENT",
+      "updated": "2022-08-29T00:00:00Z",
+      "links": [
+        {
+          "href": "http://34.91.5.108/load-balancer/v2",
+          "rel": "self"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/healthmonitors/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/healthmonitors/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..378744eff8a7a
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/healthmonitors/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,32 @@
+{
+  "healthmonitors": [
+    {
+      "id": "268883b7-c057-4e85-b2c5-d8760267dad1",
+      "name": "healthmonitor-1",
+      "type": "HTTP",
+      "delay": 5,
+      "timeout": 5,
+      "max_retries": 3,
+      "max_retries_down": 3,
+      "http_method": "GET",
+      "url_path": "/",
+      "expected_codes": "200",
+      "admin_state_up": true,
+      "project_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "pools": [
+        {
+          "id": "d0335b34-3115-4b3b-9a1a-7e2363ebfee3"
+        }
+      ],
+      "provisioning_status": "ACTIVE",
+      "operating_status": "ONLINE",
+      "created_at": "2023-04-18T15:03:33",
+      "updated_at": "2023-04-18T15:03:59",
+      "tags": [],
+      "http_version": null,
+      "domain_name": null,
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15"
+    }
+  ],
+  "healthmonitors_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/healthmonitors/project_id=6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/healthmonitors/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..0d99da6c15a69
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/healthmonitors/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,4 @@
+{
+  "healthmonitors": [],
+  "healthmonitors_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/243decd9-3370-4fc1-b163-80c4155bda04/stats/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/243decd9-3370-4fc1-b163-80c4155bda04/stats/response.json
new file mode 100644
index 0000000000000..e2875ac8df445
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/243decd9-3370-4fc1-b163-80c4155bda04/stats/response.json
@@ -0,0 +1,9 @@
+{
+  "stats": {
+    "bytes_in": 0,
+    "bytes_out": 0,
+    "active_connections": 0,
+    "total_connections": 0,
+    "request_errors": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/9da03992-77a4-4b65-b39a-0e106961f577/stats/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/9da03992-77a4-4b65-b39a-0e106961f577/stats/response.json
new file mode 100644
index 0000000000000..e2875ac8df445
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/9da03992-77a4-4b65-b39a-0e106961f577/stats/response.json
@@ -0,0 +1,9 @@
+{
+  "stats": {
+    "bytes_in": 0,
+    "bytes_out": 0,
+    "active_connections": 0,
+    "total_connections": 0,
+    "request_errors": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/de81cbdc-8207-4253-8f21-3eea9870e7a9/stats/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/de81cbdc-8207-4253-8f21-3eea9870e7a9/stats/response.json
new file mode 100644
index 0000000000000..e2875ac8df445
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/de81cbdc-8207-4253-8f21-3eea9870e7a9/stats/response.json
@@ -0,0 +1,9 @@
+{
+  "stats": {
+    "bytes_in": 0,
+    "bytes_out": 0,
+    "active_connections": 0,
+    "total_connections": 0,
+    "request_errors": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..f971c95e51ffe
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,116 @@
+{
+  "listeners": [
+    {
+      "id": "de81cbdc-8207-4253-8f21-3eea9870e7a9",
+      "name": "listener-1",
+      "description": "",
+      "provisioning_status": "ACTIVE",
+      "operating_status": "ONLINE",
+      "admin_state_up": true,
+      "protocol": "HTTP",
+      "protocol_port": 80,
+      "connection_limit": -1,
+      "default_tls_container_ref": null,
+      "sni_container_refs": [],
+      "project_id": "4762874c945945c38d820cce29fbb66e",
+      "default_pool_id": "d0335b34-3115-4b3b-9a1a-7e2363ebfee3",
+      "l7policies": [],
+      "insert_headers": {},
+      "created_at": "2023-04-18T15:01:44",
+      "updated_at": "2023-04-20T14:03:52",
+      "loadbalancers": [
+        {
+          "id": "4bb7bfb1-83c2-45e8-b0e1-ed3022329115"
+        }
+      ],
+      "timeout_client_data": 50000,
+      "timeout_member_connect": 5000,
+      "timeout_member_data": 50000,
+      "timeout_tcp_inspect": 0,
+      "tags": [],
+      "client_ca_tls_container_ref": null,
+      "client_authentication": "NONE",
+      "client_crl_container_ref": null,
+      "allowed_cidrs": null,
+      "tls_ciphers": null,
+      "tls_versions": null,
+      "alpn_protocols": null,
+      "tenant_id": "4762874c945945c38d820cce29fbb66e"
+    },
+    {
+      "id": "9da03992-77a4-4b65-b39a-0e106961f577",
+      "name": "listener-3",
+      "description": "",
+      "provisioning_status": "ACTIVE",
+      "operating_status": "ONLINE",
+      "admin_state_up": true,
+      "protocol": "TCP",
+      "protocol_port": 22,
+      "connection_limit": -1,
+      "default_tls_container_ref": null,
+      "sni_container_refs": [],
+      "project_id": "4762874c945945c38d820cce29fbb66e",
+      "default_pool_id": null,
+      "l7policies": [],
+      "insert_headers": {},
+      "created_at": "2023-04-20T13:58:48",
+      "updated_at": "2023-04-20T13:59:21",
+      "loadbalancers": [
+        {
+          "id": "4bb7bfb1-83c2-45e8-b0e1-ed3022329115"
+        }
+      ],
+      "timeout_client_data": 50000,
+      "timeout_member_connect": 5000,
+      "timeout_member_data": 50000,
+      "timeout_tcp_inspect": 0,
+      "tags": [],
+      "client_ca_tls_container_ref": null,
+      "client_authentication": "NONE",
+      "client_crl_container_ref": null,
+      "allowed_cidrs": null,
+      "tls_ciphers": null,
+      "tls_versions": null,
+      "alpn_protocols": null,
+      "tenant_id": "4762874c945945c38d820cce29fbb66e"
+    },
+    {
+      "id": "243decd9-3370-4fc1-b163-80c4155bda04",
+      "name": "listener-2",
+      "description": "",
+      "provisioning_status": "ACTIVE",
+      "operating_status": "ONLINE",
+      "admin_state_up": true,
+      "protocol": "UDP",
+      "protocol_port": 5000,
+      "connection_limit": -1,
+      "default_tls_container_ref": null,
+      "sni_container_refs": [],
+      "project_id": "4762874c945945c38d820cce29fbb66e",
+      "default_pool_id": null,
+      "l7policies": [],
+      "insert_headers": {},
+      "created_at": "2023-04-20T14:03:06",
+      "updated_at": "2023-04-20T14:04:07",
+      "loadbalancers": [
+        {
+          "id": "ae54877c-b186-4b90-b71c-d331b9e732bc"
+        }
+      ],
+      "timeout_client_data": 50000,
+      "timeout_member_connect": 5000,
+      "timeout_member_data": 50000,
+      "timeout_tcp_inspect": 0,
+      "tags": [],
+      "client_ca_tls_container_ref": null,
+      "client_authentication": "NONE",
+      "client_crl_container_ref": null,
+      "allowed_cidrs": null,
+      "tls_ciphers": null,
+      "tls_versions": null,
+      "alpn_protocols": null,
+      "tenant_id": "4762874c945945c38d820cce29fbb66e"
+    }
+  ],
+  "listeners_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/project_id=6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..6f8cdb306089b
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/listeners/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,4 @@
+{
+  "listeners": [],
+  "listeners_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/4bb7bfb1-83c2-45e8-b0e1-ed3022329115/stats/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/4bb7bfb1-83c2-45e8-b0e1-ed3022329115/stats/response.json
new file mode 100644
index 0000000000000..e2875ac8df445
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/4bb7bfb1-83c2-45e8-b0e1-ed3022329115/stats/response.json
@@ -0,0 +1,9 @@
+{
+  "stats": {
+    "bytes_in": 0,
+    "bytes_out": 0,
+    "active_connections": 0,
+    "total_connections": 0,
+    "request_errors": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/ae54877c-b186-4b90-b71c-d331b9e732bc/stats/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/ae54877c-b186-4b90-b71c-d331b9e732bc/stats/response.json
new file mode 100644
index 0000000000000..e2875ac8df445
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/ae54877c-b186-4b90-b71c-d331b9e732bc/stats/response.json
@@ -0,0 +1,9 @@
+{
+  "stats": {
+    "bytes_in": 0,
+    "bytes_out": 0,
+    "active_connections": 0,
+    "total_connections": 0,
+    "request_errors": 0
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..6ac802f687cfe
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,68 @@
+{
+  "loadbalancers": [
+    {
+      "id": "4bb7bfb1-83c2-45e8-b0e1-ed3022329115",
+      "name": "loadbalancer-1",
+      "description": "",
+      "provisioning_status": "ACTIVE",
+      "operating_status": "ERROR",
+      "admin_state_up": true,
+      "project_id": "4762874c945945c38d820cce29fbb66e",
+      "created_at": "2023-04-18T14:55:48",
+      "updated_at": "2023-04-20T14:03:52",
+      "vip_address": "172.24.4.107",
+      "vip_port_id": "c8d33b91-da2d-48e9-a807-04e972e838a1",
+      "vip_subnet_id": "8c23566f-624d-4b78-8056-14a9c193cf24",
+      "vip_network_id": "2a4975c0-af95-4cf5-85e4-d5f7989af4a5",
+      "additional_vips": [],
+      "listeners": [
+        {
+          "id": "9da03992-77a4-4b65-b39a-0e106961f577"
+        },
+        {
+          "id": "de81cbdc-8207-4253-8f21-3eea9870e7a9"
+        }
+      ],
+      "pools": [
+        {
+          "id": "d0335b34-3115-4b3b-9a1a-7e2363ebfee3"
+        }
+      ],
+      "provider": "amphora",
+      "flavor_id": null,
+      "vip_qos_policy_id": null,
+      "tags": [],
+      "availability_zone": null,
+      "tenant_id": "4762874c945945c38d820cce29fbb66e"
+    },
+    {
+      "id": "ae54877c-b186-4b90-b71c-d331b9e732bc",
+      "name": "loadbalancer-2",
+      "description": "",
+      "provisioning_status": "ACTIVE",
+      "operating_status": "ONLINE",
+      "admin_state_up": true,
+      "project_id": "4762874c945945c38d820cce29fbb66e",
+      "created_at": "2023-04-20T13:57:33",
+      "updated_at": "2023-04-20T14:03:59",
+      "vip_address": "172.24.4.251",
+      "vip_port_id": "cf39978a-068e-4f9f-a797-dbbf2dfa0e59",
+      "vip_subnet_id": "8c23566f-624d-4b78-8056-14a9c193cf24",
+      "vip_network_id": "2a4975c0-af95-4cf5-85e4-d5f7989af4a5",
+      "additional_vips": [],
+      "listeners": [
+        {
+          "id": "243decd9-3370-4fc1-b163-80c4155bda04"
+        }
+      ],
+      "pools": [],
+      "provider": "amphora",
+      "flavor_id": null,
+      "vip_qos_policy_id": null,
+      "tags": [],
+      "availability_zone": null,
+      "tenant_id": "4762874c945945c38d820cce29fbb66e"
+    }
+  ],
+  "loadbalancers_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/project_id=6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..0d321e5ad8658
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/loadbalancers/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,4 @@
+{
+  "loadbalancers": [],
+  "loadbalancers_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/GET.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/GET.json
new file mode 100644
index 0000000000000..2a573fcbbdf1f
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/GET.json
@@ -0,0 +1,47 @@
+{
+  "pools": [
+    {
+      "id": "d0335b34-3115-4b3b-9a1a-7e2363ebfee3",
+      "name": "pool-1",
+      "description": "",
+      "provisioning_status": "ACTIVE",
+      "operating_status": "ERROR",
+      "admin_state_up": true,
+      "protocol": "HTTP",
+      "lb_algorithm": "ROUND_ROBIN",
+      "session_persistence": null,
+      "project_id": "4762874c945945c38d820cce29fbb66e",
+      "loadbalancers": [
+        {
+          "id": "4bb7bfb1-83c2-45e8-b0e1-ed3022329115"
+        }
+      ],
+      "listeners": [
+        {
+          "id": "de81cbdc-8207-4253-8f21-3eea9870e7a9"
+        }
+      ],
+      "created_at": "2023-04-18T15:03:03",
+      "updated_at": "2023-04-20T14:03:52",
+      "healthmonitor_id": "268883b7-c057-4e85-b2c5-d8760267dad1",
+      "members": [
+        {
+          "id": "0abcafea-2ad2-44cd-957f-690644ba479c"
+        },
+        {
+          "id": "e79e1011-2eb4-486f-84c3-99d2a4aef88d"
+        }
+      ],
+      "tags": [],
+      "tls_container_ref": null,
+      "ca_tls_container_ref": null,
+      "crl_container_ref": null,
+      "tls_enabled": false,
+      "tls_ciphers": null,
+      "tls_versions": null,
+      "alpn_protocols": null,
+      "tenant_id": "4762874c945945c38d820cce29fbb66e"
+    }
+  ],
+  "pools_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/d0335b34-3115-4b3b-9a1a-7e2363ebfee3/members/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/d0335b34-3115-4b3b-9a1a-7e2363ebfee3/members/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..7ff33c8427de8
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/d0335b34-3115-4b3b-9a1a-7e2363ebfee3/members/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,43 @@
+{
+  "members": [
+    {
+      "id": "0abcafea-2ad2-44cd-957f-690644ba479c",
+      "name": "amphora-042bcca4-4d97-47a9-bc04-d88c1e3a4d72",
+      "operating_status": "ERROR",
+      "provisioning_status": "ACTIVE",
+      "admin_state_up": true,
+      "address": "192.168.0.84",
+      "protocol_port": 5000,
+      "weight": 1,
+      "backup": false,
+      "subnet_id": "1f1295c2-6286-4930-8077-125f6edb6f42",
+      "project_id": "4762874c945945c38d820cce29fbb66e",
+      "created_at": "2023-04-20T14:02:47",
+      "updated_at": "2023-04-20T14:03:33",
+      "monitor_address": null,
+      "monitor_port": null,
+      "tags": [],
+      "tenant_id": "4762874c945945c38d820cce29fbb66e"
+    },
+    {
+      "id": "e79e1011-2eb4-486f-84c3-99d2a4aef88d",
+      "name": "amphora-a34dc4b7-b608-4a9d-9fbd-2a4e611475c2",
+      "operating_status": "ERROR",
+      "provisioning_status": "ACTIVE",
+      "admin_state_up": true,
+      "address": "172.24.4.50",
+      "protocol_port": 5000,
+      "weight": 1,
+      "backup": false,
+      "subnet_id": "8c23566f-624d-4b78-8056-14a9c193cf24",
+      "project_id": "4762874c945945c38d820cce29fbb66e",
+      "created_at": "2023-04-20T14:03:21",
+      "updated_at": "2023-04-20T14:03:53",
+      "monitor_address": null,
+      "monitor_port": null,
+      "tags": [],
+      "tenant_id": "4762874c945945c38d820cce29fbb66e"
+    }
+  ],
+  "members_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..2a573fcbbdf1f
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,47 @@
+{
+  "pools": [
+    {
+      "id": "d0335b34-3115-4b3b-9a1a-7e2363ebfee3",
+      "name": "pool-1",
+      "description": "",
+      "provisioning_status": "ACTIVE",
+      "operating_status": "ERROR",
+      "admin_state_up": true,
+      "protocol": "HTTP",
+      "lb_algorithm": "ROUND_ROBIN",
+      "session_persistence": null,
+      "project_id": "4762874c945945c38d820cce29fbb66e",
+      "loadbalancers": [
+        {
+          "id": "4bb7bfb1-83c2-45e8-b0e1-ed3022329115"
+        }
+      ],
+      "listeners": [
+        {
+          "id": "de81cbdc-8207-4253-8f21-3eea9870e7a9"
+        }
+      ],
+      "created_at": "2023-04-18T15:03:03",
+      "updated_at": "2023-04-20T14:03:52",
+      "healthmonitor_id": "268883b7-c057-4e85-b2c5-d8760267dad1",
+      "members": [
+        {
+          "id": "0abcafea-2ad2-44cd-957f-690644ba479c"
+        },
+        {
+          "id": "e79e1011-2eb4-486f-84c3-99d2a4aef88d"
+        }
+      ],
+      "tags": [],
+      "tls_container_ref": null,
+      "ca_tls_container_ref": null,
+      "crl_container_ref": null,
+      "tls_enabled": false,
+      "tls_ciphers": null,
+      "tls_versions": null,
+      "alpn_protocols": null,
+      "tenant_id": "4762874c945945c38d820cce29fbb66e"
+    }
+  ],
+  "pools_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/project_id=6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..78495dda34fa4
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/pools/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,4 @@
+{
+  "pools": [],
+  "pools_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/quotas/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/quotas/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..620d544ceeafd
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/quotas/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,18 @@
+{
+  "quotas": [
+    {
+      "project_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "loadbalancer": 10,
+      "load_balancer": 10,
+      "listener": 20,
+      "member": null,
+      "pool": 20,
+      "healthmonitor": 10,
+      "health_monitor": 10,
+      "l7policy": null,
+      "l7rule": null,
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15"
+    }
+  ],
+  "quotas_links": []
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/quotas/project_id=6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/quotas/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..7baf2d68ff280
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/lbaas/quotas/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,18 @@
+{
+  "quotas": [
+    {
+      "project_id": "6e39099cccde4f809b003d9e0dd09304",
+      "loadbalancer": null,
+      "load_balancer": null,
+      "listener": null,
+      "member": null,
+      "pool": null,
+      "healthmonitor": null,
+      "health_monitor": null,
+      "l7policy": null,
+      "l7rule": null,
+      "tenant_id": "6e39099cccde4f809b003d9e0dd09304"
+    }
+  ],
+  "quotas_links": []
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/042bcca4-4d97-47a9-bc04-d88c1e3a4d72/stats/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/042bcca4-4d97-47a9-bc04-d88c1e3a4d72/stats/response.json
new file mode 100644
index 0000000000000..96a6cbf3ec6cf
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/042bcca4-4d97-47a9-bc04-d88c1e3a4d72/stats/response.json
@@ -0,0 +1,14 @@
+{
+  "amphora_stats": [
+    {
+      "active_connections": 0,
+      "bytes_in": 0,
+      "bytes_out": 0,
+      "id": "042bcca4-4d97-47a9-bc04-d88c1e3a4d72",
+      "listener_id": "243decd9-3370-4fc1-b163-80c4155bda04",
+      "loadbalancer_id": "ae54877c-b186-4b90-b71c-d331b9e732bc",
+      "request_errors": 0,
+      "total_connections": 0
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/a34dc4b7-b608-4a9d-9fbd-2a4e611475c2/stats/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/a34dc4b7-b608-4a9d-9fbd-2a4e611475c2/stats/response.json
new file mode 100644
index 0000000000000..d81a7bba1359f
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/a34dc4b7-b608-4a9d-9fbd-2a4e611475c2/stats/response.json
@@ -0,0 +1,24 @@
+{
+  "amphora_stats": [
+    {
+      "active_connections": 0,
+      "bytes_in": 0,
+      "bytes_out": 0,
+      "id": "a34dc4b7-b608-4a9d-9fbd-2a4e611475c2",
+      "listener_id": "9da03992-77a4-4b65-b39a-0e106961f577",
+      "loadbalancer_id": "4bb7bfb1-83c2-45e8-b0e1-ed3022329115",
+      "request_errors": 0,
+      "total_connections": 0
+    },
+    {
+      "active_connections": 0,
+      "bytes_in": 0,
+      "bytes_out": 0,
+      "id": "a34dc4b7-b608-4a9d-9fbd-2a4e611475c2",
+      "listener_id": "de81cbdc-8207-4253-8f21-3eea9870e7a9",
+      "loadbalancer_id": "4bb7bfb1-83c2-45e8-b0e1-ed3022329115",
+      "request_errors": 0,
+      "total_connections": 0
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..4a6db6f68dc3a
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,49 @@
+{
+  "amphorae": [
+    {
+      "id": "a34dc4b7-b608-4a9d-9fbd-2a4e611475c2",
+      "loadbalancer_id": "4bb7bfb1-83c2-45e8-b0e1-ed3022329115",
+      "compute_id": "ace67097-e457-4044-b05c-be7ac830304a",
+      "lb_network_ip": "192.168.0.132",
+      "vrrp_ip": "172.24.4.50",
+      "ha_ip": "172.24.4.107",
+      "vrrp_port_id": "05b792b4-d027-4e55-aec1-337530cbec3e",
+      "ha_port_id": "c8d33b91-da2d-48e9-a807-04e972e838a1",
+      "cert_expiration": "2023-05-18T14:55:51",
+      "cert_busy": false,
+      "role": "STANDALONE",
+      "status": "ALLOCATED",
+      "vrrp_interface": null,
+      "vrrp_id": 1,
+      "vrrp_priority": null,
+      "cached_zone": "nova",
+      "created_at": "2023-04-18T14:55:51",
+      "updated_at": "2023-04-18T15:01:17",
+      "image_id": "5d8ea403-98e0-4009-a950-0b2b4cf7e938",
+      "compute_flavor": "auto"
+    },
+    {
+      "id": "042bcca4-4d97-47a9-bc04-d88c1e3a4d72",
+      "loadbalancer_id": "ae54877c-b186-4b90-b71c-d331b9e732bc",
+      "compute_id": "dbca52f7-da8b-4c24-aacd-9a62e5c45ab0",
+      "lb_network_ip": "192.168.0.84",
+      "vrrp_ip": "172.24.4.82",
+      "ha_ip": "172.24.4.251",
+      "vrrp_port_id": "4d8a5bf5-211c-464a-a97c-eb30a0bb3879",
+      "ha_port_id": "cf39978a-068e-4f9f-a797-dbbf2dfa0e59",
+      "cert_expiration": "2023-05-20T13:57:35",
+      "cert_busy": false,
+      "role": "STANDALONE",
+      "status": "ALLOCATED",
+      "vrrp_interface": null,
+      "vrrp_id": 1,
+      "vrrp_priority": null,
+      "cached_zone": "nova",
+      "created_at": "2023-04-20T13:57:35",
+      "updated_at": "2023-04-20T14:02:35",
+      "image_id": "5d8ea403-98e0-4009-a950-0b2b4cf7e938",
+      "compute_flavor": "auto"
+    }
+  ],
+  "amphorae_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/project_id=6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..8572e75493da0
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/load-balancer/v2/octavia/amphorae/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,4 @@
+{
+  "amphorae": [],
+  "amphorae_links": []
+}
diff --git a/openstack_controller/tests/fixtures/GET/networking/response.json b/openstack_controller/tests/fixtures/GET/networking/response.json
new file mode 100644
index 0000000000000..6dac79663e55c
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/networking/response.json
@@ -0,0 +1,14 @@
+{
+  "versions": [
+    {
+      "id": "v2.0",
+      "status": "CURRENT",
+      "links": [
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145:9696/networking/v2.0/"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/networking/v2.0/agents/response.json b/openstack_controller/tests/fixtures/GET/networking/v2.0/agents/response.json
new file mode 100644
index 0000000000000..35b8f564753fe
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/networking/v2.0/agents/response.json
@@ -0,0 +1,36 @@
+{
+  "agents": [
+    {
+      "binary": "neutron-ovn-metadata-agent",
+      "host": "agent-integrations-openstack-default",
+      "heartbeat_timestamp": "2023-04-20 07:16:23",
+      "availability_zone": "",
+      "topic": "n/a",
+      "description": "",
+      "configurations": {
+        "chassis_name": "203083d6-ddae-4023-aa83-ab679c9f4d2d",
+        "bridge-mappings": "public:br-ex"
+      },
+      "agent_type": "OVN Metadata agent",
+      "id": "2f4eba9c-8c8a-5836-b0d7-85d6eb176f20",
+      "alive": true,
+      "admin_state_up": true
+    },
+    {
+      "binary": "ovn-controller",
+      "host": "agent-integrations-openstack-default",
+      "heartbeat_timestamp": "2023-04-20 07:16:23",
+      "availability_zone": "",
+      "topic": "n/a",
+      "description": "",
+      "configurations": {
+        "chassis_name": "203083d6-ddae-4023-aa83-ab679c9f4d2d",
+        "bridge-mappings": "public:br-ex"
+      },
+      "agent_type": "OVN Controller Gateway agent",
+      "id": "203083d6-ddae-4023-aa83-ab679c9f4d2d",
+      "alive": true,
+      "admin_state_up": true
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/GET/networking/v2.0/networks/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/networking/v2.0/networks/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..c6a9d8aa004a0
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/networking/v2.0/networks/project_id=1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,60 @@
+{
+  "networks": [
+    {
+      "id": "ec38babc-37e8-4bd7-9de0-03009304b2e4",
+      "name": "public",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "admin_state_up": true,
+      "mtu": 1500,
+      "status": "ACTIVE",
+      "subnets": [
+        "87f452cc-8322-44ed-8a0c-579efa00114c",
+        "f7343529-4996-4d4d-b48f-312cb743d738"
+      ],
+      "shared": false,
+      "availability_zone_hints": [],
+      "availability_zones": [],
+      "ipv4_address_scope": null,
+      "ipv6_address_scope": null,
+      "router:external": true,
+      "description": "",
+      "port_security_enabled": true,
+      "is_default": true,
+      "tags": [],
+      "created_at": "2023-09-02T11:22:16Z",
+      "updated_at": "2023-09-02T11:22:33Z",
+      "revision_number": 3,
+      "project_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "provider:network_type": "flat",
+      "provider:physical_network": "public",
+      "provider:segmentation_id": null
+    },
+    {
+      "id": "f7b6adc8-24ea-490c-9537-5c4eae015cd8",
+      "name": "shared",
+      "tenant_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "admin_state_up": true,
+      "mtu": 1442,
+      "status": "ACTIVE",
+      "subnets": [
+        "ccf22df8-42e2-4fc3-ab90-3fa488b5ce63"
+      ],
+      "shared": true,
+      "availability_zone_hints": [],
+      "availability_zones": [],
+      "ipv4_address_scope": null,
+      "ipv6_address_scope": null,
+      "router:external": false,
+      "description": "",
+      "port_security_enabled": true,
+      "tags": [],
+      "created_at": "2023-09-02T11:24:29Z",
+      "updated_at": "2023-09-02T11:24:31Z",
+      "revision_number": 2,
+      "project_id": "1e6e233e637d4d55a50a62b63398ad15",
+      "provider:network_type": "geneve",
+      "provider:physical_network": null,
+      "provider:segmentation_id": 52304
+    }
+  ]
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/GET/networking/v2.0/networks/project_id=6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/networking/v2.0/networks/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..2c3cfc541e33d
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/networking/v2.0/networks/project_id=6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,32 @@
+{
+  "networks": [
+    {
+      "id": "ebdfddd9-14b8-46bd-98d6-10205d13038c",
+      "name": "private",
+      "tenant_id": "6e39099cccde4f809b003d9e0dd09304",
+      "admin_state_up": true,
+      "mtu": 1442,
+      "status": "ACTIVE",
+      "subnets": [
+        "bc959cd1-c0c6-4c55-8c49-f958ad0a9013",
+        "eaedbccc-a393-4e97-a69a-d0643abca64e"
+      ],
+      "shared": false,
+      "availability_zone_hints": [],
+      "availability_zones": [],
+      "ipv4_address_scope": null,
+      "ipv6_address_scope": null,
+      "router:external": false,
+      "description": "",
+      "port_security_enabled": true,
+      "tags": [],
+      "created_at": "2023-09-02T11:22:00Z",
+      "updated_at": "2023-09-02T11:22:06Z",
+      "revision_number": 3,
+      "project_id": "6e39099cccde4f809b003d9e0dd09304",
+      "provider:network_type": "geneve",
+      "provider:physical_network": null,
+      "provider:segmentation_id": 54733
+    }
+  ]
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/GET/networking/v2.0/quotas/1e6e233e637d4d55a50a62b63398ad15/response.json b/openstack_controller/tests/fixtures/GET/networking/v2.0/quotas/1e6e233e637d4d55a50a62b63398ad15/response.json
new file mode 100644
index 0000000000000..d7edcf2e33005
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/networking/v2.0/quotas/1e6e233e637d4d55a50a62b63398ad15/response.json
@@ -0,0 +1,13 @@
+{
+  "quota": {
+    "network": 100,
+    "subnet": 100,
+    "subnetpool": -1,
+    "port": 500,
+    "router": 10,
+    "floatingip": 50,
+    "rbac_policy": 10,
+    "security_group": 10,
+    "security_group_rule": 100
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/networking/v2.0/quotas/6e39099cccde4f809b003d9e0dd09304/response.json b/openstack_controller/tests/fixtures/GET/networking/v2.0/quotas/6e39099cccde4f809b003d9e0dd09304/response.json
new file mode 100644
index 0000000000000..d7edcf2e33005
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/networking/v2.0/quotas/6e39099cccde4f809b003d9e0dd09304/response.json
@@ -0,0 +1,13 @@
+{
+  "quota": {
+    "network": 100,
+    "subnet": 100,
+    "subnetpool": -1,
+    "port": 500,
+    "router": 10,
+    "floatingip": 50,
+    "rbac_policy": 10,
+    "security_group": 10,
+    "security_group_rule": 100
+  }
+}
diff --git a/openstack_controller/tests/fixtures/GET/volume/v3/.slash b/openstack_controller/tests/fixtures/GET/volume/v3/.slash
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/openstack_controller/tests/fixtures/GET/volume/v3/response.json b/openstack_controller/tests/fixtures/GET/volume/v3/response.json
new file mode 100644
index 0000000000000..a2c579bde018f
--- /dev/null
+++ b/openstack_controller/tests/fixtures/GET/volume/v3/response.json
@@ -0,0 +1,28 @@
+{
+  "versions": [
+    {
+      "id": "v3.0",
+      "status": "CURRENT",
+      "version": "3.70",
+      "min_version": "3.0",
+      "updated": "2022-08-31T00:00:00Z",
+      "links": [
+        {
+          "rel": "describedby",
+          "type": "text/html",
+          "href": "https://docs.openstack.org/"
+        },
+        {
+          "rel": "self",
+          "href": "http://34.91.114.145/volume/v3/"
+        }
+      ],
+      "media-types": [
+        {
+          "base": "application/json",
+          "type": "application/vnd.openstack.volume+json;version=3"
+        }
+      ]
+    }
+  ]
+}
diff --git a/openstack_controller/tests/fixtures/POST/identity/v3/auth/tokens/1e6e233e637d4d55a50a62b63398ad15.json b/openstack_controller/tests/fixtures/POST/identity/v3/auth/tokens/1e6e233e637d4d55a50a62b63398ad15.json
new file mode 100644
index 0000000000000..fb8a2b3443f15
--- /dev/null
+++ b/openstack_controller/tests/fixtures/POST/identity/v3/auth/tokens/1e6e233e637d4d55a50a62b63398ad15.json
@@ -0,0 +1,186 @@
+{
+  "token": {
+    "methods": [
+      "password"
+    ],
+    "user": {
+      "domain": {
+        "id": "default",
+        "name": "Default"
+      },
+      "id": "78205c506b534738bc851d3e189a00c3",
+      "name": "admin",
+      "password_expires_at": null
+    },
+    "audit_ids": [
+      "wV77SSj3R_eYf2UF6kMJ9A"
+    ],
+    "expires_at": "2023-04-21T13:18:33.000000Z",
+    "issued_at": "2023-04-21T12:18:33.000000Z",
+    "project": {
+      "domain": {
+        "id": "default",
+        "name": "Default"
+      },
+      "id": "1e6e233e637d4d55a50a62b63398ad15",
+      "name": "demo"
+    },
+    "is_domain": false,
+    "roles": [
+      {
+        "id": "7ccf33ede2224c79b2593a67cfcd8f26",
+        "name": "reader"
+      },
+      {
+        "id": "e7a17189523f43909a93316a8b006f17",
+        "name": "admin"
+      },
+      {
+        "id": "3305e6f8eb664efd80611df34ab2fd53",
+        "name": "member"
+      }
+    ],
+    "catalog": [
+      {
+        "endpoints": [
+          {
+            "id": "658ae4230da74d0d91c6dc6defa65b78",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://10.164.0.11/placement",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "155d28a57a054d5fae86410b566ffca1",
+        "type": "placement",
+        "name": "placement"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "debb3264d4d848bc938dfcd60dd88526",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:8774/compute/v2/1e6e233e637d4d55a50a62b63398ad15",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "17d8088bf93b41b19ae971eb6f2aa7a5",
+        "type": "compute_legacy",
+        "name": "nova_legacy"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "7e4c8d8ffb954d38be184d05ed1de624",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:8080/identity",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "271afc4cc62e493592b6be9b87bfb108",
+        "type": "identity",
+        "name": "keystone"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "ee9f0d215b414339935c1b60caddb179",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:8776/volume/v3/1e6e233e637d4d55a50a62b63398ad15",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "3ef836a26c2c40acabb07a6415384f20",
+        "type": "volumev3",
+        "name": "cinderv3"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "407107c9ed614c1db506ff519e0bb5c5",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:8776/volume/v3/1e6e233e637d4d55a50a62b63398ad15",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "55b21161725a461793a2222749229306",
+        "type": "block-storage",
+        "name": "cinder"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "b07762182a06438b8aa03a71e52c232c",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:9696/networking",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "7dca0a2e55d74d66995f3105ed69608f",
+        "type": "network",
+        "name": "neutron"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "b8af839f440c4603ae2189173ffc8786",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://10.164.0.11/image",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "82624ab61fb04f058d043facf315fa3c",
+        "type": "image",
+        "name": "glance"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "42fa91d5ea1848bcac0f04e7958d016f",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:8774/compute/v2.1",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "9aca42df11e84366924013b2f1a1259b",
+        "type": "compute",
+        "name": "nova"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "61b7b2b0e5794548892ef59330710afd",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:6385/baremetal",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "9756483c52864bbc8bbda7549737fe09",
+        "type": "baremetal",
+        "name": "ironic"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "e3cf892a48ff48738025aba7f3b50879",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:9876/load-balancer",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "953e317ff87c4da980fd8ececa569559",
+        "type": "load-balancer",
+        "name": "octavia"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/POST/identity/v3/auth/tokens/6e39099cccde4f809b003d9e0dd09304.json b/openstack_controller/tests/fixtures/POST/identity/v3/auth/tokens/6e39099cccde4f809b003d9e0dd09304.json
new file mode 100644
index 0000000000000..25f86aed7f259
--- /dev/null
+++ b/openstack_controller/tests/fixtures/POST/identity/v3/auth/tokens/6e39099cccde4f809b003d9e0dd09304.json
@@ -0,0 +1,194 @@
+{
+  "token": {
+    "methods": [
+      "password"
+    ],
+    "user": {
+      "domain": {
+        "id": "default",
+        "name": "Default"
+      },
+      "id": "78205c506b534738bc851d3e189a00c3",
+      "name": "admin",
+      "password_expires_at": null
+    },
+    "audit_ids": [
+      "aYBT-QLsTGyEITuk42WzJg"
+    ],
+    "expires_at": "2023-04-21T13:18:35.000000Z",
+    "issued_at": "2023-04-21T12:18:35.000000Z",
+    "project": {
+      "domain": {
+        "id": "default",
+        "name": "Default"
+      },
+      "id": "6e39099cccde4f809b003d9e0dd09304",
+      "name": "admin"
+    },
+    "is_domain": false,
+    "roles": [
+      {
+        "id": "1df2b751094e4337bb0545c93eef445d",
+        "name": "service"
+      },
+      {
+        "id": "5c90d9c6535d423aaf91af4db9f0d86a",
+        "name": "ResellerAdmin"
+      },
+      {
+        "id": "e7a17189523f43909a93316a8b006f17",
+        "name": "admin"
+      },
+      {
+        "id": "7ccf33ede2224c79b2593a67cfcd8f26",
+        "name": "reader"
+      },
+      {
+        "id": "3305e6f8eb664efd80611df34ab2fd53",
+        "name": "member"
+      }
+    ],
+    "catalog": [
+      {
+        "endpoints": [
+          {
+            "id": "658ae4230da74d0d91c6dc6defa65b78",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://10.164.0.11/placement",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "155d28a57a054d5fae86410b566ffca1",
+        "type": "placement",
+        "name": "placement"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "debb3264d4d848bc938dfcd60dd88526",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:8774/compute/v2/6e39099cccde4f809b003d9e0dd09304",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "17d8088bf93b41b19ae971eb6f2aa7a5",
+        "type": "compute_legacy",
+        "name": "nova_legacy"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "7e4c8d8ffb954d38be184d05ed1de624",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:8080/identity",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "271afc4cc62e493592b6be9b87bfb108",
+        "type": "identity",
+        "name": "keystone"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "ee9f0d215b414339935c1b60caddb179",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:8776/volume/v3/6e39099cccde4f809b003d9e0dd09304",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "3ef836a26c2c40acabb07a6415384f20",
+        "type": "volumev3",
+        "name": "cinderv3"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "407107c9ed614c1db506ff519e0bb5c5",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:8776/volume/v3/6e39099cccde4f809b003d9e0dd09304",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "55b21161725a461793a2222749229306",
+        "type": "block-storage",
+        "name": "cinder"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "b07762182a06438b8aa03a71e52c232c",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:9696/networking",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "7dca0a2e55d74d66995f3105ed69608f",
+        "type": "network",
+        "name": "neutron"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "b8af839f440c4603ae2189173ffc8786",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://10.164.0.11/image",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "82624ab61fb04f058d043facf315fa3c",
+        "type": "image",
+        "name": "glance"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "42fa91d5ea1848bcac0f04e7958d016f",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:8774/compute/v2.1",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "9aca42df11e84366924013b2f1a1259b",
+        "type": "compute",
+        "name": "nova"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "61b7b2b0e5794548892ef59330710afd",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:6385/baremetal",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "9756483c52864bbc8bbda7549737fe09",
+        "type": "baremetal",
+        "name": "ironic"
+      },
+      {
+        "endpoints": [
+          {
+            "id": "e3cf892a48ff48738025aba7f3b50879",
+            "interface": "public",
+            "region_id": "RegionOne",
+            "url": "http://127.0.0.1:9876/load-balancer",
+            "region": "RegionOne"
+          }
+        ],
+        "id": "953e317ff87c4da980fd8ececa569559",
+        "type": "load-balancer",
+        "name": "octavia"
+      }
+    ]
+  }
+}
diff --git a/openstack_controller/tests/fixtures/POST/identity/v3/auth/tokens/unscoped.json b/openstack_controller/tests/fixtures/POST/identity/v3/auth/tokens/unscoped.json
new file mode 100644
index 0000000000000..7dba2cae523d2
--- /dev/null
+++ b/openstack_controller/tests/fixtures/POST/identity/v3/auth/tokens/unscoped.json
@@ -0,0 +1,21 @@
+{
+  "token": {
+    "methods": [
+      "password"
+    ],
+    "user": {
+      "domain": {
+        "id": "default",
+        "name": "Default"
+      },
+      "id": "78205c506b534738bc851d3e189a00c3",
+      "name": "admin",
+      "password_expires_at": null
+    },
+    "audit_ids": [
+      "0UMsPjp9TIuNt4lnsq2ZQQ"
+    ],
+    "expires_at": "2023-04-21T13:18:30.000000Z",
+    "issued_at": "2023-04-21T12:18:30.000000Z"
+  }
+}
diff --git a/openstack_controller/tests/README.md b/openstack_controller/tests/legacy/README.md
similarity index 95%
rename from openstack_controller/tests/README.md
rename to openstack_controller/tests/legacy/README.md
index 20d6b4f727cd1..1b7d9d78668b5 100644
--- a/openstack_controller/tests/README.md
+++ b/openstack_controller/tests/legacy/README.md
@@ -1,4 +1,4 @@
-# Teradata Integration E2E
+# Openstack Controller Integration E2E
 
 The Openstack_controller integration includes three E2E environments:
 
diff --git a/openstack_controller/tests/legacy/__init__.py b/openstack_controller/tests/legacy/__init__.py
new file mode 100644
index 0000000000000..e0cc3d0a7662c
--- /dev/null
+++ b/openstack_controller/tests/legacy/__init__.py
@@ -0,0 +1,3 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
diff --git a/openstack_controller/tests/legacy/common.py b/openstack_controller/tests/legacy/common.py
new file mode 100644
index 0000000000000..ad82d1dc7dec6
--- /dev/null
+++ b/openstack_controller/tests/legacy/common.py
@@ -0,0 +1,388 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+import datetime
+import os
+
+CHECK_NAME = 'openstack'
+
+FIXTURES_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'fixtures')
+TEST_OPENSTACK_CONFIG_PATH = os.path.join(FIXTURES_DIR, 'openstack_config.yaml')
+TEST_OPENSTACK_NO_AUTH_CONFIG_PATH = os.path.join(FIXTURES_DIR, 'openstack_bad_config.yaml')
+
+USE_OPENSTACK_SANDBOX = os.environ.get('USE_OPENSTACK_SANDBOX')
+
+ALL_IDS = ['server-1', 'server-2', 'other-1', 'other-2']
+EXCLUDED_NETWORK_IDS = ['server-1', 'other-.*']
+EXCLUDED_SERVER_IDS = ['server-2', 'other-.*']
+FILTERED_NETWORK_ID = 'server-2'
+FILTERED_SERVER_ID = 'server-1'
+FILTERED_BY_PROJ_SERVER_ID = ['server-1', 'server-2']
+
+CONFIG_FILE_INSTANCE = {
+    'name': 'test_name',
+    'user': {'name': 'test_name', 'password': 'test_pass', 'domain': {'id': 'test_id'}},
+    'ssl_verify': False,
+    'exclude_network_ids': EXCLUDED_NETWORK_IDS,
+    'openstack_config_file_path': TEST_OPENSTACK_CONFIG_PATH,
+    'openstack_cloud_name': 'test_cloud',
+}
+
+KEYSTONE_INSTANCE = {
+    'name': 'test_name',
+    'keystone_server_url': 'http://10.0.2.15:5000',
+    'user': {'name': 'test_name', 'password': 'test_pass', 'domain': {'id': 'test_id'}},
+    'ssl_verify': False,
+    'exclude_network_ids': EXCLUDED_NETWORK_IDS,
+}
+
+MOCK_CONFIG = {'init_config': {}, 'instances': [KEYSTONE_INSTANCE]}
+
+EXAMPLE_AUTH_RESPONSE = {
+    u'token': {
+        u'methods': [u'password'],
+        u'roles': [
+            {u'id': u'f20c215f5a4d47b7a6e510bc65485ced', u'name': u'datadog_monitoring'},
+            {u'id': u'9fe2ff9ee4384b1894a90878d3e92bab', u'name': u'_member_'},
+        ],
+        u'expires_at': u'2015-11-02T15: 57: 43.911674Z',
+        u'project': {
+            u'domain': {u'id': u'default', u'name': u'Default'},
+            u'id': u'0850707581fe4d738221a72db0182876',
+            u'name': u'admin',
+        },
+        u'catalog': [
+            {
+                u'endpoints': [
+                    {
+                        u'url': u'http://10.0.2.15:8774/v2.1/0850707581fe4d738221a72db0182876',
+                        u'interface': u'internal',
+                        u'region': u'RegionOne',
+                        u'region_id': u'RegionOne',
+                        u'id': u'354e35ed19774e398f80dc2a90d07f4b',
+                    },
+                    {
+                        u'url': u'http://10.0.2.15:8774/v2.1/0850707581fe4d738221a72db0182876',
+                        u'interface': u'public',
+                        u'region': u'RegionOne',
+                        u'region_id': u'RegionOne',
+                        u'id': u'36e8e2bf24384105b9d56a65b0900172',
+                    },
+                    {
+                        u'url': u'http://10.0.2.15:8774/v2.1/0850707581fe4d738221a72db0182876',
+                        u'interface': u'admin',
+                        u'region': u'RegionOne',
+                        u'region_id': u'RegionOne',
+                        u'id': u'de93edcbf7f9446286687ec68423c36f',
+                    },
+                ],
+                u'type': u'compute',
+                u'id': u'2023bd4f451849ba8abeaaf283cdde4f',
+                u'name': u'nova',
+            },
+            {
+                u'endpoints': [
+                    {
+                        u'url': u'http://10.0.3.111:8776/v1/***************************4bfc1',
+                        u'interface': u'public',
+                        u'region': u'RegionOne',
+                        u'region_id': u'RegionOne',
+                        u'id': u'***************************2452f',
+                    },
+                    {
+                        u'url': u'http://10.0.2.15:8776/v1/***************************4bfc1',
+                        u'interface': u'admin',
+                        u'region': u'RegionOne',
+                        u'region_id': u'RegionOne',
+                        u'id': u'***************************8239f',
+                    },
+                    {
+                        u'url': u'http://10.0.2.15:8776/v1/***************************4bfc1',
+                        u'interface': u'internal',
+                        u'region': u'RegionOne',
+                        u'region_id': u'RegionOne',
+                        u'id': u'***************************7caa1',
+                    },
+                ],
+                u'type': u'volume',
+                u'id': u'***************************e7e16',
+                u'name': u'cinder',
+            },
+            {
+                u'endpoints': [
+                    {
+                        u'url': u'http://10.0.2.15:9292',
+                        u'interface': u'internal',
+                        u'region': u'RegionOne',
+                        u'region_id': u'RegionOne',
+                        u'id': u'7c1e318d8f7f42029fcb591598df2ef5',
+                    },
+                    {
+                        u'url': u'http://10.0.2.15:9292',
+                        u'interface': u'public',
+                        u'region': u'RegionOne',
+                        u'region_id': u'RegionOne',
+                        u'id': u'afcc88b1572f48a38bb393305dc2b584',
+                    },
+                    {
+                        u'url': u'http://10.0.2.15:9292',
+                        u'interface': u'admin',
+                        u'region': u'RegionOne',
+                        u'region_id': u'RegionOne',
+                        u'id': u'd9730dbdc07844d785913219da64a197',
+                    },
+                ],
+                u'type': u'network',
+                u'id': u'21ad241f26194bccb7d2e49ee033d5a2',
+                u'name': u'neutron',
+            },
+        ],
+        u'extras': {},
+        u'user': {
+            u'domain': {u'id': u'default', u'name': u'Default'},
+            u'id': u'5f10e63fbd6b411186e561dc62a9a675',
+            u'name': u'datadog',
+        },
+        u'audit_ids': [u'OMQQg9g3QmmxRHwKrfWxyQ'],
+        u'issued_at': u'2015-11-02T14: 57: 43.911697Z',
+    }
+}
+
+EXAMPLE_PROJECTS_RESPONSE = {
+    "projects": [
+        {
+            "domain_id": "1789d1",
+            "enabled": True,
+            "id": "263fd9",
+            "links": {"self": "https://example.com/identity/v3/projects/263fd9"},
+            "name": "Test Group",
+        }
+    ],
+    "links": {"self": "https://example.com/identity/v3/auth/projects", "previous": None, "next": None},
+}
+
+# .. server/network
+SERVERS_CACHE_MOCK = {
+    'servers': {
+        "server-1": {"id": "server-1", "name": "server-name-1", "status": "ACTIVE", "project_name": "testproj"},
+        "server-2": {"id": "server-2", "name": "server-name-2", "status": "ACTIVE", "project_name": "testproj"},
+        "other-1": {"id": "other-1", "name": "server-name-other-1", "status": "ACTIVE", "project_name": "blacklist_1"},
+        "other-2": {"id": "other-2", "name": "server-name-other-2", "status": "ACTIVE", "project_name": "blacklist_2"},
+    },
+    'change_since': datetime.datetime.utcnow().isoformat(),
+}
+
+EMPTY_NOVA_SERVERS = []
+
+# One example from MOCK_NOVA_SERVERS to emulate pagination
+MOCK_NOVA_SERVERS_PAGINATED = [
+    {
+        "OS-DCF:diskConfig": "AUTO",
+        "OS-EXT-AZ:availability_zone": "nova",
+        "OS-EXT-SRV-ATTR:host": "compute",
+        "OS-EXT-SRV-ATTR:hostname": "server-1",
+        "OS-EXT-SRV-ATTR:hypervisor_hostname": "fake-mini",
+        "OS-EXT-SRV-ATTR:instance_name": "instance-00000001",
+        "OS-EXT-SRV-ATTR:kernel_id": "",
+        "OS-EXT-SRV-ATTR:launch_index": 0,
+        "OS-EXT-SRV-ATTR:ramdisk_id": "",
+        "OS-EXT-SRV-ATTR:reservation_id": "r-iffothgx",
+        "OS-EXT-SRV-ATTR:root_device_name": "/dev/sda",
+        "OS-EXT-SRV-ATTR:user_data": "IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg==",
+        "OS-EXT-STS:power_state": 1,
+        "OS-EXT-STS:task_state": 'null',
+        "OS-EXT-STS:vm_state": "active",
+        "OS-SRV-USG:launched_at": "2017-02-14T19:24:43.891568",
+        "OS-SRV-USG:terminated_at": 'null',
+        "accessIPv4": "1.2.3.4",
+        "accessIPv6": "80fe::",
+        "hostId": "2091634baaccdc4c5a1d57069c833e402921df696b7f970791b12ec6",
+        "host_status": "UP",
+        "id": "server-1",
+        "metadata": {"My Server Name": "Apache1"},
+        "name": "new-server-test",
+        "status": "ACTIVE",
+        "tags": [],
+        "tenant_id": "6f70656e737461636b20342065766572",
+        "updated": "2017-02-14T19:24:43Z",
+        "user_id": "fake",
+    }
+]
+
+# Example response from - https://developer.openstack.org/api-ref/compute/#list-servers-detailed
+# ID and server-name values have been changed for test readability
+MOCK_NOVA_SERVERS = [
+    {
+        "OS-DCF:diskConfig": "AUTO",
+        "OS-EXT-AZ:availability_zone": "nova",
+        "OS-EXT-SRV-ATTR:host": "compute",
+        "OS-EXT-SRV-ATTR:hostname": "server-1",
+        "OS-EXT-SRV-ATTR:hypervisor_hostname": "fake-mini",
+        "OS-EXT-SRV-ATTR:instance_name": "instance-00000001",
+        "OS-EXT-SRV-ATTR:kernel_id": "",
+        "OS-EXT-SRV-ATTR:launch_index": 0,
+        "OS-EXT-SRV-ATTR:ramdisk_id": "",
+        "OS-EXT-SRV-ATTR:reservation_id": "r-iffothgx",
+        "OS-EXT-SRV-ATTR:root_device_name": "/dev/sda",
+        "OS-EXT-SRV-ATTR:user_data": "IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg==",
+        "OS-EXT-STS:power_state": 1,
+        "OS-EXT-STS:task_state": 'null',
+        "OS-EXT-STS:vm_state": "active",
+        "OS-SRV-USG:launched_at": "2017-02-14T19:24:43.891568",
+        "OS-SRV-USG:terminated_at": 'null',
+        "accessIPv4": "1.2.3.4",
+        "accessIPv6": "80fe::",
+        "hostId": "2091634baaccdc4c5a1d57069c833e402921df696b7f970791b12ec6",
+        "host_status": "UP",
+        "id": "server-1",
+        "metadata": {"My Server Name": "Apache1"},
+        "name": "new-server-test",
+        "status": "DELETED",
+        "tags": [],
+        "tenant_id": "6f70656e737461636b20342065766572",
+        "updated": "2017-02-14T19:24:43Z",
+        "user_id": "fake",
+    },
+    {
+        "OS-DCF:diskConfig": "AUTO",
+        "OS-EXT-AZ:availability_zone": "nova",
+        "OS-EXT-SRV-ATTR:host": "compute",
+        "OS-EXT-SRV-ATTR:hostname": "server-2",
+        "OS-EXT-SRV-ATTR:hypervisor_hostname": "fake-mini",
+        "OS-EXT-SRV-ATTR:instance_name": "instance-00000001",
+        "OS-EXT-SRV-ATTR:kernel_id": "",
+        "OS-EXT-SRV-ATTR:launch_index": 0,
+        "OS-EXT-SRV-ATTR:ramdisk_id": "",
+        "OS-EXT-SRV-ATTR:reservation_id": "r-iffothgx",
+        "OS-EXT-SRV-ATTR:root_device_name": "/dev/sda",
+        "OS-EXT-SRV-ATTR:user_data": "IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg==",
+        "OS-EXT-STS:power_state": 1,
+        "OS-EXT-STS:task_state": 'null',
+        "OS-EXT-STS:vm_state": "active",
+        "OS-SRV-USG:launched_at": "2017-02-14T19:24:43.891568",
+        "OS-SRV-USG:terminated_at": 'null',
+        "accessIPv4": "1.2.3.4",
+        "accessIPv6": "80fe::",
+        "hostId": "2091634baaccdc4c5a1d57069c833e402921df696b7f970791b12ec6",
+        "host_status": "UP",
+        "id": "server_newly_added",
+        "metadata": {"My Server Name": "Apache1"},
+        "name": "newly_added_server",
+        "status": "ACTIVE",
+        "tags": [],
+        "tenant_id": "6f70656e737461636b20342065766572",
+        "updated": "2017-02-14T19:24:43Z",
+        "user_id": "fake",
+    },
+]
+
+EXAMPLE_GET_FLAVORS_DETAIL_RETURN_VALUE = [
+    {'id': u'10', 'disk': 10, 'vcpus': 2, 'ram': 1024, 'OS-FLV-EXT-DATA:ephemeral': 0, 'swap': 0},
+    {
+        'id': u'625c2e4b-0a1f-4236-bb67-5ceee1a766e5',
+        'disk': 48,
+        'vcpus': 8,
+        'ram': 5934,
+        'OS-FLV-EXT-DATA:ephemeral': 0,
+        'swap': 0,
+    },
+]
+
+EXAMPLE_GET_OS_AGGREGATES_RETURN_VALUE = [{'hosts': ["compute"], 'name': "name", 'availability_zone': "london"}]
+
+EXAMPLE_GET_OS_HYPERVISORS_RETURN_VALUE = [
+    {
+        "cpu_info": {
+            "arch": "x86_64",
+            "model": "Nehalem",
+            "vendor": "Intel",
+            "features": ["pge", "clflush"],
+            "topology": {"cores": 1, "threads": 1, "sockets": 4},
+        },
+        "current_workload": 0,
+        "status": "enabled",
+        "state": "up",
+        "disk_available_least": 0,
+        "host_ip": "1.1.1.1",
+        "free_disk_gb": 1028,
+        "free_ram_mb": 7680,
+        "hypervisor_hostname": "host1",
+        "hypervisor_type": "fake",
+        "hypervisor_version": 1000,
+        "id": 2,
+        "local_gb": 1028,
+        "local_gb_used": 0,
+        "memory_mb": 8192,
+        "memory_mb_used": 512,
+        "running_vms": 0,
+        "service": {"host": "host1", "id": 7, "disabled_reason": None},
+        "vcpus": 2,
+        "vcpus_used": 0,
+    }
+]
+
+EXAMPLE_GET_PROJECT_LIMITS_RETURN_VALUE = {
+    "maxImageMeta": 128,
+    "maxPersonality": 5,
+    "maxPersonalitySize": 10240,
+    "maxSecurityGroupRules": 20,
+    "maxSecurityGroups": 10,
+    "maxServerMeta": 128,
+    "maxTotalCores": 20,
+    "maxTotalFloatingIps": 10,
+    "maxTotalInstances": 10,
+    "maxTotalKeypairs": 100,
+    "maxTotalRAMSize": 51200,
+    "maxServerGroups": 10,
+    "maxServerGroupMembers": 10,
+    "totalCoresUsed": 0,
+    "totalInstancesUsed": 0,
+    "totalRAMUsed": 0,
+    "totalSecurityGroupsUsed": 0,
+    "totalFloatingIpsUsed": 1,
+    "totalServerGroupsUsed": 0,
+}
+
+EXAMPLE_GET_NETWORKS_RETURN_VALUE = [
+    {
+        'id': u'2755452c-4fe8-4ba1-9b26-8898665b0958',
+        'name': u'net2',
+        'tenant_id': u'680031a39ce040e1b81289ea8c73fb11',
+        'admin_state_up': True,
+    }
+]
+
+DEFAULT_METRICS = [
+    'openstack.controller',
+    'openstack.nova.current_workload',
+    'openstack.nova.disk_available_least',
+    'openstack.nova.free_disk_gb',
+    'openstack.nova.free_ram_mb',
+    'openstack.nova.hypervisor_load.1',
+    'openstack.nova.hypervisor_load.15',
+    'openstack.nova.hypervisor_load.5',
+    'openstack.nova.limits.max_image_meta',
+    'openstack.nova.limits.max_personality',
+    'openstack.nova.limits.max_personality_size',
+    'openstack.nova.limits.max_security_group_rules',
+    'openstack.nova.limits.max_security_groups',
+    'openstack.nova.limits.max_server_meta',
+    'openstack.nova.limits.max_total_cores',
+    'openstack.nova.limits.max_total_floating_ips',
+    'openstack.nova.limits.max_total_instances',
+    'openstack.nova.limits.max_total_keypairs',
+    'openstack.nova.limits.max_total_ram_size',
+    'openstack.nova.limits.total_cores_used',
+    'openstack.nova.limits.total_floating_ips_used',
+    'openstack.nova.limits.total_instances_used',
+    'openstack.nova.limits.total_ram_used',
+    'openstack.nova.limits.total_security_groups_used',
+    'openstack.nova.local_gb',
+    'openstack.nova.local_gb_used',
+    'openstack.nova.memory_mb',
+    'openstack.nova.memory_mb_used',
+    'openstack.nova.running_vms',
+    'openstack.nova.vcpus',
+    'openstack.nova.vcpus_used',
+]
diff --git a/openstack_controller/tests/legacy/conftest.py b/openstack_controller/tests/legacy/conftest.py
new file mode 100644
index 0000000000000..c7c8d9dd3b161
--- /dev/null
+++ b/openstack_controller/tests/legacy/conftest.py
@@ -0,0 +1,68 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+import os
+
+import pytest
+
+from datadog_checks.base.utils.http import RequestsWrapper
+from datadog_checks.dev import docker_run
+from datadog_checks.dev.conditions import CheckDockerLogs
+from datadog_checks.dev.fs import get_here
+from datadog_checks.dev.ssh_tunnel import socks_proxy
+from datadog_checks.dev.terraform import terraform_run
+from datadog_checks.openstack_controller.legacy.openstack_controller_legacy import OpenStackControllerLegacyCheck
+from tests.legacy.common import CHECK_NAME, CONFIG_FILE_INSTANCE, USE_OPENSTACK_SANDBOX
+
+
+@pytest.fixture(scope='session')
+def dd_environment():
+    if USE_OPENSTACK_SANDBOX:
+        with terraform_run(os.path.join(get_here(), 'terraform')) as outputs:
+            ip = outputs['ip']['value']
+            internal_ip = outputs['internal_ip']['value']
+            private_key = outputs['ssh_private_key']['value']
+            instance = {
+                'name': 'test',
+                'keystone_server_url': 'http://{}/identity/v3'.format(internal_ip),
+                'user': {'name': 'admin', 'password': 'labstack', 'domain': {'id': 'default'}},
+                'ssl_verify': False,
+            }
+            with socks_proxy(ip, 'ubuntu', private_key) as socks:
+                print("socks: %s", socks)
+                socks_ip, socks_port = socks
+                agent_config = {'proxy': {'http': 'socks5://{}:{}'.format(socks_ip, socks_port)}}
+                yield instance, agent_config
+    else:
+        compose_file = os.path.join(get_here(), 'docker', 'docker-compose.yaml')
+        conditions = [
+            CheckDockerLogs(identifier='openstack-keystone', patterns=['server running']),
+            CheckDockerLogs(identifier='openstack-nova', patterns=['server running']),
+            CheckDockerLogs(identifier='openstack-neutron', patterns=['server running']),
+            CheckDockerLogs(identifier='openstack-ironic', patterns=['server running']),
+        ]
+        with docker_run(compose_file, conditions=conditions):
+            instance = {
+                'name': 'test',
+                'keystone_server_url': 'http://127.0.0.1:8080/identity/v3',
+                'user': {'name': 'admin', 'password': 'labstack', 'domain': {'id': 'default'}},
+                'ssl_verify': False,
+            }
+            yield instance
+
+
+@pytest.fixture
+def instance():
+    return CONFIG_FILE_INSTANCE
+
+
+@pytest.fixture
+def check(instance):
+    return OpenStackControllerLegacyCheck(CHECK_NAME, {}, [instance])
+
+
+@pytest.fixture
+def requests_wrapper():
+    instance = {'timeout': 10, 'ssl_verify': False}
+    yield RequestsWrapper(instance, {})
diff --git a/openstack_controller/tests/legacy/docker/docker-compose.yaml b/openstack_controller/tests/legacy/docker/docker-compose.yaml
new file mode 100644
index 0000000000000..72feede33cd11
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/docker-compose.yaml
@@ -0,0 +1,35 @@
+version: "3"
+
+services:
+  openstack-keystone:
+    image: caddy:2.6.2-alpine
+    container_name: openstack-keystone
+    volumes:
+      - ./fixtures/keystone:/usr/share/caddy
+      - ./etc/caddy/keystone:/etc/caddy/
+    ports:
+      - "8080:80"
+  openstack-nova:
+    image: caddy:2.6.2-alpine
+    container_name: openstack-nova
+    volumes:
+      - ./fixtures/nova:/usr/share/caddy
+      - ./etc/caddy/nova:/etc/caddy/
+    ports:
+      - "8774:80"
+  openstack-neutron:
+    image: caddy:2.6.2-alpine
+    container_name: openstack-neutron
+    volumes:
+      - ./fixtures/neutron:/usr/share/caddy
+      - ./etc/caddy/neutron:/etc/caddy/
+    ports:
+      - "9696:80"
+  openstack-ironic:
+    image: caddy:2.6.2-alpine
+    container_name: openstack-ironic
+    volumes:
+      - ./fixtures/ironic:/usr/share/caddy
+      - ./etc/caddy/ironic:/etc/caddy/
+    ports:
+      - "6385:80"
diff --git a/openstack_controller/tests/legacy/docker/etc/caddy/ironic/Caddyfile b/openstack_controller/tests/legacy/docker/etc/caddy/ironic/Caddyfile
new file mode 100644
index 0000000000000..504be62d1c753
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/etc/caddy/ironic/Caddyfile
@@ -0,0 +1,26 @@
+{
+    debug
+    admin :2019
+}
+:80 {
+    root * /usr/share/caddy/
+    @get_v1_conductors {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /v1/conductors
+    }
+    route @get_v1_conductors {
+        rewrite /v1/conductors /v1/conductors/get.json
+        file_server
+    }
+    @get_v1_nodes {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /v1/nodes
+    }
+    route @get_v1_nodes {
+        rewrite /v1/nodes /v1/nodes/get.json
+        file_server
+    }
+    file_server browse
+}
diff --git a/openstack_controller/tests/legacy/docker/etc/caddy/keystone/Caddyfile b/openstack_controller/tests/legacy/docker/etc/caddy/keystone/Caddyfile
new file mode 100644
index 0000000000000..9aab840ca2f6c
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/etc/caddy/keystone/Caddyfile
@@ -0,0 +1,35 @@
+{
+    debug
+    admin :2019
+}
+:80 {
+    root * /usr/share/caddy/
+    @post_auth_tokens {
+        method POST
+        path /identity/v3/auth/tokens
+    }
+    route @post_auth_tokens {
+        rewrite /identity/v3/auth/tokens /identity/v3/auth/tokens/post.json
+        header /identity/v3/auth/tokens/post.json X-Subject-Token "demo_test"
+        file_server
+    }
+    @get_auth_projects {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /identity/v3/auth/projects
+    }
+    route @get_auth_projects {
+        rewrite /identity/v3/auth/projects /identity/v3/auth/projects/get.json
+        file_server
+    }
+    @get_projects {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /identity/v3/projects
+    }
+    route @get_projects {
+        rewrite /identity/v3/projects /identity/v3/projects/get.json
+        file_server
+    }
+    file_server browse
+}
diff --git a/openstack_controller/tests/legacy/docker/etc/caddy/neutron/Caddyfile b/openstack_controller/tests/legacy/docker/etc/caddy/neutron/Caddyfile
new file mode 100644
index 0000000000000..a17b8c94e2618
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/etc/caddy/neutron/Caddyfile
@@ -0,0 +1,26 @@
+{
+    debug
+    admin :2019
+}
+:80 {
+    root * /usr/share/caddy/
+    @get_root {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /
+    }
+    route @get_root {
+        rewrite / /get.json
+        file_server
+    }
+    @get_v2_0_networks {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /v2.0/networks
+    }
+    route @get_v2_0_networks {
+        rewrite /v2.0/networks /v2.0/networks/get.json
+        file_server
+    }
+    file_server browse
+}
diff --git a/openstack_controller/tests/legacy/docker/etc/caddy/nova/Caddyfile b/openstack_controller/tests/legacy/docker/etc/caddy/nova/Caddyfile
new file mode 100644
index 0000000000000..eac6354820ffa
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/etc/caddy/nova/Caddyfile
@@ -0,0 +1,62 @@
+{
+    debug
+    admin :2019
+}
+:80 {
+    root * /usr/share/caddy/
+    @get_v2_1_4bfc1 {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /v2.1/4bfc1
+    }
+    route @get_v2_1_4bfc1 {
+        rewrite /v2.1/4bfc1 /v2.1/4bfc1/get.json
+        file_server
+    }
+    @get_limits {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /v2.1/4bfc1/limits
+    }
+    route @get_limits {
+        rewrite /v2.1/4bfc1/limits /v2.1/4bfc1/limits/{query.tenant_id}.json
+        file_server
+    }
+    @get_servers_detail {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /v2.1/4bfc1/servers/detail
+    }
+    route @get_servers_detail {
+        rewrite /v2.1/4bfc1/servers/detail /v2.1/4bfc1/servers/detail/get.json
+        file_server
+    }
+    @get_os_hypervisors_detail {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /v2.1/4bfc1/os-hypervisors/detail
+    }
+    route @get_os_hypervisors_detail {
+        rewrite /v2.1/4bfc1/os-hypervisors/detail /v2.1/4bfc1/os-hypervisors/detail/get.json
+        file_server
+    }
+    @get_os_aggregates_detail {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /v2.1/4bfc1/os-aggregates
+    }
+    route @get_os_aggregates_detail {
+        rewrite /v2.1/4bfc1/os-aggregates /v2.1/4bfc1/os-aggregates/get.json
+        file_server
+    }
+    @get_os_hypervisors_uptime {
+        method GET
+        header X-Auth-Token "demo_test"
+        path /v2.1/4bfc1/os-hypervisors/*/uptime
+    }
+    route @get_os_hypervisors_uptime {
+        rewrite /v2.1/4bfc1/os-hypervisors/*/uptime /v2.1/4bfc1/os-hypervisors/uptime/get.json
+        file_server
+    }
+    file_server browse
+}
diff --git a/openstack_controller/tests/legacy/docker/fixtures/ironic/v1/conductors/get.json b/openstack_controller/tests/legacy/docker/fixtures/ironic/v1/conductors/get.json
new file mode 100644
index 0000000000000..c947412fb52a9
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/fixtures/ironic/v1/conductors/get.json
@@ -0,0 +1,34 @@
+{
+    "conductors": [
+      {
+        "hostname": "compute1.localdomain",
+        "conductor_group": "",
+        "links": [
+          {
+            "href": "http://127.0.0.1:6385/v1/conductors/compute1.localdomain",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/conductors/compute1.localdomain",
+            "rel": "bookmark"
+          }
+        ],
+        "alive": false
+      },
+      {
+        "hostname": "compute2.localdomain",
+        "conductor_group": "",
+        "links": [
+          {
+            "href": "http://127.0.0.1:6385/v1/conductors/compute2.localdomain",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/conductors/compute2.localdomain",
+            "rel": "bookmark"
+          }
+        ],
+        "alive": true
+      }
+    ]
+  }
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/docker/fixtures/ironic/v1/nodes/get.json b/openstack_controller/tests/legacy/docker/fixtures/ironic/v1/nodes/get.json
new file mode 100644
index 0000000000000..4cefb3b4febae
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/fixtures/ironic/v1/nodes/get.json
@@ -0,0 +1,219 @@
+{
+    "nodes": [
+      {
+        "allocation_uuid": "5344a3e2-978a-444e-990a-cbf47c62ef88",
+        "boot_interface": null,
+        "chassis_uuid": null,
+        "clean_step": {},
+        "conductor": "compute1.localdomain",
+        "conductor_group": "group-1",
+        "console_enabled": false,
+        "console_interface": null,
+        "created_at": "2016-08-18T22:28:48.643434+11:11",
+        "deploy_interface": null,
+        "deploy_step": {},
+        "description": null,
+        "driver": "fake",
+        "driver_info": {
+          "ipmi_password": "******",
+          "ipmi_username": "ADMIN"
+        },
+        "driver_internal_info": {
+          "clean_steps": null
+        },
+        "extra": {},
+        "inspect_interface": null,
+        "inspection_finished_at": null,
+        "inspection_started_at": null,
+        "instance_info": {},
+        "instance_uuid": "5344a3e2-978a-444e-990a-cbf47c62ef88",
+        "last_error": null,
+        "lessee": null,
+        "links": [
+          {
+            "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
+            "rel": "bookmark"
+          }
+        ],
+        "maintenance": false,
+        "maintenance_reason": null,
+        "management_interface": null,
+        "name": "test_node_classic",
+        "network_data": {},
+        "network_interface": "flat",
+        "owner": "john doe",
+        "portgroups": [
+          {
+            "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/portgroups",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/portgroups",
+            "rel": "bookmark"
+          }
+        ],
+        "ports": [
+          {
+            "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/ports",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/ports",
+            "rel": "bookmark"
+          }
+        ],
+        "power_interface": null,
+        "power_state": "power off",
+        "properties": {},
+        "protected": false,
+        "protected_reason": null,
+        "provision_state": "available",
+        "provision_updated_at": "2016-08-18T22:28:49.946416+00:00",
+        "raid_config": {},
+        "raid_interface": null,
+        "rescue_interface": null,
+        "reservation": null,
+        "resource_class": null,
+        "retired": false,
+        "retired_reason": null,
+        "states": [
+          {
+            "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/states",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/states",
+            "rel": "bookmark"
+          }
+        ],
+        "storage_interface": "noop",
+        "target_power_state": null,
+        "target_provision_state": null,
+        "target_raid_config": {},
+        "traits": [],
+        "updated_at": "2016-08-18T22:28:49.653974+00:00",
+        "uuid": "6d85703a-565d-469a-96ce-30b6de53079d",
+        "vendor_interface": null,
+        "volume": [
+          {
+            "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/volume",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/volume",
+            "rel": "bookmark"
+          }
+        ]
+      },
+      {
+        "allocation_uuid": null,
+        "boot_interface": "pxe",
+        "chassis_uuid": null,
+        "clean_step": {},
+        "conductor": "compute1.localdomain",
+        "conductor_group": "",
+        "console_enabled": false,
+        "console_interface": "no-console",
+        "created_at": "2016-08-18T22:28:48.643434+11:11",
+        "deploy_interface": "direct",
+        "deploy_step": {},
+        "driver": "ipmi",
+        "driver_info": {
+          "ipmi_password": "******",
+          "ipmi_username": "ADMIN"
+        },
+        "driver_internal_info": {},
+        "extra": {},
+        "inspect_interface": "no-inspect",
+        "inspection_finished_at": null,
+        "inspection_started_at": null,
+        "instance_info": {},
+        "instance_uuid": null,
+        "last_error": null,
+        "lessee": null,
+        "links": [
+          {
+            "href": "http://127.0.0.1:6385/v1/nodes/2b045129-a906-46af-bc1a-092b294b3428",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/nodes/2b045129-a906-46af-bc1a-092b294b3428",
+            "rel": "bookmark"
+          }
+        ],
+        "maintenance": false,
+        "maintenance_reason": null,
+        "management_interface": "ipmitool",
+        "name": "test_node_dynamic",
+        "network_data": {},
+        "network_interface": "flat",
+        "owner": "43e61ec9-8e42-4dcb-bc45-30d66aa93e5b",
+        "portgroups": [
+          {
+            "href": "http://127.0.0.1:6385/v1/nodes/2b045129-a906-46af-bc1a-092b294b3428/portgroups",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/nodes/2b045129-a906-46af-bc1a-092b294b3428/portgroups",
+            "rel": "bookmark"
+          }
+        ],
+        "ports": [
+          {
+            "href": "http://127.0.0.1:6385/v1/nodes/2b045129-a906-46af-bc1a-092b294b3428/ports",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/nodes/2b045129-a906-46af-bc1a-092b294b3428/ports",
+            "rel": "bookmark"
+          }
+        ],
+        "power_interface": "ipmitool",
+        "power_state": null,
+        "properties": {},
+        "protected": false,
+        "protected_reason": null,
+        "provision_state": "enroll",
+        "provision_updated_at": null,
+        "raid_config": {},
+        "raid_interface": "no-raid",
+        "rescue_interface": "no-rescue",
+        "reservation": null,
+        "resource_class": null,
+        "retired": false,
+        "retired_reason": null,
+        "states": [
+          {
+            "href": "http://127.0.0.1:6385/v1/nodes/2b045129-a906-46af-bc1a-092b294b3428/states",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/nodes/2b045129-a906-46af-bc1a-092b294b3428/states",
+            "rel": "bookmark"
+          }
+        ],
+        "storage_interface": "noop",
+        "target_power_state": null,
+        "target_provision_state": null,
+        "target_raid_config": {},
+        "traits": [],
+        "updated_at": null,
+        "uuid": "2b045129-a906-46af-bc1a-092b294b3428",
+        "vendor_interface": "no-vendor",
+        "volume": [
+          {
+            "href": "http://127.0.0.1:6385/v1/nodes/2b045129-a906-46af-bc1a-092b294b3428/volume",
+            "rel": "self"
+          },
+          {
+            "href": "http://127.0.0.1:6385/nodes/2b045129-a906-46af-bc1a-092b294b3428/volume",
+            "rel": "bookmark"
+          }
+        ]
+      }
+    ]
+  }
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/docker/fixtures/keystone/identity/v3/auth/projects/get.json b/openstack_controller/tests/legacy/docker/fixtures/keystone/identity/v3/auth/projects/get.json
new file mode 100644
index 0000000000000..276fe474bfd4f
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/fixtures/keystone/identity/v3/auth/projects/get.json
@@ -0,0 +1,16 @@
+{
+  "projects": [
+    {
+      "is_domain": false,
+      "description": "Keystone Identity Service",
+      "links": {
+        "self": "http://10.0.2.15:5000/v3/projects/***************************4bfc1"
+      },
+      "enabled": true,
+      "domain_id": "default",
+      "parent_id": "default",
+      "id": "***************************4bfc1",
+      "name": "service"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/docker/fixtures/keystone/identity/v3/auth/tokens/post.json b/openstack_controller/tests/legacy/docker/fixtures/keystone/identity/v3/auth/tokens/post.json
new file mode 100644
index 0000000000000..b2ba6b4510154
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/fixtures/keystone/identity/v3/auth/tokens/post.json
@@ -0,0 +1,242 @@
+{
+  "token": {
+    "is_domain": false,
+    "methods": [
+      "token",
+      "password"
+    ],
+    "roles": [
+      {
+        "id": "***************************91953",
+        "name": "admin_read_only"
+      }
+    ],
+    "expires_at": "2018-11-23T03:34:53.000000Z",
+    "project": {
+      "domain": {
+        "id": "default",
+        "name": "Default"
+      },
+      "id": "***************************4bfc1",
+      "name": "service"
+    },
+    "catalog": [
+      {
+        "endpoints": [
+          {
+            "url": "http://10.0.2.15:9292",
+            "interface": "internal",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************b4841"
+          },
+          {
+            "url": "http://10.0.2.15:9292",
+            "interface": "admin",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************a0f45"
+          },
+          {
+            "url": "http://10.0.3.10:9292",
+            "interface": "public",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************0e5c2"
+          }
+        ],
+        "type": "image",
+        "id": "***************************846cb",
+        "name": "glance"
+      },
+      {
+        "endpoints": [
+          {
+            "url": "http://127.0.0.1:8774/v2.1/***************************4bfc1",
+            "interface": "public",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************9ed89"
+          },
+          {
+            "url": "http://127.0.0.1:8774/v2.1/***************************4bfc1",
+            "interface": "admin",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************e47a2"
+          },
+          {
+            "url": "http://127.0.0.1:8774/v2.1/***************************4bfc1",
+            "interface": "internal",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************b016b"
+          },
+          {
+            "url": "http://127.0.0.1:8774/v2.1/4bfc1",
+            "interface": "public",
+            "region": null,
+            "region_id": null,
+            "id": "***************************d7802"
+          }
+        ],
+        "type": "compute",
+        "id": "***************************05d1f",
+        "name": "nova"
+      },
+      {
+        "endpoints": [
+          {
+            "url": "http://127.0.0.1:9696",
+            "interface": "internal",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************abf66"
+          },
+          {
+            "url": "http://127.0.0.1:9696",
+            "interface": "admin",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************8d1ca"
+          },
+          {
+            "url": "http://127.0.0.1:9696",
+            "interface": "public",
+            "region": null,
+            "region_id": null,
+            "id": "***************************64be0"
+          }
+        ],
+        "type": "network",
+        "id": "***************************9a6f4",
+        "name": "neutron"
+      },
+      {
+        "endpoints": [
+          {
+            "url": "http://10.0.3.111:8776/v3/***************************4bfc1",
+            "interface": "public",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************89f4a"
+          },
+          {
+            "url": "http://10.0.2.15:8776/v3/***************************4bfc1",
+            "interface": "internal",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************d9fb1"
+          },
+          {
+            "url": "http://10.0.2.15:8776/v3/***************************4bfc1",
+            "interface": "admin",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************1b330"
+          }
+        ],
+        "type": "volumev3",
+        "id": "***************************3ac57",
+        "name": "cinderv3"
+      },
+      {
+        "endpoints": [
+          {
+            "url": "http://10.0.3.111:8776/v1/***************************4bfc1",
+            "interface": "public",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************2452f"
+          },
+          {
+            "url": "http://10.0.2.15:8776/v1/***************************4bfc1",
+            "interface": "admin",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************8239f"
+          },
+          {
+            "url": "http://10.0.2.15:8776/v1/***************************4bfc1",
+            "interface": "internal",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************7caa1"
+          }
+        ],
+        "type": "volume",
+        "id": "***************************e7e16",
+        "name": "cinder"
+      },
+      {
+        "endpoints": [
+          {
+            "url": "http://10.0.3.44:5000/v3",
+            "interface": "public",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************a23db"
+          },
+          {
+            "url": "http://10.0.2.15:5000/v3",
+            "interface": "internal",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************9febe"
+          },
+          {
+            "url": "http://10.0.2.15:35357/v3",
+            "interface": "admin",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************f0cdb"
+          }
+        ],
+        "type": "identity",
+        "id": "***************************17167",
+        "name": "keystone"
+      },
+      {
+        "endpoints": [
+          {
+            "url": "http://10.0.2.15:8776/v2/***************************4bfc1",
+            "interface": "admin",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************0530c"
+          },
+          {
+            "url": "http://10.0.3.111:8776/v2/***************************4bfc1",
+            "interface": "public",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************9b358"
+          },
+          {
+            "url": "http://10.0.2.15:8776/v2/***************************4bfc1",
+            "interface": "internal",
+            "region": "Regionull",
+            "region_id": "Regionull",
+            "id": "***************************58920"
+          }
+        ],
+        "type": "volumev2",
+        "id": "***************************cfa2d",
+        "name": "cinderv2"
+      }
+    ],
+    "user": {
+      "domain": {
+        "id": "default",
+        "name": "Default"
+      },
+      "id": "***************************bde1b",
+      "name": "datadog_os_user"
+    },
+    "audit_ids": [
+      "qdcm2BRVSa26oSDpZuclVA",
+      "8VJwugdcQrmRgu2NtKwMmA"
+    ],
+    "issued_at": "2018-11-22T15:34:54.000000Z"
+  }
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/docker/fixtures/keystone/identity/v3/projects/get.json b/openstack_controller/tests/legacy/docker/fixtures/keystone/identity/v3/projects/get.json
new file mode 100644
index 0000000000000..2cbd22cae93de
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/fixtures/keystone/identity/v3/projects/get.json
@@ -0,0 +1,81 @@
+{
+  "projects": [
+    {
+      "is_domain": false,
+      "description": "Bootstrap project for initializing the cloud.",
+      "links": {
+        "self": "http://10.0.2.15:5000/v3/projects/3fb11"
+      },
+      "enabled": true,
+      "domain_id": "default",
+      "parent_id": "default",
+      "id": "3fb11",
+      "name": "admin"
+    },
+    {
+      "is_domain": false,
+      "description": "test project",
+      "links": {
+        "self": "http://10.0.2.15:5000/v3/projects/73dbe"
+      },
+      "enabled": true,
+      "domain_id": "default",
+      "parent_id": "default",
+      "id": "73dbe",
+      "name": "testProj1"
+    },
+    {
+      "is_domain": false,
+      "description": "test project",
+      "links": {
+        "self": "http://10.0.2.15:5000/v3/projects/147d1"
+      },
+      "enabled": true,
+      "domain_id": "default",
+      "parent_id": "default",
+      "id": "147d1",
+      "name": "12345"
+    },
+    {
+      "is_domain": false,
+      "description": "Keystone Identity Service",
+      "links": {
+        "self": "http://10.0.2.15:5000/v3/projects/4bfc1"
+      },
+      "enabled": true,
+      "domain_id": "default",
+      "parent_id": "default",
+      "id": "4bfc1",
+      "name": "service"
+    },
+    {
+      "is_domain": false,
+      "description": "",
+      "links": {
+        "self": "http://10.0.2.15:5000/v3/projects/44736"
+      },
+      "enabled": true,
+      "domain_id": "default",
+      "parent_id": "default",
+      "id": "44736",
+      "name": "abcde"
+    },
+    {
+      "is_domain": false,
+      "description": "test project",
+      "links": {
+        "self": "http://10.0.2.15:5000/v3/projects/d91a1"
+      },
+      "enabled": true,
+      "domain_id": "default",
+      "parent_id": "default",
+      "id": "d91a1",
+      "name": "testProj2"
+    }
+  ],
+  "links": {
+    "self": "http://10.0.2.15:5000/v3/projects",
+    "next": null,
+    "previous": null
+  }
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/docker/fixtures/neutron/get.json b/openstack_controller/tests/legacy/docker/fixtures/neutron/get.json
new file mode 100644
index 0000000000000..43cfe52915bfd
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/fixtures/neutron/get.json
@@ -0,0 +1,30 @@
+{
+    "versions": [
+        {
+            "id": "v2.0",
+            "links": [
+                {
+                    "href": "http://openstack.example.com/v2/",
+                    "rel": "self"
+                }
+            ],
+            "status": "SUPPORTED",
+            "version": "",
+            "min_version": "",
+            "updated": "2011-01-21T11:33:21Z"
+        },
+        {
+            "id": "v2.1",
+            "links": [
+                {
+                    "href": "http://openstack.example.com/v2.1/",
+                    "rel": "self"
+                }
+            ],
+            "status": "CURRENT",
+            "version": "2.95",
+            "min_version": "2.1",
+            "updated": "2013-07-23T11:33:21Z"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/docker/fixtures/neutron/v2.0/networks/get.json b/openstack_controller/tests/legacy/docker/fixtures/neutron/v2.0/networks/get.json
new file mode 100644
index 0000000000000..0f56913a78079
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/fixtures/neutron/v2.0/networks/get.json
@@ -0,0 +1,55 @@
+{
+  "networks": [
+    {
+      "status": "ACTIVE",
+      "router:external": true,
+      "availability_zone_hints": [
+        "nova"
+      ],
+      "availability_zones": [],
+      "ipv4_address_scope": null,
+      "description": "",
+      "subnets": [],
+      "port_security_enabled": false,
+      "tenant_id": "***************************3fb11",
+      "created_at": "2018-08-16T20:22:34Z",
+      "tags": [],
+      "ipv6_address_scope": null,
+      "updated_at": "2018-08-16T20:22:34Z",
+      "is_default": false,
+      "project_id": "***************************3fb11",
+      "revision_number": 4,
+      "admin_state_up": true,
+      "shared": false,
+      "mt": 1450,
+      "id": "2755452c-4fe8-4ba1-9b26-8898665b0958",
+      "name": "net2"
+    },
+    {
+      "status": "ACTIVE",
+      "router:external": false,
+      "availability_zone_hints": [],
+      "availability_zones": [
+        "nova"
+      ],
+      "ipv4_address_scope": null,
+      "description": "",
+      "subnets": [
+        "22eee592-35c1-4edd-9d8b-eaafd4ce326c"
+      ],
+      "port_security_enabled": true,
+      "tenant_id": "***************************3fb11",
+      "created_at": "2018-08-16T21:13:01Z",
+      "tags": [],
+      "ipv6_address_scope": null,
+      "updated_at": "2018-08-16T21:13:32Z",
+      "project_id": "***************************3fb11",
+      "revision_number": 5,
+      "admin_state_up": true,
+      "shared": true,
+      "mt": 1450,
+      "id": "2fad0a98-4ba9-44f4-8f81-87c31c5eab10",
+      "name": "net3"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/get.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/get.json
new file mode 100644
index 0000000000000..43cfe52915bfd
--- /dev/null
+++ b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/get.json
@@ -0,0 +1,30 @@
+{
+    "versions": [
+        {
+            "id": "v2.0",
+            "links": [
+                {
+                    "href": "http://openstack.example.com/v2/",
+                    "rel": "self"
+                }
+            ],
+            "status": "SUPPORTED",
+            "version": "",
+            "min_version": "",
+            "updated": "2011-01-21T11:33:21Z"
+        },
+        {
+            "id": "v2.1",
+            "links": [
+                {
+                    "href": "http://openstack.example.com/v2.1/",
+                    "rel": "self"
+                }
+            ],
+            "status": "CURRENT",
+            "version": "2.95",
+            "min_version": "2.1",
+            "updated": "2013-07-23T11:33:21Z"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_limits_147d1.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/147d1.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_limits_147d1.json
rename to openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/147d1.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_limits_3fb11.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/3fb11.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_limits_3fb11.json
rename to openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/3fb11.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_limits_44736.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/44736.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_limits_44736.json
rename to openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/44736.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_limits_4bfc1.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/4bfc1.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_limits_4bfc1.json
rename to openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/4bfc1.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_limits_73dbe.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/73dbe.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_limits_73dbe.json
rename to openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/73dbe.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_limits_d91a1.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/d91a1.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_limits_d91a1.json
rename to openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/limits/d91a1.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_os-aggregates.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/os-aggregates/get.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_os-aggregates.json
rename to openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/os-aggregates/get.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_os-hypervisors_detail.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/os-hypervisors/detail/get.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_os-hypervisors_detail.json
rename to openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/os-hypervisors/detail/get.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_os-hypervisors_uptime.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/os-hypervisors/uptime/get.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_os-hypervisors_uptime.json
rename to openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/os-hypervisors/uptime/get.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_detail.json b/openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/servers/detail/get.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_detail.json
rename to openstack_controller/tests/legacy/docker/fixtures/nova/v2.1/4bfc1/servers/detail/get.json
diff --git a/openstack_controller/tests/fixtures/auth_projects_response.json b/openstack_controller/tests/legacy/fixtures/auth_projects_response.json
similarity index 100%
rename from openstack_controller/tests/fixtures/auth_projects_response.json
rename to openstack_controller/tests/legacy/fixtures/auth_projects_response.json
diff --git a/openstack_controller/tests/fixtures/auth_tokens_multiple_roles_response.json b/openstack_controller/tests/legacy/fixtures/auth_tokens_multiple_roles_response.json
similarity index 100%
rename from openstack_controller/tests/fixtures/auth_tokens_multiple_roles_response.json
rename to openstack_controller/tests/legacy/fixtures/auth_tokens_multiple_roles_response.json
diff --git a/openstack_controller/tests/fixtures/auth_tokens_no_role_response.json b/openstack_controller/tests/legacy/fixtures/auth_tokens_no_role_response.json
similarity index 100%
rename from openstack_controller/tests/fixtures/auth_tokens_no_role_response.json
rename to openstack_controller/tests/legacy/fixtures/auth_tokens_no_role_response.json
diff --git a/openstack_controller/tests/fixtures/auth_tokens_response.json b/openstack_controller/tests/legacy/fixtures/auth_tokens_response.json
similarity index 100%
rename from openstack_controller/tests/fixtures/auth_tokens_response.json
rename to openstack_controller/tests/legacy/fixtures/auth_tokens_response.json
diff --git a/openstack_controller/tests/legacy/fixtures/openstack_bad_config.yaml b/openstack_controller/tests/legacy/fixtures/openstack_bad_config.yaml
new file mode 100644
index 0000000000000..10d011ccb456e
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/openstack_bad_config.yaml
@@ -0,0 +1,12 @@
+clouds:
+  test_cloud:
+    auth:
+      auth_url: http://xxx.xxx.xxx.xxx:5000/v2.0/
+      username: demo
+      password: secrete
+      project_name: demo
+      auth_type: test
+    example:
+      image_name: fedora-20.x86_64
+      flavor_name: m1.small
+      network_name: private
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/openstack_config.yaml b/openstack_controller/tests/legacy/fixtures/openstack_config.yaml
similarity index 94%
rename from openstack_controller/tests/fixtures/openstack_config.yaml
rename to openstack_controller/tests/legacy/fixtures/openstack_config.yaml
index 04cd4aaf31c4b..336042b3221db 100644
--- a/openstack_controller/tests/fixtures/openstack_config.yaml
+++ b/openstack_controller/tests/legacy/fixtures/openstack_config.yaml
@@ -11,7 +11,7 @@ clouds:
       flavor_name: m1.small
       network_name: private
   rackspace:
-    cloud: rackspace
+    profile: rackspace
     auth:
       username: joe
       password: joes-password
diff --git a/openstack_controller/tests/fixtures/v2.0_networks.json b/openstack_controller/tests/legacy/fixtures/v2.0_networks.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.0_networks.json
rename to openstack_controller/tests/legacy/fixtures/v2.0_networks.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_flavors_detail.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_flavors_detail.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_flavors_detail.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_flavors_detail.json
diff --git a/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_147d1.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_147d1.json
new file mode 100644
index 0000000000000..b1bb077063a3d
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_147d1.json
@@ -0,0 +1 @@
+{"limits": {"rate": [], "absolute": {"maxServerMeta": 128, "maxTotalInstances": 20, "maxPersonality": 5, "totalServerGroupsUsed": 0, "maxImageMeta": 128, "maxPersonalitySize": 10240, "maxTotalRAMSize": 51200, "maxServerGroups": 10, "maxSecurityGroupRules": 20, "maxTotalKeypairs": 100, "totalCoresUsed": 0, "totalRAMUsed": 0, "maxSecurityGroups": 10, "totalFloatingIpsUsed": 0, "totalInstancesUsed": 0, "maxServerGroupMembers": 10, "maxTotalFloatingIps": 10, "totalSecurityGroupsUsed": 0, "maxTotalCores": 40}}}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_3fb11.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_3fb11.json
new file mode 100644
index 0000000000000..05c6400f01d12
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_3fb11.json
@@ -0,0 +1 @@
+{"limits": {"rate": [], "absolute": {"maxServerMeta": 128, "maxTotalInstances": 20, "maxPersonality": 10, "totalServerGroupsUsed": 0, "maxImageMeta": 128, "maxPersonalitySize": 10240, "maxTotalRAMSize": 51200, "maxServerGroups": 10, "maxSecurityGroupRules": 20,"maxTotalKeypairs": 100, "totalCoresUsed": 34, "totalRAMUsed": 17408, "maxSecurityGroups": 10, "totalFloatingIpsUsed": 0, "totalInstancesUsed": 17, "maxServerGroupMembers": 10, "maxTotalFloatingIps": 10, "totalSecurityGroupsUsed": 1, "maxTotalCores": 40}}}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_44736.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_44736.json
new file mode 100644
index 0000000000000..63550f3e2ae97
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_44736.json
@@ -0,0 +1 @@
+{"limits": {"rate": [], "absolute": {"maxServerMeta": 128, "maxTotalInstances": 20, "maxPersonality": 5, "totalServerGroupsUsed": 0, "maxImageMeta": 128, "maxPersonalitySize": 10240, "maxTotalRAMSize": 51200, "maxServerGroups": 10, "maxSecurityGroupRules": 20,"maxTotalKeypairs": 100, "totalCoresUsed": 0, "totalRAMUsed": 0, "maxSecurityGroups": 10, "totalFloatingIpsUsed": 0, "totalInstancesUsed": 0, "maxServerGroupMembers": 10, "maxTotalFloatingIps": 10, "totalSecurityGroupsUsed": 0, "maxTotalCores": 40}}}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_4bfc1.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_4bfc1.json
new file mode 100644
index 0000000000000..88a8f93c97bca
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_4bfc1.json
@@ -0,0 +1 @@
+{"limits": {"rate": [], "absolute": {"maxServerMeta": 128, "maxTotalInstances": 10, "maxPersonality": 5, "totalServerGroupsUsed": 0, "maxImageMeta": 128, "maxPersonalitySize": 10240, "maxTotalRAMSize": 51200, "maxServerGroups": 10, "maxSecurityGroupRules": 20, "maxTotalKeypairs": 100, "totalCoresUsed": 0, "totalRAMUsed": 0, "maxSecurityGroups": 10, "totalFloatingIpsUsed": 0, "totalInstancesUsed": 0, "maxServerGroupMembers": 10, "maxTotalFloatingIps": 10, "totalSecurityGroupsUsed": 0, "maxTotalCores": 20}}}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_73dbe.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_73dbe.json
new file mode 100644
index 0000000000000..47f7b7960a3d1
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_73dbe.json
@@ -0,0 +1 @@
+{"limits": {"rate": [], "absolute": {"maxServerMeta": 128, "maxTotalInstances": 20, "maxPersonality": 5, "totalServerGroupsUsed": 0, "maxImageMeta": 128, "maxPersonalitySize": 10240, "maxTotalRAMSize": 51200, "maxServerGroups": 10, "maxSecurityGroupRules": 20, "maxTotalKeypairs": 100, "totalCoresUsed": 2, "totalRAMUsed": 1024, "maxSecurityGroups": 10, "totalFloatingIpsUsed": 0, "totalInstancesUsed": 1, "maxServerGroupMembers": 10, "maxTotalFloatingIps": 10, "totalSecurityGroupsUsed": 1, "maxTotalCores": 40}}}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_d91a1.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_d91a1.json
new file mode 100644
index 0000000000000..b1bb077063a3d
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_limits_d91a1.json
@@ -0,0 +1 @@
+{"limits": {"rate": [], "absolute": {"maxServerMeta": 128, "maxTotalInstances": 20, "maxPersonality": 5, "totalServerGroupsUsed": 0, "maxImageMeta": 128, "maxPersonalitySize": 10240, "maxTotalRAMSize": 51200, "maxServerGroups": 10, "maxSecurityGroupRules": 20, "maxTotalKeypairs": 100, "totalCoresUsed": 0, "totalRAMUsed": 0, "maxSecurityGroups": 10, "totalFloatingIpsUsed": 0, "totalInstancesUsed": 0, "maxServerGroupMembers": 10, "maxTotalFloatingIps": 10, "totalSecurityGroupsUsed": 0, "maxTotalCores": 40}}}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_os-aggregates.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_os-aggregates.json
new file mode 100644
index 0000000000000..6d85f4335e2ae
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_os-aggregates.json
@@ -0,0 +1 @@
+{"aggregates": [{"name": "test-aggregate", "availability_zone": "nova", "deleted": false, "created_at": "2018-10-05T00:37:02.000000", "updated_at": null, "hosts": ["compute1"], "deleted_at": null, "id": 1, "metadata": {"availability_zone": "nova"}}]}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_os-hypervisors_detail.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_os-hypervisors_detail.json
new file mode 100644
index 0000000000000..c09ffbcb84b23
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_os-hypervisors_detail.json
@@ -0,0 +1 @@
+{"hypervisors": [{"local_gb_used": 22, "vcpus_used": 4, "hypervisor_hostname": "compute1.openstack.local", "vcpus": 8, "host_ip": "172.29.236.102", "memory_mb_used": 4096, "memory_mb": 7982, "hypervisor_version": 2005000, "hypervisor_type": "QEMU", "state": "up", "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"Haswell-noTSX-IBRS\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"vme\", \"invpcid\", \"tsc\", \"fsgsbase\", \"xsave\", \"spec-ctrl\", \"vmx\", \"erms\", \"cmov\", \"smep\", \"ssse3\", \"pat\", \"lm\", \"msr\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"fma\", \"tsc-deadline\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"rdtscp\", \"ht\", \"pse\", \"lahf_lm\", \"abm\", \"popcnt\", \"mca\", \"pdpe1gb\", \"apic\", \"sse\", \"f16c\", \"pni\", \"aes\", \"avx2\", \"sse2\", \"ss\", \"hypervisor\", \"bmi1\", \"bmi2\", \"pcid\", \"fpu\", \"cx16\", \"pse36\", \"mtrr\", \"movbe\", \"rdrand\", \"x2apic\"], \"topology\": {\"cores\": 8, \"cells\": 1, \"threads\": 1, \"sockets\": 1}}", "running_vms": 2, "service": {"host": "compute1", "disabled_reason": null, "id": 2}, "disk_available_least": 14, "free_disk_gb": 26, "free_ram_mb": 3886, "status": "enabled", "id": 1, "local_gb": 48, "current_workload": 0}, {"local_gb_used": 32, "vcpus_used": 6, "hypervisor_hostname": "compute2.openstack.local", "vcpus": 8, "host_ip": "172.29.236.103", "memory_mb_used": 5120, "memory_mb": 7982, "hypervisor_version": 2005000, "hypervisor_type": "QEMU", "state": "up", "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"Haswell-noTSX-IBRS\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"vme\", \"invpcid\", \"tsc\", \"fsgsbase\", \"xsave\", \"spec-ctrl\", \"vmx\", \"erms\", \"cmov\", \"smep\", \"ssse3\", \"pat\", \"lm\", \"msr\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"fma\", \"tsc-deadline\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"rdtscp\", \"ht\", \"pse\", \"lahf_lm\", \"abm\", \"popcnt\", \"mca\", \"pdpe1gb\", \"apic\", \"sse\", \"f16c\", \"pni\", \"aes\", \"avx2\", \"sse2\", \"ss\", \"hypervisor\", \"bmi1\", \"bmi2\", \"pcid\", \"fpu\", \"cx16\", \"pse36\", \"mtrr\", \"movbe\", \"rdrand\", \"x2apic\"], \"topology\": {\"cores\": 8, \"cells\": 1, \"threads\": 1, \"sockets\": 1}}", "running_vms": 3, "service": {"host": "compute2", "disabled_reason": null, "id": 3}, "disk_available_least": -2, "free_disk_gb": 16, "free_ram_mb": 2862, "status": "enabled", "id": 2, "local_gb": 48, "current_workload": 0}, {"local_gb_used": 2, "vcpus_used": 0, "hypervisor_hostname": "compute3.openstack.local", "vcpus": 8, "host_ip": "172.29.236.103", "memory_mb_used": 2048, "memory_mb": 7982, "hypervisor_version": 2005000, "hypervisor_type": "QEMU", "state": "up", "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"Haswell-noTSX-IBRS\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"vme\", \"invpcid\", \"tsc\", \"fsgsbase\", \"xsave\", \"spec-ctrl\", \"vmx\", \"erms\", \"cmov\", \"smep\", \"ssse3\", \"pat\", \"lm\", \"msr\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"ssbd\", \"fma\", \"tsc-deadline\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"rdtscp\", \"ht\", \"pse\", \"lahf_lm\", \"abm\", \"popcnt\", \"mca\", \"pdpe1gb\", \"apic\", \"sse\", \"f16c\", \"pni\", \"aes\", \"avx2\", \"sse2\", \"ss\", \"hypervisor\", \"bmi1\", \"bmi2\", \"pcid\", \"fpu\", \"cx16\", \"pse36\", \"mtrr\", \"movbe\", \"rdrand\", \"x2apic\"], \"topology\": {\"cores\": 8, \"cells\": 1, \"threads\": 1, \"sockets\": 1}}", "running_vms": 0, "service": {"host": "compute3", "disabled_reason": null, "id": 8}, "disk_available_least": 38, "free_disk_gb": 46, "free_ram_mb": 5934, "status": "enabled", "id": 8, "local_gb": 48, "current_workload": 0}, {"local_gb_used": 32, "vcpus_used": 6, "hypervisor_hostname": "compute4.openstack.local", "vcpus": 8, "host_ip": "172.29.236.116", "memory_mb_used": 5120, "memory_mb": 7982, "hypervisor_version": 2005000, "hypervisor_type": "QEMU", "state": "up", "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"Haswell-noTSX-IBRS\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"vme\", \"invpcid\", \"tsc\", \"fsgsbase\", \"xsave\", \"spec-ctrl\", \"vmx\", \"erms\", \"cmov\", \"smep\", \"ssse3\", \"pat\", \"lm\", \"msr\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"ssbd\", \"fma\", \"tsc-deadline\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"rdtscp\", \"ht\", \"pse\", \"lahf_lm\", \"abm\", \"popcnt\", \"mca\", \"pdpe1gb\", \"apic\", \"sse\", \"f16c\", \"pni\", \"aes\", \"avx2\", \"sse2\", \"ss\", \"hypervisor\", \"bmi1\", \"bmi2\", \"pcid\", \"fpu\", \"cx16\", \"pse36\", \"mtrr\", \"movbe\", \"rdrand\", \"x2apic\"], \"topology\": {\"cores\": 8, \"cells\": 1, \"threads\": 1, \"sockets\": 1}}", "running_vms": 3, "service": {"host": "compute4", "disabled_reason": null, "id": 9}, "disk_available_least": 2, "free_disk_gb": 16, "free_ram_mb": 2862, "status": "enabled", "id": 9, "local_gb": 48, "current_workload": 0}, {"local_gb_used": 22, "vcpus_used": 4, "hypervisor_hostname": "compute5.openstack.local", "vcpus": 8, "host_ip": "172.29.236.117", "memory_mb_used": 4096, "memory_mb": 7982, "hypervisor_version": 2005000, "hypervisor_type": "QEMU", "state": "up", "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"Haswell-noTSX-IBRS\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"vme\", \"invpcid\", \"tsc\", \"fsgsbase\", \"xsave\", \"spec-ctrl\", \"vmx\", \"erms\", \"cmov\", \"smep\", \"ssse3\", \"pat\", \"lm\", \"msr\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"ssbd\", \"fma\", \"tsc-deadline\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"rdtscp\", \"ht\", \"pse\", \"lahf_lm\", \"abm\", \"popcnt\", \"mca\", \"pdpe1gb\", \"apic\", \"sse\", \"f16c\", \"pni\", \"aes\", \"avx2\", \"sse2\", \"ss\", \"hypervisor\", \"bmi1\", \"bmi2\", \"pcid\", \"fpu\", \"cx16\", \"pse36\", \"mtrr\", \"movbe\", \"rdrand\", \"x2apic\"], \"topology\": {\"cores\": 8, \"cells\": 1, \"threads\": 1, \"sockets\": 1}}", "running_vms": 2, "service": {"host": "compute5", "disabled_reason": null, "id": 10}, "disk_available_least": 14, "free_disk_gb": 26, "free_ram_mb": 3886, "status": "enabled", "id": 10, "local_gb": 48, "current_workload": 0}, {"local_gb_used": 2, "vcpus_used": 0, "hypervisor_hostname": "compute6.openstack.local", "vcpus": 8, "host_ip": "172.29.236.118", "memory_mb_used": 2048, "memory_mb": 7982, "hypervisor_version": 2005000, "hypervisor_type": "QEMU", "state": "up", "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"Haswell-noTSX-IBRS\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"vme\", \"invpcid\", \"tsc\", \"fsgsbase\", \"xsave\", \"spec-ctrl\", \"vmx\", \"erms\", \"cmov\", \"smep\", \"ssse3\", \"pat\", \"lm\", \"msr\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"fma\", \"tsc-deadline\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"rdtscp\", \"ht\", \"pse\", \"lahf_lm\", \"abm\", \"popcnt\", \"mca\", \"pdpe1gb\", \"apic\", \"sse\", \"f16c\", \"pni\", \"aes\", \"avx2\", \"sse2\", \"ss\", \"hypervisor\", \"bmi1\", \"bmi2\", \"pcid\", \"fpu\", \"cx16\", \"pse36\", \"mtrr\", \"movbe\", \"rdrand\", \"x2apic\"], \"topology\": {\"cores\": 8, \"cells\": 1, \"threads\": 1, \"sockets\": 1}}", "running_vms": 0, "service": {"host": "compute6", "disabled_reason": null, "id": 11}, "disk_available_least": 37, "free_disk_gb": 46, "free_ram_mb": 5934, "status": "enabled", "id": 11, "local_gb": 48, "current_workload": 0}, {"local_gb_used": 32, "vcpus_used": 6, "hypervisor_hostname": "compute7.openstack.local", "vcpus": 8, "host_ip": "172.29.236.119", "memory_mb_used": 5120, "memory_mb": 7982, "hypervisor_version": 2005000, "hypervisor_type": "QEMU", "state": "up", "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"Haswell-noTSX-IBRS\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"vme\", \"invpcid\", \"tsc\", \"fsgsbase\", \"xsave\", \"spec-ctrl\", \"vmx\", \"erms\", \"cmov\", \"smep\", \"ssse3\", \"pat\", \"lm\", \"msr\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"ssbd\", \"fma\", \"tsc-deadline\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"rdtscp\", \"ht\", \"pse\", \"lahf_lm\", \"abm\", \"popcnt\", \"mca\", \"pdpe1gb\", \"apic\", \"sse\", \"f16c\", \"pni\", \"aes\", \"avx2\", \"sse2\", \"ss\", \"hypervisor\", \"bmi1\", \"bmi2\", \"pcid\", \"fpu\", \"cx16\", \"pse36\", \"mtrr\", \"movbe\", \"rdrand\", \"x2apic\"], \"topology\": {\"cores\": 8, \"cells\": 1, \"threads\": 1, \"sockets\": 1}}", "running_vms": 3, "service": {"host": "compute7", "disabled_reason": null, "id": 12}, "disk_available_least": 3, "free_disk_gb": 16, "free_ram_mb": 2862, "status": "enabled", "id": 12, "local_gb": 48, "current_workload": 0}, {"local_gb_used": 22, "vcpus_used": 4, "hypervisor_hostname": "compute8.openstack.local", "vcpus": 8, "host_ip": "172.29.236.120", "memory_mb_used": 4096, "memory_mb": 7982, "hypervisor_version": 2005000, "hypervisor_type": "QEMU", "state": "up", "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"Haswell-noTSX-IBRS\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"vme\", \"invpcid\", \"tsc\", \"fsgsbase\", \"xsave\", \"spec-ctrl\", \"vmx\", \"erms\", \"cmov\", \"smep\", \"ssse3\", \"pat\", \"lm\", \"msr\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"ssbd\", \"fma\", \"tsc-deadline\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"rdtscp\", \"ht\", \"pse\", \"lahf_lm\", \"abm\", \"popcnt\", \"mca\", \"pdpe1gb\", \"apic\", \"sse\", \"f16c\", \"pni\", \"aes\", \"avx2\", \"sse2\", \"ss\", \"hypervisor\", \"bmi1\", \"bmi2\", \"pcid\", \"fpu\", \"cx16\", \"pse36\", \"mtrr\", \"movbe\", \"rdrand\", \"x2apic\"], \"topology\": {\"cores\": 8, \"cells\": 1, \"threads\": 1, \"sockets\": 1}}", "running_vms": 2, "service": {"host": "compute8", "disabled_reason": null, "id": 13}, "disk_available_least": 13, "free_disk_gb": 26, "free_ram_mb": 3886, "status": "enabled", "id": 13, "local_gb": 48, "current_workload": 0}, {"local_gb_used": 2, "vcpus_used": 0, "hypervisor_hostname": "compute9.openstack.local", "vcpus": 8, "host_ip": "172.29.236.121", "memory_mb_used": 2048, "memory_mb": 7982, "hypervisor_version": 2005000, "hypervisor_type": "QEMU", "state": "up", "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"Haswell-noTSX-IBRS\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"vme\", \"invpcid\", \"tsc\", \"fsgsbase\", \"xsave\", \"spec-ctrl\", \"vmx\", \"erms\", \"cmov\", \"smep\", \"ssse3\", \"pat\", \"lm\", \"msr\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"ssbd\", \"fma\", \"tsc-deadline\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"rdtscp\", \"ht\", \"pse\", \"lahf_lm\", \"abm\", \"popcnt\", \"mca\", \"pdpe1gb\", \"apic\", \"sse\", \"f16c\", \"pni\", \"aes\", \"avx2\", \"sse2\", \"ss\", \"hypervisor\", \"bmi1\", \"bmi2\", \"pcid\", \"fpu\", \"cx16\", \"pse36\", \"mtrr\", \"movbe\", \"rdrand\", \"x2apic\"], \"topology\": {\"cores\": 8, \"cells\": 1, \"threads\": 1, \"sockets\": 1}}", "running_vms": 0, "service": {"host": "compute9", "disabled_reason": null, "id": 14}, "disk_available_least": 3, "free_disk_gb": 46, "free_ram_mb": 5934, "status": "enabled", "id": 14, "local_gb": 48, "current_workload": 0}, {"local_gb_used": 32, "vcpus_used": 6, "hypervisor_hostname": "compute10.openstack.local", "vcpus": 8, "host_ip": "172.29.236.122", "memory_mb_used": 5120, "memory_mb": 7982, "hypervisor_version": 2005000, "hypervisor_type": "QEMU", "state": "up", "cpu_info": "{\"vendor\": \"Intel\", \"model\": \"Haswell-noTSX-IBRS\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"clflush\", \"sep\", \"syscall\", \"vme\", \"invpcid\", \"tsc\", \"fsgsbase\", \"xsave\", \"spec-ctrl\", \"vmx\", \"erms\", \"cmov\", \"smep\", \"ssse3\", \"pat\", \"lm\", \"msr\", \"nx\", \"fxsr\", \"sse4.1\", \"pae\", \"sse4.2\", \"pclmuldq\", \"ssbd\", \"fma\", \"tsc-deadline\", \"mmx\", \"osxsave\", \"cx8\", \"mce\", \"de\", \"rdtscp\", \"ht\", \"pse\", \"lahf_lm\", \"abm\", \"popcnt\", \"mca\", \"pdpe1gb\", \"apic\", \"sse\", \"f16c\", \"pni\", \"aes\", \"avx2\", \"sse2\", \"ss\", \"hypervisor\", \"bmi1\", \"bmi2\", \"pcid\", \"fpu\", \"cx16\", \"pse36\", \"mtrr\", \"movbe\", \"rdrand\", \"x2apic\"], \"topology\": {\"cores\": 8, \"cells\": 1, \"threads\": 1, \"sockets\": 1}}", "running_vms": 3, "service": {"host": "compute10", "disabled_reason": null, "id": 15}, "disk_available_least": 3, "free_disk_gb": 16, "free_ram_mb": 2862, "status": "enabled", "id": 15, "local_gb": 48, "current_workload": 0}]}
\ No newline at end of file
diff --git a/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_os-hypervisors_uptime.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_os-hypervisors_uptime.json
new file mode 100644
index 0000000000000..a0a046c4569ab
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_os-hypervisors_uptime.json
@@ -0,0 +1 @@
+{"hypervisor": {"hypervisor_hostname": "fake-mini", "id": 1, "state": "up", "status": "enabled", "uptime": " 08:32:11 up 93 days, 18:25, 12 users,  load average: 0.20, 0.12, 0.14"}}
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_1b7a987f-c4fb-4b6b-aad9-3b461df2019d_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_1b7a987f-c4fb-4b6b-aad9-3b461df2019d_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_1b7a987f-c4fb-4b6b-aad9-3b461df2019d_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_1b7a987f-c4fb-4b6b-aad9-3b461df2019d_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_1cc21586-8d43-40ea-bdc9-6f54a79957b4_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_1cc21586-8d43-40ea-bdc9-6f54a79957b4_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_1cc21586-8d43-40ea-bdc9-6f54a79957b4_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_1cc21586-8d43-40ea-bdc9-6f54a79957b4_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_2e1ce152-b19d-4c4a-9cc7-0d150fa97a18_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_2e1ce152-b19d-4c4a-9cc7-0d150fa97a18_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_2e1ce152-b19d-4c4a-9cc7-0d150fa97a18_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_2e1ce152-b19d-4c4a-9cc7-0d150fa97a18_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_30888944-fb39-4590-9073-ef977ac1f039_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_30888944-fb39-4590-9073-ef977ac1f039_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_30888944-fb39-4590-9073-ef977ac1f039_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_30888944-fb39-4590-9073-ef977ac1f039_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_412c79b2-25f2-44d6-8e3b-be4baee11a7f_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_412c79b2-25f2-44d6-8e3b-be4baee11a7f_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_412c79b2-25f2-44d6-8e3b-be4baee11a7f_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_412c79b2-25f2-44d6-8e3b-be4baee11a7f_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_4ceb4c69-a332-4b9d-907b-e99635aae644_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_4ceb4c69-a332-4b9d-907b-e99635aae644_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_4ceb4c69-a332-4b9d-907b-e99635aae644_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_4ceb4c69-a332-4b9d-907b-e99635aae644_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_4d7cb923-788f-4b61-9061-abfc576ecc1a_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_4d7cb923-788f-4b61-9061-abfc576ecc1a_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_4d7cb923-788f-4b61-9061-abfc576ecc1a_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_4d7cb923-788f-4b61-9061-abfc576ecc1a_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_52561f29-e479-43d7-85de-944d29ef178d_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_52561f29-e479-43d7-85de-944d29ef178d_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_52561f29-e479-43d7-85de-944d29ef178d_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_52561f29-e479-43d7-85de-944d29ef178d_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_5357e70e-f12c-4bb7-85a2-b40d642a7e92_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_5357e70e-f12c-4bb7-85a2-b40d642a7e92_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_5357e70e-f12c-4bb7-85a2-b40d642a7e92_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_5357e70e-f12c-4bb7-85a2-b40d642a7e92_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_57030997-f1b5-4f79-9429-8cb285318633_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_57030997-f1b5-4f79-9429-8cb285318633_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_57030997-f1b5-4f79-9429-8cb285318633_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_57030997-f1b5-4f79-9429-8cb285318633_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_7324440d-915b-4e12-8b85-ec8c9a524d6c_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_7324440d-915b-4e12-8b85-ec8c9a524d6c_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_7324440d-915b-4e12-8b85-ec8c9a524d6c_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_7324440d-915b-4e12-8b85-ec8c9a524d6c_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_7e622c28-4b12-4a58-8ac2-4a2e854f84eb_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_7e622c28-4b12-4a58-8ac2-4a2e854f84eb_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_7e622c28-4b12-4a58-8ac2-4a2e854f84eb_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_7e622c28-4b12-4a58-8ac2-4a2e854f84eb_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_7eaa751c-1e37-4963-a836-0a28bc283a9a_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_7eaa751c-1e37-4963-a836-0a28bc283a9a_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_7eaa751c-1e37-4963-a836-0a28bc283a9a_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_7eaa751c-1e37-4963-a836-0a28bc283a9a_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_836f724f-0028-4dc0-b9bd-e0843d767ca2_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_836f724f-0028-4dc0-b9bd-e0843d767ca2_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_836f724f-0028-4dc0-b9bd-e0843d767ca2_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_836f724f-0028-4dc0-b9bd-e0843d767ca2_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_acb4197c-f54e-488e-a40a-1b7f59cc9117_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_acb4197c-f54e-488e-a40a-1b7f59cc9117_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_acb4197c-f54e-488e-a40a-1b7f59cc9117_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_acb4197c-f54e-488e-a40a-1b7f59cc9117_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_b3c8eee3-7e22-4a7c-9745-759073673cbe_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_b3c8eee3-7e22-4a7c-9745-759073673cbe_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_b3c8eee3-7e22-4a7c-9745-759073673cbe_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_b3c8eee3-7e22-4a7c-9745-759073673cbe_diagnostics.json
diff --git a/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_detail.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_detail.json
new file mode 100644
index 0000000000000..9f33cc6e1e804
--- /dev/null
+++ b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_detail.json
@@ -0,0 +1 @@
+{"servers": [{"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:fa:af:ec", "version": 4, "addr": "10.0.0.29", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/57030997-f1b5-4f79-9429-8cb285318633", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/57030997-f1b5-4f79-9429-8cb285318633", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-00000049", "OS-SRV-USG:launched_at": "2018-09-06T17:58:33.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "57030997-f1b5-4f79-9429-8cb285318633", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-09-06T17:58:33Z", "hostId": "1aad0cf1b6b677fd293b8d6a445ed37186ad540250ab3d93b309859b", "OS-EXT-SRV-ATTR:host": "compute4", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute4.openstack.local", "name": "blacklistServer", "created": "2018-09-06T17:57:38Z", "tenant_id": "***************************73dbe", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:fd:72:ff", "version": 4, "addr": "10.0.0.27", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/7324440d-915b-4e12-8b85-ec8c9a524d6c", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/7324440d-915b-4e12-8b85-ec8c9a524d6c", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-00000048", "OS-SRV-USG:launched_at": "2018-09-06T17:54:56.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "7324440d-915b-4e12-8b85-ec8c9a524d6c", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-10-30T14:28:14Z", "hostId": "c457d054e8e619fe3bb0ff756ef7d7ff1adf84031379a91291984a32", "OS-EXT-SRV-ATTR:host": "compute7", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute7.openstack.local", "name": "blacklist", "created": "2018-09-06T17:54:32Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:0c:17:0e", "version": 4, "addr": "10.0.0.26", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/836f724f-0028-4dc0-b9bd-e0843d767ca2", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/836f724f-0028-4dc0-b9bd-e0843d767ca2", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-00000044", "OS-SRV-USG:launched_at": "2018-08-28T21:31:10.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "836f724f-0028-4dc0-b9bd-e0843d767ca2", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-10-30T14:28:51Z", "hostId": "c457d054e8e619fe3bb0ff756ef7d7ff1adf84031379a91291984a32", "OS-EXT-SRV-ATTR:host": "compute7", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute7.openstack.local", "name": "finalDestination-8", "created": "2018-08-28T21:30:09Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:ca:63:58", "version": 4, "addr": "10.0.0.11", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/1cc21586-8d43-40ea-bdc9-6f54a79957b4", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/1cc21586-8d43-40ea-bdc9-6f54a79957b4", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-00000043", "OS-SRV-USG:launched_at": "2018-08-28T21:31:07.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "1cc21586-8d43-40ea-bdc9-6f54a79957b4", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-28T21:31:07Z", "hostId": "976f9000397fa853e174f15a55078a8297712a9c5005d2f6009af0ec", "OS-EXT-SRV-ATTR:host": "compute8", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute8.openstack.local", "name": "finalDestination-7", "created": "2018-08-28T21:30:09Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:fd:a9:fc", "version": 4, "addr": "10.0.0.16", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/acb4197c-f54e-488e-a40a-1b7f59cc9117", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/acb4197c-f54e-488e-a40a-1b7f59cc9117", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-00000042", "OS-SRV-USG:launched_at": "2018-08-28T21:31:07.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "acb4197c-f54e-488e-a40a-1b7f59cc9117", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-28T21:31:07Z", "hostId": "935f7d4e027a256785942c3e8173b02efc5a8a4531ede52d7871adb9", "OS-EXT-SRV-ATTR:host": "compute10", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute10.openstack.local", "name": "finalDestination-6", "created": "2018-08-28T21:30:09Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:18:51:79", "version": 4, "addr": "10.0.0.21", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/5357e70e-f12c-4bb7-85a2-b40d642a7e92", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/5357e70e-f12c-4bb7-85a2-b40d642a7e92", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-00000041", "OS-SRV-USG:launched_at": "2018-08-28T21:31:02.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "5357e70e-f12c-4bb7-85a2-b40d642a7e92", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-28T21:31:02Z", "hostId": "666fc5e7cbf246b9ea99396e890265fb556e8bc527308f93d76d10a3", "OS-EXT-SRV-ATTR:host": "compute5", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute5.openstack.local", "name": "finalDestination-5", "created": "2018-08-28T21:30:08Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:90:46:f2", "version": 4, "addr": "10.0.0.22", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/7e622c28-4b12-4a58-8ac2-4a2e854f84eb", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/7e622c28-4b12-4a58-8ac2-4a2e854f84eb", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-00000040", "OS-SRV-USG:launched_at": "2018-08-28T21:31:28.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "7e622c28-4b12-4a58-8ac2-4a2e854f84eb", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-10-30T14:28:52Z", "hostId": "c457d054e8e619fe3bb0ff756ef7d7ff1adf84031379a91291984a32", "OS-EXT-SRV-ATTR:host": "compute7", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute7.openstack.local", "name": "finalDestination-4", "created": "2018-08-28T21:30:08Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:ff:4e:d6", "version": 4, "addr": "10.0.0.3", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/52561f29-e479-43d7-85de-944d29ef178d", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/52561f29-e479-43d7-85de-944d29ef178d", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-0000003e", "OS-SRV-USG:launched_at": "2018-08-28T21:31:06.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "52561f29-e479-43d7-85de-944d29ef178d", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-28T21:31:06Z", "hostId": "976f9000397fa853e174f15a55078a8297712a9c5005d2f6009af0ec", "OS-EXT-SRV-ATTR:host": "compute8", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute8.openstack.local", "name": "finalDestination-2", "created": "2018-08-28T21:30:08Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:ea:21:2e", "version": 4, "addr": "10.0.0.13", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/4d7cb923-788f-4b61-9061-abfc576ecc1a", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/4d7cb923-788f-4b61-9061-abfc576ecc1a", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-0000003d", "OS-SRV-USG:launched_at": "2018-08-28T21:30:45.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "4d7cb923-788f-4b61-9061-abfc576ecc1a", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-30T18:02:12Z", "hostId": "935f7d4e027a256785942c3e8173b02efc5a8a4531ede52d7871adb9", "OS-EXT-SRV-ATTR:host": "compute10", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute10.openstack.local", "name": "finalDestination-1", "created": "2018-08-28T21:30:08Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:94:44:4f", "version": 4, "addr": "10.0.0.15", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/ff2f581c-5d03-4a27-a0ba-f102603fe38f", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/ff2f581c-5d03-4a27-a0ba-f102603fe38f", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-0000003c", "OS-SRV-USG:launched_at": "2018-08-28T21:28:20.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "ff2f581c-5d03-4a27-a0ba-f102603fe38f", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-28T21:28:20Z", "hostId": "2e0f037ec53ab532b4d57191af2382d562a863f17ce66592c9bd7fa4", "OS-EXT-SRV-ATTR:host": "compute4", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute4.openstack.local", "name": "server_take_zero-2", "created": "2018-08-28T21:27:55Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:bb:13:9c", "version": 4, "addr": "10.0.0.10", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/7eaa751c-1e37-4963-a836-0a28bc283a9a", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/7eaa751c-1e37-4963-a836-0a28bc283a9a", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-0000003b", "OS-SRV-USG:launched_at": "2018-08-28T21:28:44.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "7eaa751c-1e37-4963-a836-0a28bc283a9a", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-28T21:28:45Z", "hostId": "2e0f037ec53ab532b4d57191af2382d562a863f17ce66592c9bd7fa4", "OS-EXT-SRV-ATTR:host": "compute4", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute4.openstack.local", "name": "server_take_zero-1", "created": "2018-08-28T21:27:55Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:9f:25:1a", "version": 4, "addr": "10.0.0.23", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/4ceb4c69-a332-4b9d-907b-e99635aae644", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/4ceb4c69-a332-4b9d-907b-e99635aae644", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-0000003a", "OS-SRV-USG:launched_at": "2018-08-28T21:24:22.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "4ceb4c69-a332-4b9d-907b-e99635aae644", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-28T21:24:22Z", "hostId": "666fc5e7cbf246b9ea99396e890265fb556e8bc527308f93d76d10a3", "OS-EXT-SRV-ATTR:host": "compute5", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute5.openstack.local", "name": "moarserver-13", "created": "2018-08-28T21:23:08Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:f3:33:58", "version": 4, "addr": "10.0.0.14", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/30888944-fb39-4590-9073-ef977ac1f039", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/30888944-fb39-4590-9073-ef977ac1f039", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-0000002d", "OS-SRV-USG:launched_at": "2018-08-28T21:04:22.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "30888944-fb39-4590-9073-ef977ac1f039", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-30T17:58:51Z", "hostId": "935f7d4e027a256785942c3e8173b02efc5a8a4531ede52d7871adb9", "OS-EXT-SRV-ATTR:host": "compute10", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute10.openstack.local", "name": "anotherServer", "created": "2018-08-28T21:03:57Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:f7:c5:e6", "version": 4, "addr": "10.0.0.12", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/b3c8eee3-7e22-4a7c-9745-759073673cbe", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/b3c8eee3-7e22-4a7c-9745-759073673cbe", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-00000025", "OS-SRV-USG:launched_at": "2018-08-20T15:23:32.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "b3c8eee3-7e22-4a7c-9745-759073673cbe", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-10-30T14:28:29Z", "hostId": "4f626f6cfa8254516f9878d09dfd657cea28d7260eaa23dd65f5f138", "OS-EXT-SRV-ATTR:host": "compute2", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute2.openstack.local", "name": "jnrgjoner", "created": "2018-08-20T15:23:05Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:34:5e:38", "version": 4, "addr": "10.0.0.5", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/412c79b2-25f2-44d6-8e3b-be4baee11a7f", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/412c79b2-25f2-44d6-8e3b-be4baee11a7f", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-00000024", "OS-SRV-USG:launched_at": "2018-08-16T22:46:46.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "412c79b2-25f2-44d6-8e3b-be4baee11a7f", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-31T17:32:20Z", "hostId": "4f626f6cfa8254516f9878d09dfd657cea28d7260eaa23dd65f5f138", "OS-EXT-SRV-ATTR:host": "compute2", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute2.openstack.local", "name": "ReadyServerOne", "created": "2018-08-16T22:46:24Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:25:1a:f2", "version": 4, "addr": "10.0.0.7", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/1b7a987f-c4fb-4b6b-aad9-3b461df2019d", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/1b7a987f-c4fb-4b6b-aad9-3b461df2019d", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-00000023", "OS-SRV-USG:launched_at": "2018-08-16T22:40:32.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "1b7a987f-c4fb-4b6b-aad9-3b461df2019d", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-10-30T14:28:58Z", "hostId": "4f626f6cfa8254516f9878d09dfd657cea28d7260eaa23dd65f5f138", "OS-EXT-SRV-ATTR:host": "compute2", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute2.openstack.local", "name": "HoneyIShrunkTheServer", "created": "2018-08-16T22:40:09Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:b1:9c:61", "version": 4, "addr": "10.0.0.9", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/2e1ce152-b19d-4c4a-9cc7-0d150fa97a18", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/2e1ce152-b19d-4c4a-9cc7-0d150fa97a18", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-0000001c", "OS-SRV-USG:launched_at": "2018-08-16T22:09:40.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "2e1ce152-b19d-4c4a-9cc7-0d150fa97a18", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-30T17:57:11Z", "hostId": "afd50e73c26264d238f90ad731717d11d1b7dd31f04670c5cb2d1b7c", "OS-EXT-SRV-ATTR:host": "compute1", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute1.openstack.local", "name": "Rocky", "created": "2018-08-16T22:09:09Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}, {"OS-EXT-STS:task_state": null, "addresses": {"net3": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:39:02:af", "version": 4, "addr": "10.0.0.6", "OS-EXT-IPS:type": "fixed"}]}, "links": [{"href": "http://10.0.2.15:8774/v2.1/***************************4bfc1/servers/f2dd3f90-e738-4135-84d4-1a2d30d04929", "rel": "self"}, {"href": "http://10.0.2.15:8774/***************************4bfc1/servers/f2dd3f90-e738-4135-84d4-1a2d30d04929", "rel": "bookmark"}], "image": {"id": "88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/images/88479e3e-2b19-4432-8eb0-d041e7ed6f8e", "rel": "bookmark"}]}, "OS-EXT-STS:vm_state": "active", "OS-EXT-SRV-ATTR:instance_name": "instance-0000001b", "OS-SRV-USG:launched_at": "2018-08-16T21:31:03.000000", "flavor": {"id": "10", "links": [{"href": "http://10.0.2.15:8774/***************************4bfc1/flavors/10", "rel": "bookmark"}]}, "id": "f2dd3f90-e738-4135-84d4-1a2d30d04929", "user_id": "***************************50859", "OS-DCF:diskConfig": "AUTO", "accessIPv4": "", "accessIPv6": "", "progress": 0, "OS-EXT-STS:power_state": 1, "OS-EXT-AZ:availability_zone": "nova", "metadata": {}, "status": "ACTIVE", "updated": "2018-08-20T16:23:01Z", "hostId": "afd50e73c26264d238f90ad731717d11d1b7dd31f04670c5cb2d1b7c", "OS-EXT-SRV-ATTR:host": "compute1", "OS-SRV-USG:terminated_at": null, "key_name": null, "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute1.openstack.local", "name": "jenga", "created": "2018-08-16T21:30:35Z", "tenant_id": "***************************3fb11", "os-extended-volumes:volumes_attached": [], "config_drive": ""}]}
\ No newline at end of file
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_f2dd3f90-e738-4135-84d4-1a2d30d04929_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_f2dd3f90-e738-4135-84d4-1a2d30d04929_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_f2dd3f90-e738-4135-84d4-1a2d30d04929_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_f2dd3f90-e738-4135-84d4-1a2d30d04929_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v2.1_4bfc1_servers_ff2f581c-5d03-4a27-a0ba-f102603fe38f_diagnostics.json b/openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_ff2f581c-5d03-4a27-a0ba-f102603fe38f_diagnostics.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v2.1_4bfc1_servers_ff2f581c-5d03-4a27-a0ba-f102603fe38f_diagnostics.json
rename to openstack_controller/tests/legacy/fixtures/v2.1_4bfc1_servers_ff2f581c-5d03-4a27-a0ba-f102603fe38f_diagnostics.json
diff --git a/openstack_controller/tests/fixtures/v3_projects.json b/openstack_controller/tests/legacy/fixtures/v3_projects.json
similarity index 100%
rename from openstack_controller/tests/fixtures/v3_projects.json
rename to openstack_controller/tests/legacy/fixtures/v3_projects.json
diff --git a/openstack_controller/tests/legacy/terraform/main.tf b/openstack_controller/tests/legacy/terraform/main.tf
new file mode 100644
index 0000000000000..3b1df913c883b
--- /dev/null
+++ b/openstack_controller/tests/legacy/terraform/main.tf
@@ -0,0 +1,53 @@
+# Shared common terraform config found in the templates/terraform folder in datadog_checks_dev
+resource "google_compute_instance" "devstack" {
+  name = replace("devstack-${var.user}-${random_string.suffix.result}", ".", "-")
+  machine_type = "n1-standard-4"
+
+  tags = ["openstack", "lab"]
+
+  boot_disk {
+    initialize_params {
+      image = "ubuntu-os-cloud/ubuntu-1804-lts"
+      size = 100
+    }
+  }
+
+  network_interface {
+    network = "default"
+    access_config {
+    }
+  }
+
+  metadata = {
+    enable-oslogin = "TRUE"
+    ssh-keys = "ubuntu:${tls_private_key.ssh-key.public_key_openssh} ubuntu"
+  }
+
+  connection {
+    type = "ssh"
+    user = "ubuntu"
+    private_key = "${tls_private_key.ssh-key.private_key_pem}"
+    host = "${google_compute_instance.devstack.network_interface.0.access_config.0.nat_ip}"
+  }
+
+  provisioner "remote-exec" {
+    script = "script.sh"
+  }
+}
+
+output "ip" {
+  value = "${google_compute_instance.devstack.network_interface.0.access_config.0.nat_ip}"
+}
+
+output "internal_ip" {
+  value = "${google_compute_instance.devstack.network_interface.0.network_ip}"
+}
+
+output "ssh_private_key" {
+  value = "${tls_private_key.ssh-key.private_key_pem}"
+  sensitive = true
+}
+
+output "ssh_public_key" {
+  value = "${tls_private_key.ssh-key.public_key_openssh}"
+}
diff --git a/openstack_controller/tests/terraform/script.sh b/openstack_controller/tests/legacy/terraform/script.sh
similarity index 100%
rename from openstack_controller/tests/terraform/script.sh
rename to openstack_controller/tests/legacy/terraform/script.sh
diff --git a/openstack_controller/tests/test_config.py b/openstack_controller/tests/legacy/test_config.py
similarity index 87%
rename from openstack_controller/tests/test_config.py
rename to openstack_controller/tests/legacy/test_config.py
index 63523c73e8627..7d2c25628ad7a 100644
--- a/openstack_controller/tests/test_config.py
+++ b/openstack_controller/tests/legacy/test_config.py
@@ -1,15 +1,25 @@
 # (C) Datadog, Inc. 2023-present
 # All rights reserved
 # Licensed under a 3-clause BSD style license (see LICENSE)
+
 import logging
+import os
 import re
 
 import pytest
 
-from datadog_checks.openstack_controller import OpenStackControllerCheck
+from datadog_checks.openstack_controller.legacy.openstack_controller_legacy import OpenStackControllerLegacyCheck
 
 from .common import CHECK_NAME, TEST_OPENSTACK_NO_AUTH_CONFIG_PATH
 
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(
+        os.environ.get('OPENSTACK_E2E_LEGACY') is None or os.environ.get('OPENSTACK_E2E_LEGACY') == 'false',
+        reason='Legacy test',
+    ),
+]
+
 
 @pytest.mark.parametrize(
     'instance, exception_msg',
@@ -27,7 +37,7 @@
 )
 def test_config_invalid(instance, exception_msg, dd_run_check):
 
-    check = OpenStackControllerCheck(CHECK_NAME, {}, [instance])
+    check = OpenStackControllerLegacyCheck(CHECK_NAME, {}, [instance])
 
     with pytest.raises(Exception, match=exception_msg):
         dd_run_check(check)
@@ -69,7 +79,7 @@ def test_config_invalid(instance, exception_msg, dd_run_check):
 )
 def test_config_invalid_openstack_auth(instance, exception_msg, dd_run_check):
 
-    check = OpenStackControllerCheck(CHECK_NAME, {}, [instance])
+    check = OpenStackControllerLegacyCheck(CHECK_NAME, {}, [instance])
 
     with pytest.raises(Exception, match=exception_msg):
         dd_run_check(check)
@@ -116,7 +126,7 @@ def test_config_invalid_openstack_auth(instance, exception_msg, dd_run_check):
 def test_config_warning(instance, warning_msg, caplog, dd_run_check):
     caplog.set_level(logging.WARN)
 
-    check = OpenStackControllerCheck(CHECK_NAME, {}, [instance])
+    check = OpenStackControllerLegacyCheck(CHECK_NAME, {}, [instance])
 
     dd_run_check(check)
     assert warning_msg in caplog.text
diff --git a/openstack_controller/tests/legacy/test_e2e.py b/openstack_controller/tests/legacy/test_e2e.py
new file mode 100644
index 0000000000000..e61f9abc0f4f6
--- /dev/null
+++ b/openstack_controller/tests/legacy/test_e2e.py
@@ -0,0 +1,34 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+import os
+
+import pytest
+
+from datadog_checks.base import AgentCheck
+from tests.legacy.common import DEFAULT_METRICS
+
+pytestmark = [
+    pytest.mark.e2e,
+    pytest.mark.skipif(
+        os.environ.get('OPENSTACK_E2E_LEGACY') is None or os.environ.get('OPENSTACK_E2E_LEGACY') == 'false',
+        reason='Legacy test',
+    ),
+]
+
+
+def test_check(dd_agent_check):
+    aggregator = dd_agent_check()
+
+    # assert default metrics
+    for metric in DEFAULT_METRICS:
+        aggregator.assert_metric(metric)
+    aggregator.assert_all_metrics_covered()
+
+    # assert service checks
+    aggregator.assert_service_check('openstack.neutron.api.up', AgentCheck.OK, count=1)
+    aggregator.assert_service_check('openstack.nova.api.up', AgentCheck.OK, count=1)
+    aggregator.assert_service_check('openstack.keystone.api.up', AgentCheck.OK, count=1)
+    aggregator.assert_service_check('openstack.nova.hypervisor.up', AgentCheck.OK, count=10)
+    aggregator.assert_service_check('openstack.neutron.network.up', AgentCheck.OK, count=2)
diff --git a/openstack_controller/tests/test_metrics.py b/openstack_controller/tests/legacy/test_metrics.py
similarity index 99%
rename from openstack_controller/tests/test_metrics.py
rename to openstack_controller/tests/legacy/test_metrics.py
index 576de9c6acf5c..744486740ac30 100644
--- a/openstack_controller/tests/test_metrics.py
+++ b/openstack_controller/tests/legacy/test_metrics.py
@@ -1,15 +1,23 @@
-# (C) Datadog, Inc. 2018-present
+# (C) Datadog, Inc. 2023-present
 # All rights reserved
-# Licensed under Simplified BSD License (see LICENSE)
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
 import json
 import os
 
 import mock
 import pytest
 
-from datadog_checks.openstack_controller import OpenStackControllerCheck
+import tests.legacy.common as common
+from datadog_checks.openstack_controller.legacy.openstack_controller_legacy import OpenStackControllerLegacyCheck
 
-from . import common
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(
+        os.environ.get('OPENSTACK_E2E_LEGACY') is None or os.environ.get('OPENSTACK_E2E_LEGACY') == 'false',
+        reason='Legacy test',
+    ),
+]
 
 
 def make_request_responses(url, params=None, timeout=None):
@@ -170,11 +178,13 @@ def json(self):
         return self.response_dict
 
 
-@mock.patch('datadog_checks.openstack_controller.api.SimpleApi._make_request', side_effect=make_request_responses)
+@mock.patch(
+    'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request', side_effect=make_request_responses
+)
 def test_scenario(make_request, aggregator):
     instance = common.MOCK_CONFIG["instances"][0]
     init_config = common.MOCK_CONFIG['init_config']
-    check = OpenStackControllerCheck('openstack_controller', init_config, [instance])
+    check = OpenStackControllerLegacyCheck('openstack_controller', init_config, [instance])
 
     auth_tokens_response_path = os.path.join(common.FIXTURES_DIR, "auth_tokens_response.json")
     with open(auth_tokens_response_path, 'r') as f:
@@ -188,10 +198,11 @@ def test_scenario(make_request, aggregator):
         auth_projects_response = json.loads(f.read())
 
     with mock.patch(
-        'datadog_checks.openstack_controller.api.Authenticator._post_auth_token', return_value=auth_tokens_response
+        'datadog_checks.openstack_controller.legacy.api.Authenticator._post_auth_token',
+        return_value=auth_tokens_response,
     ):
         with mock.patch(
-            'datadog_checks.openstack_controller.api.Authenticator._get_auth_projects',
+            'datadog_checks.openstack_controller.legacy.api.Authenticator._get_auth_projects',
             return_value=auth_projects_response,
         ):
             check.check(common.MOCK_CONFIG['instances'][0])
@@ -7130,12 +7141,14 @@ def test_scenario(make_request, aggregator):
         pytest.param('auth_tokens_no_role_response.json', id='no roles'),
     ],
 )
-@mock.patch('datadog_checks.openstack_controller.api.SimpleApi._make_request', side_effect=make_request_responses)
+@mock.patch(
+    'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request', side_effect=make_request_responses
+)
 def test_auth_tokens(make_request, aggregator, auth_tokens_path):
     # Ensure that the check can collect data when multiple or no roles are defined
     instance = common.MOCK_CONFIG["instances"][0]
     init_config = common.MOCK_CONFIG['init_config']
-    check = OpenStackControllerCheck('openstack_controller', init_config, [instance])
+    check = OpenStackControllerLegacyCheck('openstack_controller', init_config, [instance])
 
     auth_tokens_response_path = os.path.join(common.FIXTURES_DIR, auth_tokens_path)
     with open(auth_tokens_response_path, 'r') as f:
@@ -7149,10 +7162,11 @@ def test_auth_tokens(make_request, aggregator, auth_tokens_path):
         auth_projects_response = json.loads(f.read())
 
     with mock.patch(
-        'datadog_checks.openstack_controller.api.Authenticator._post_auth_token', return_value=auth_tokens_response
+        'datadog_checks.openstack_controller.legacy.api.Authenticator._post_auth_token',
+        return_value=auth_tokens_response,
     ):
         with mock.patch(
-            'datadog_checks.openstack_controller.api.Authenticator._get_auth_projects',
+            'datadog_checks.openstack_controller.legacy.api.Authenticator._get_auth_projects',
             return_value=auth_projects_response,
         ):
             check.check(common.MOCK_CONFIG['instances'][0])
diff --git a/openstack_controller/tests/test_openstack.py b/openstack_controller/tests/legacy/test_openstack.py
similarity index 84%
rename from openstack_controller/tests/test_openstack.py
rename to openstack_controller/tests/legacy/test_openstack.py
index e711fa2e2883f..50461fe84ef42 100644
--- a/openstack_controller/tests/test_openstack.py
+++ b/openstack_controller/tests/legacy/test_openstack.py
@@ -1,8 +1,10 @@
-# (C) Datadog, Inc. 2018-present
+# (C) Datadog, Inc. 2023-present
 # All rights reserved
-# Licensed under Simplified BSD License (see LICENSE)
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
 import copy
 import logging
+import os
 from copy import deepcopy
 
 import mock
@@ -11,20 +13,26 @@
 from requests.exceptions import HTTPError
 
 from datadog_checks.base import AgentCheck
-from datadog_checks.openstack_controller import OpenStackControllerCheck
-from datadog_checks.openstack_controller.api import AbstractApi, Authenticator, SimpleApi
-from datadog_checks.openstack_controller.exceptions import IncompleteConfig, KeystoneUnreachable
+from datadog_checks.openstack_controller.legacy.api import AbstractApi, Authenticator, SimpleApi
+from datadog_checks.openstack_controller.legacy.exceptions import IncompleteConfig, KeystoneUnreachable
+from datadog_checks.openstack_controller.legacy.openstack_controller_legacy import OpenStackControllerLegacyCheck
 
 from . import common
 
-pytestmark = pytest.mark.unit
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(
+        os.environ.get('OPENSTACK_E2E_LEGACY') is None or os.environ.get('OPENSTACK_E2E_LEGACY') == 'false',
+        reason='Legacy test',
+    ),
+]
 
 
 def test_parse_uptime_string(aggregator):
     instance = copy.deepcopy(common.KEYSTONE_INSTANCE)
     instance['tags'] = ['optional:tag1']
     init_config = common.MOCK_CONFIG['init_config']
-    check = OpenStackControllerCheck('openstack_controller', init_config, [instance])
+    check = OpenStackControllerLegacyCheck('openstack_controller', init_config, [instance])
     response = u' 16:53:48 up 1 day, 21:34,  3 users,  load average: 0.04, 0.14, 0.19\n'
     uptime_parsed = check._parse_uptime_string(response)
     assert uptime_parsed == [0.04, 0.14, 0.19]
@@ -53,7 +61,7 @@ def test_api_error_log_no_password(check, instance, caplog):
 
 
 @mock.patch(
-    'datadog_checks.openstack_controller.OpenStackControllerCheck.get_servers_detail',
+    'datadog_checks.openstack_controller.legacy.openstack_controller_legacy.OpenStackControllerLegacyCheck.get_servers_detail',
     return_value=common.MOCK_NOVA_SERVERS,
 )
 def test_populate_servers_cache_between_runs(servers_detail, aggregator):
@@ -61,7 +69,7 @@ def test_populate_servers_cache_between_runs(servers_detail, aggregator):
     Ensure the cache contains the expected VMs between check runs.
     """
 
-    check = OpenStackControllerCheck("test", {'ssl_verify': False}, [common.KEYSTONE_INSTANCE])
+    check = OpenStackControllerLegacyCheck("test", {'ssl_verify': False}, [common.KEYSTONE_INSTANCE])
 
     # Start off with a list of servers
     check.servers_cache = copy.deepcopy(common.SERVERS_CACHE_MOCK)
@@ -82,14 +90,14 @@ def test_populate_servers_cache_between_runs(servers_detail, aggregator):
 
 
 @mock.patch(
-    'datadog_checks.openstack_controller.OpenStackControllerCheck.get_servers_detail',
+    'datadog_checks.openstack_controller.legacy.openstack_controller_legacy.OpenStackControllerLegacyCheck.get_servers_detail',
     return_value=common.MOCK_NOVA_SERVERS,
 )
 def test_populate_servers_cache_with_project_name_none(servers_detail, aggregator):
     """
     Ensure the cache contains the expected VMs between check runs.
     """
-    check = OpenStackControllerCheck("test", {'ssl_verify': False}, [copy.deepcopy(common.KEYSTONE_INSTANCE)])
+    check = OpenStackControllerLegacyCheck("test", {'ssl_verify': False}, [copy.deepcopy(common.KEYSTONE_INSTANCE)])
 
     # Start off with a list of servers
     check.servers_cache = copy.deepcopy(common.SERVERS_CACHE_MOCK)
@@ -109,9 +117,11 @@ def test_populate_servers_cache_with_project_name_none(servers_detail, aggregato
     assert 'other-2' in servers
 
 
-@mock.patch('datadog_checks.openstack_controller.api.ApiFactory.create', return_value=mock.MagicMock(AbstractApi))
+@mock.patch(
+    'datadog_checks.openstack_controller.legacy.api.ApiFactory.create', return_value=mock.MagicMock(AbstractApi)
+)
 def test_check(mock_api, aggregator):
-    check = OpenStackControllerCheck("test", {'ssl_verify': False}, [common.KEYSTONE_INSTANCE])
+    check = OpenStackControllerLegacyCheck("test", {'ssl_verify': False}, [common.KEYSTONE_INSTANCE])
 
     check.check(common.KEYSTONE_INSTANCE)
 
@@ -121,9 +131,11 @@ def test_check(mock_api, aggregator):
     mock_api.assert_called_with(ANY, common.KEYSTONE_INSTANCE, ANY)
 
 
-@mock.patch('datadog_checks.openstack_controller.api.ApiFactory.create', return_value=mock.MagicMock(AbstractApi))
+@mock.patch(
+    'datadog_checks.openstack_controller.legacy.api.ApiFactory.create', return_value=mock.MagicMock(AbstractApi)
+)
 def test_check_with_config_file(mock_api, aggregator):
-    check = OpenStackControllerCheck("test", {'ssl_verify': False}, [common.CONFIG_FILE_INSTANCE])
+    check = OpenStackControllerLegacyCheck("test", {'ssl_verify': False}, [common.CONFIG_FILE_INSTANCE])
 
     check.check(common.CONFIG_FILE_INSTANCE)
 
@@ -140,7 +152,7 @@ def get_server_details_response(params):
 
 
 @mock.patch(
-    'datadog_checks.openstack_controller.OpenStackControllerCheck.get_servers_detail',
+    'datadog_checks.openstack_controller.legacy.openstack_controller_legacy.OpenStackControllerLegacyCheck.get_servers_detail',
     side_effect=get_server_details_response,
 )
 def test_get_paginated_server(servers_detail, aggregator):
@@ -148,7 +160,7 @@ def test_get_paginated_server(servers_detail, aggregator):
     Ensure the server cache is updated while using pagination
     """
 
-    check = OpenStackControllerCheck(
+    check = OpenStackControllerLegacyCheck(
         "test", {'ssl_verify': False, 'paginated_server_limit': 1}, [common.KEYSTONE_INSTANCE]
     )
     check.populate_servers_cache({'testproj': {"id": "6f70656e737461636b20342065766572", "name": "testproj"}}, [])
@@ -203,15 +215,15 @@ def get_server_diagnostics_pre_2_48_response(server_id):
 
 
 @mock.patch(
-    'datadog_checks.openstack_controller.OpenStackControllerCheck.get_server_diagnostics',
+    'datadog_checks.openstack_controller.legacy.openstack_controller_legacy.OpenStackControllerLegacyCheck.get_server_diagnostics',
     side_effect=get_server_diagnostics_pre_2_48_response,
 )
 @mock.patch(
-    'datadog_checks.openstack_controller.OpenStackControllerCheck.get_os_aggregates',
+    'datadog_checks.openstack_controller.legacy.openstack_controller_legacy.OpenStackControllerLegacyCheck.get_os_aggregates',
     return_value=OS_AGGREGATES_RESPONSE,
 )
 def test_collect_server_metrics_pre_2_48(server_diagnostics, os_aggregates, aggregator):
-    check = OpenStackControllerCheck(
+    check = OpenStackControllerLegacyCheck(
         "test", {'ssl_verify': False, 'paginated_server_limit': 1}, [common.KEYSTONE_INSTANCE]
     )
 
@@ -360,7 +372,7 @@ def test_collect_server_metrics_pre_2_48(server_diagnostics, os_aggregates, aggr
 
 
 def test_get_keystone_url_from_openstack_config():
-    check = OpenStackControllerCheck(
+    check = OpenStackControllerLegacyCheck(
         "test", {'ssl_verify': False, 'paginated_server_limit': 1}, [common.CONFIG_FILE_INSTANCE]
     )
     keystone_server_url = check._get_keystone_server_url(common.CONFIG_FILE_INSTANCE)
@@ -368,7 +380,7 @@ def test_get_keystone_url_from_openstack_config():
 
 
 def test_get_keystone_url_from_datadog_config():
-    check = OpenStackControllerCheck(
+    check = OpenStackControllerLegacyCheck(
         "test", {'ssl_verify': False, 'paginated_server_limit': 1}, [common.KEYSTONE_INSTANCE]
     )
     keystone_server_url = check._get_keystone_server_url(common.KEYSTONE_INSTANCE)
@@ -379,7 +391,7 @@ def test_get_keystone_url_from_implicit_openstack_config():
     # This test is for documentation purposes because it is really testing OpenStackConfig
     instance = copy.deepcopy(common.CONFIG_FILE_INSTANCE)
     instance['openstack_cloud_name'] = 'rackspace'
-    check = OpenStackControllerCheck("test", {}, [instance])
+    check = OpenStackControllerLegacyCheck("test", {}, [instance])
     keystone_server_url = check._get_keystone_server_url(instance)
     assert keystone_server_url == 'https://identity.api.rackspacecloud.com/v2.0/'
 
@@ -388,7 +400,7 @@ def test_missing_keystone_server_url():
     # This test is for documentation purposes because it is really testing OpenStackConfig
     instance = copy.deepcopy(common.KEYSTONE_INSTANCE)
     instance['keystone_server_url'] = None
-    check = OpenStackControllerCheck("test", {}, [instance])
+    check = OpenStackControllerLegacyCheck("test", {}, [instance])
 
     with pytest.raises(IncompleteConfig):
         check._get_keystone_server_url(instance)
@@ -404,7 +416,7 @@ def test_missing_keystone_server_url():
 def test_config(test_case, extra_config, expected_http_kwargs):
     instance = deepcopy(common.KEYSTONE_INSTANCE)
     instance.update(extra_config)
-    check = OpenStackControllerCheck('openstack_controller', {}, instances=[instance])
+    check = OpenStackControllerLegacyCheck('openstack_controller', {}, instances=[instance])
 
     for key, value in expected_http_kwargs.items():
         assert check.http.options[key] == value, "Expected '{}' to be {} but was {}".format(
diff --git a/openstack_controller/tests/test_openstack_sdk_api.py b/openstack_controller/tests/legacy/test_openstack_sdk_api.py
similarity index 96%
rename from openstack_controller/tests/test_openstack_sdk_api.py
rename to openstack_controller/tests/legacy/test_openstack_sdk_api.py
index 3f17f5c10810a..58f82ba95884b 100644
--- a/openstack_controller/tests/test_openstack_sdk_api.py
+++ b/openstack_controller/tests/legacy/test_openstack_sdk_api.py
@@ -1,13 +1,15 @@
-# (C) Datadog, Inc. 2019-present
+# (C) Datadog, Inc. 2023-present
 # All rights reserved
 # Licensed under a 3-clause BSD style license (see LICENSE)
 
+import os
+
 import mock
 import pytest
 from openstack.exceptions import SDKException
 
-from datadog_checks.openstack_controller.api import OpenstackSDKApi
-from datadog_checks.openstack_controller.exceptions import (
+from datadog_checks.openstack_controller.legacy.api import OpenstackSDKApi
+from datadog_checks.openstack_controller.legacy.exceptions import (
     AuthenticationNeeded,
     KeystoneUnreachable,
     MissingNeutronEndpoint,
@@ -16,6 +18,14 @@
 
 from . import common
 
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(
+        os.environ.get('OPENSTACK_E2E_LEGACY') is None or os.environ.get('OPENSTACK_E2E_LEGACY') == 'false',
+        reason='Legacy test',
+    ),
+]
+
 EXAMPLE_PROJECTS_VALUE = [
     {
         'id': u'680031a39ce040e1b81289ea8c73fb11',
@@ -342,7 +352,8 @@ def test_get_endpoint():
     assert api.get_neutron_endpoint() == u'http://10.0.3.44:5000/v3/endpoints/408fbfd00abf4bd1a71044f4849abf66'
 
     with mock.patch(
-        'datadog_checks.openstack_controller.api.OpenstackSDKApi._get_service', return_value={u'id': 'invalid_id'}
+        'datadog_checks.openstack_controller.legacy.api.OpenstackSDKApi._get_service',
+        return_value={u'id': 'invalid_id'},
     ):
         api.endpoints = {}
         with pytest.raises(KeystoneUnreachable):
diff --git a/openstack_controller/tests/test_retry.py b/openstack_controller/tests/legacy/test_retry.py
similarity index 68%
rename from openstack_controller/tests/test_retry.py
rename to openstack_controller/tests/legacy/test_retry.py
index e8f0108403d71..f0ee39fc17a47 100644
--- a/openstack_controller/tests/test_retry.py
+++ b/openstack_controller/tests/legacy/test_retry.py
@@ -1,13 +1,25 @@
-# (C) Datadog, Inc. 2018-present
+# (C) Datadog, Inc. 2023-present
 # All rights reserved
-# Licensed under Simplified BSD License (see LICENSE)
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
 import copy
+import os
 import time
 
-from datadog_checks.openstack_controller.retry import BackOffRetry
+import pytest
+
+from datadog_checks.openstack_controller.legacy.retry import BackOffRetry
 
 from . import common
 
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(
+        os.environ.get('OPENSTACK_E2E_LEGACY') is None or os.environ.get('OPENSTACK_E2E_LEGACY') == 'false',
+        reason='Legacy test',
+    ),
+]
+
 
 def test_retry():
     instance = copy.deepcopy(common.MOCK_CONFIG["instances"][0])
diff --git a/openstack_controller/tests/test_simple_api.py b/openstack_controller/tests/legacy/test_simple_api.py
similarity index 92%
rename from openstack_controller/tests/test_simple_api.py
rename to openstack_controller/tests/legacy/test_simple_api.py
index 2f1804652dde1..e8346cc4f44de 100644
--- a/openstack_controller/tests/test_simple_api.py
+++ b/openstack_controller/tests/legacy/test_simple_api.py
@@ -1,16 +1,18 @@
-# (C) Datadog, Inc. 2018-present
+# (C) Datadog, Inc. 2023-present
 # All rights reserved
-# Licensed under Simplified BSD License (see LICENSE)
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
 import copy
 import logging
+import os
 
 import mock
 import pytest
 import requests
 import simplejson as json
 
-from datadog_checks.openstack_controller.api import ApiFactory, Authenticator, Credential, SimpleApi
-from datadog_checks.openstack_controller.exceptions import (
+from datadog_checks.openstack_controller.legacy.api import ApiFactory, Authenticator, Credential, SimpleApi
+from datadog_checks.openstack_controller.legacy.exceptions import (
     AuthenticationNeeded,
     IncompleteIdentity,
     InstancePowerOffFailure,
@@ -24,6 +26,15 @@
 log = logging.getLogger('test_openstack_controller')
 
 
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(
+        os.environ.get('OPENSTACK_E2E_LEGACY') is None or os.environ.get('OPENSTACK_E2E_LEGACY') == 'false',
+        reason='Legacy test',
+    ),
+]
+
+
 def test_get_roles():
     authenticator = Authenticator()
     roles_response = authenticator._get_roles(common.EXAMPLE_AUTH_RESPONSE)
@@ -175,10 +186,11 @@ def test_from_config(requests_wrapper):
     mock_response = MockHTTPResponse(response_dict=mock_http_response, headers={'X-Subject-Token': 'fake_token'})
 
     with mock.patch(
-        'datadog_checks.openstack_controller.api.Authenticator._post_auth_token', return_value=mock_response
+        'datadog_checks.openstack_controller.legacy.api.Authenticator._post_auth_token', return_value=mock_response
     ):
         with mock.patch(
-            'datadog_checks.openstack_controller.api.Authenticator._get_auth_projects', return_value=PROJECTS_RESPONSE
+            'datadog_checks.openstack_controller.legacy.api.Authenticator._get_auth_projects',
+            return_value=PROJECTS_RESPONSE,
         ):
             cred = Authenticator.from_config(log, 'http://10.0.2.15:5000', GOOD_USERS[0]['user'], requests_wrapper)
             assert isinstance(cred, Credential)
@@ -200,10 +212,11 @@ def test_from_config_with_admin(requests_wrapper):
     mock_response = MockHTTPResponse(response_dict=mock_http_response, headers={'X-Subject-Token': 'fake_token'})
 
     with mock.patch(
-        'datadog_checks.openstack_controller.api.Authenticator._post_auth_token', return_value=mock_response
+        'datadog_checks.openstack_controller.legacy.api.Authenticator._post_auth_token', return_value=mock_response
     ):
         with mock.patch(
-            'datadog_checks.openstack_controller.api.Authenticator._get_auth_projects', return_value=PROJECTS_RESPONSE
+            'datadog_checks.openstack_controller.legacy.api.Authenticator._get_auth_projects',
+            return_value=PROJECTS_RESPONSE,
         ):
             cred = Authenticator.from_config(log, 'http://10.0.2.15:5000', GOOD_USERS[0]['user'], requests_wrapper)
             assert isinstance(cred, Credential)
@@ -223,10 +236,10 @@ def test_from_config_with_missing_name(requests_wrapper):
     del project_response_without_name[0]["name"]
 
     with mock.patch(
-        'datadog_checks.openstack_controller.api.Authenticator._post_auth_token', return_value=mock_response
+        'datadog_checks.openstack_controller.legacy.api.Authenticator._post_auth_token', return_value=mock_response
     ):
         with mock.patch(
-            'datadog_checks.openstack_controller.api.Authenticator._get_auth_projects',
+            'datadog_checks.openstack_controller.legacy.api.Authenticator._get_auth_projects',
             return_value=project_response_without_name,
         ):
             cred = Authenticator.from_config(log, 'http://10.0.2.15:5000', GOOD_USERS[0]['user'], requests_wrapper)
@@ -241,10 +254,10 @@ def test_from_config_with_missing_id(requests_wrapper):
     del project_response_without_name[0]["id"]
 
     with mock.patch(
-        'datadog_checks.openstack_controller.api.Authenticator._post_auth_token', return_value=mock_response
+        'datadog_checks.openstack_controller.legacy.api.Authenticator._post_auth_token', return_value=mock_response
     ):
         with mock.patch(
-            'datadog_checks.openstack_controller.api.Authenticator._get_auth_projects',
+            'datadog_checks.openstack_controller.legacy.api.Authenticator._get_auth_projects',
             return_value=project_response_without_name,
         ):
             cred = Authenticator.from_config(log, 'http://10.0.2.15:5000', GOOD_USERS[0]['user'], requests_wrapper)
@@ -282,7 +295,7 @@ def get_os_hypervisor_uptime_post_v2_53_response(url, params=None, timeout=None)
 def test_get_os_hypervisor_uptime(aggregator, requests_wrapper):
     hypervisor_mock = mock.MagicMock(id=1)
     with mock.patch(
-        'datadog_checks.openstack_controller.api.SimpleApi._make_request',
+        'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request',
         side_effect=get_os_hypervisor_uptime_pre_v2_52_response,
     ):
         api = SimpleApi(None, None, requests_wrapper)
@@ -292,7 +305,7 @@ def test_get_os_hypervisor_uptime(aggregator, requests_wrapper):
         )
 
     with mock.patch(
-        'datadog_checks.openstack_controller.api.SimpleApi._make_request',
+        'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request',
         side_effect=get_os_hypervisor_uptime_post_v2_53_response,
     ):
         api = SimpleApi(None, None, requests_wrapper)
@@ -329,7 +342,7 @@ def get_os_aggregates_response(url, params=None, timeout=None):
 
 def test_get_os_aggregates(aggregator, requests_wrapper):
     with mock.patch(
-        'datadog_checks.openstack_controller.api.SimpleApi._make_request', side_effect=get_os_aggregates_response
+        'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request', side_effect=get_os_aggregates_response
     ):
         api = SimpleApi(None, None, requests_wrapper)
 
@@ -450,14 +463,14 @@ def get_os_hypervisors_detail_post_v2_53_response(url, params=None, timeout=None
 
 def test_get_os_hypervisors_detail(aggregator, requests_wrapper):
     with mock.patch(
-        'datadog_checks.openstack_controller.api.SimpleApi._make_request',
+        'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request',
         side_effect=get_os_hypervisors_detail_post_v2_33_response,
     ):
         api = SimpleApi(None, None, requests_wrapper)
         assert api.get_os_hypervisors_detail() == common.EXAMPLE_GET_OS_HYPERVISORS_RETURN_VALUE
 
     with mock.patch(
-        'datadog_checks.openstack_controller.api.SimpleApi._make_request',
+        'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request',
         side_effect=get_os_hypervisors_detail_post_v2_53_response,
     ):
         api = SimpleApi(None, None, requests_wrapper)
@@ -594,7 +607,7 @@ def get_servers_detail_post_v2_63_response(url, params=None, timeout=None):
 
 def test_get_servers_detail(aggregator, requests_wrapper):
     with mock.patch(
-        'datadog_checks.openstack_controller.api.SimpleApi._make_request',
+        'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request',
         side_effect=get_servers_detail_post_v2_63_response,
     ):
         api = SimpleApi(None, None, requests_wrapper)
@@ -690,10 +703,10 @@ def test__get_paginated_list(requests_wrapper):
     instance = copy.deepcopy(common.MOCK_CONFIG["instances"][0])
     instance["paginated_limit"] = 4
 
-    with mock.patch("datadog_checks.openstack_controller.api.SimpleApi.connect"):
+    with mock.patch("datadog_checks.openstack_controller.legacy.api.SimpleApi.connect"):
         api = ApiFactory.create(log, instance, requests_wrapper)
     with mock.patch(
-        "datadog_checks.openstack_controller.api.SimpleApi._make_request",
+        "datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request",
         side_effect=[
             # First call: 3 exceptions -> failure
             requests.exceptions.HTTPError,
@@ -708,7 +721,7 @@ def test__get_paginated_list(requests_wrapper):
         log.reset_mock()
 
     with mock.patch(
-        "datadog_checks.openstack_controller.api.SimpleApi._make_request",
+        "datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request",
         side_effect=[
             # Second call: all good, 1 page with 4 results, one with 1
             {"obj": [{"id": 0}, {"id": 1}, {"id": 2}, {"id": 3}], "obj_links": "test"},
@@ -722,7 +735,7 @@ def test__get_paginated_list(requests_wrapper):
         assert result == [{"id": 0}, {"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}]
 
     with mock.patch(
-        "datadog_checks.openstack_controller.api.SimpleApi._make_request",
+        "datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request",
         side_effect=[
             # Third call: 1 exception, limit is divided once by 2
             requests.exceptions.HTTPError,
@@ -738,7 +751,7 @@ def test__get_paginated_list(requests_wrapper):
         log.reset_mock()
 
     with mock.patch(
-        "datadog_checks.openstack_controller.api.SimpleApi._make_request",
+        "datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request",
         side_effect=[
             # Fourth call: 1 AuthenticationNeeded exception -> no retries
             AuthenticationNeeded,
@@ -758,11 +771,11 @@ def test__make_request_failure(requests_wrapper):
     instance = copy.deepcopy(common.MOCK_CONFIG["instances"][0])
     instance["paginated_limit"] = 4
 
-    with mock.patch("datadog_checks.openstack_controller.api.SimpleApi.connect"):
+    with mock.patch("datadog_checks.openstack_controller.legacy.api.SimpleApi.connect"):
         api = ApiFactory.create(log, instance, requests_wrapper)
 
     response_mock = mock.MagicMock()
-    with mock.patch("datadog_checks.openstack_controller.api.requests.get", return_value=response_mock):
+    with mock.patch("datadog_checks.openstack_controller.legacy.api.requests.get", return_value=response_mock):
         response_mock.raise_for_status.side_effect = requests.exceptions.HTTPError
         response_mock.status_code = 401
         with pytest.raises(AuthenticationNeeded):
@@ -856,7 +869,7 @@ def get_server_diagnostics_post_v2_1_response(url, params=None, timeout=None):
 
 def test_get_server_diagnostics(aggregator, requests_wrapper):
     with mock.patch(
-        'datadog_checks.openstack_controller.api.SimpleApi._make_request',
+        'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request',
         side_effect=get_server_diagnostics_post_v2_48_response,
     ):
         api = SimpleApi(None, None, requests_wrapper)
@@ -899,7 +912,7 @@ def test_get_server_diagnostics(aggregator, requests_wrapper):
         }
 
     with mock.patch(
-        'datadog_checks.openstack_controller.api.SimpleApi._make_request',
+        'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request',
         side_effect=get_server_diagnostics_post_v2_1_response,
     ):
         api = SimpleApi(None, None, requests_wrapper)
@@ -1009,7 +1022,7 @@ def get_network_quotas_response():
 
 def test_get_project_limits(aggregator, requests_wrapper):
     with mock.patch(
-        'datadog_checks.openstack_controller.api.SimpleApi._make_request',
+        'datadog_checks.openstack_controller.legacy.api.SimpleApi._make_request',
         side_effect=[get_project_limits_response(), get_network_quotas_response()],
     ):
         api = SimpleApi(None, None, requests_wrapper)
diff --git a/openstack_controller/tests/metrics.py b/openstack_controller/tests/metrics.py
new file mode 100644
index 0000000000000..f90e142498480
--- /dev/null
+++ b/openstack_controller/tests/metrics.py
@@ -0,0 +1,4530 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+NOVA_HYPERVISOR_METRICS = {
+    'openstack.nova.hypervisor.current_workload',
+    'openstack.nova.hypervisor.disk_available_least',
+    'openstack.nova.hypervisor.free_disk_gb',
+    'openstack.nova.hypervisor.free_ram_mb',
+    'openstack.nova.hypervisor.local_gb',
+    'openstack.nova.hypervisor.local_gb_used',
+    'openstack.nova.hypervisor.memory_mb',
+    'openstack.nova.hypervisor.memory_mb_used',
+    'openstack.nova.hypervisor.running_vms',
+    'openstack.nova.hypervisor.vcpus',
+    'openstack.nova.hypervisor.vcpus_used',
+    'openstack.nova.hypervisor.up',
+    'openstack.nova.hypervisor.count',
+}
+
+NOVA_HYPERVISOR_UPTIME_METRICS = {
+    'openstack.nova.hypervisor.load_1',
+    'openstack.nova.hypervisor.load_5',
+    'openstack.nova.hypervisor.load_15',
+}
+
+NOVA_ALL_HYPERVISOR_METRICS = NOVA_HYPERVISOR_METRICS | NOVA_HYPERVISOR_UPTIME_METRICS
+
+NOVA_QUOTA_SET_METRICS = {
+    'openstack.nova.quota_set.cores',
+    'openstack.nova.quota_set.fixed_ips',
+    'openstack.nova.quota_set.floating_ips',
+    'openstack.nova.quota_set.injected_file_content_bytes',
+    'openstack.nova.quota_set.injected_file_path_bytes',
+    'openstack.nova.quota_set.injected_files',
+    'openstack.nova.quota_set.instances',
+    'openstack.nova.quota_set.key_pairs',
+    'openstack.nova.quota_set.metadata_items',
+    'openstack.nova.quota_set.ram',
+    'openstack.nova.quota_set.security_group_rules',
+    'openstack.nova.quota_set.security_groups',
+    'openstack.nova.quota_set.server_group_members',
+    'openstack.nova.quota_set.server_groups',
+}
+
+NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS = {
+    'openstack.nova.server.diagnostic.disk_details.read_bytes',
+    'openstack.nova.server.diagnostic.disk_details.read_requests',
+    'openstack.nova.server.diagnostic.disk_details.write_bytes',
+    'openstack.nova.server.diagnostic.disk_details.write_requests',
+    'openstack.nova.server.diagnostic.disk_details.errors_count',
+}
+
+NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_METRICS = {
+    'openstack.nova.server.diagnostic.cpu_details.time',
+    'openstack.nova.server.diagnostic.cpu_details.utilisation',
+}
+
+NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS = {
+    'openstack.nova.server.diagnostic.nic_details.rx_drop',
+    'openstack.nova.server.diagnostic.nic_details.rx_errors',
+    'openstack.nova.server.diagnostic.nic_details.rx_octets',
+    'openstack.nova.server.diagnostic.nic_details.rx_packets',
+    'openstack.nova.server.diagnostic.nic_details.rx_rate',
+    'openstack.nova.server.diagnostic.nic_details.tx_drop',
+    'openstack.nova.server.diagnostic.nic_details.tx_errors',
+    'openstack.nova.server.diagnostic.nic_details.tx_octets',
+    'openstack.nova.server.diagnostic.nic_details.tx_packets',
+    'openstack.nova.server.diagnostic.nic_details.tx_rate',
+}
+
+NOVA_SERVER_DIAGNOSTIC_METRICS = {
+    'openstack.nova.server.diagnostic.cpu0_time',
+    'openstack.nova.server.diagnostic.vda_read_req',
+    'openstack.nova.server.diagnostic.vda_read',
+    'openstack.nova.server.diagnostic.vda_write_req',
+    'openstack.nova.server.diagnostic.vda_write',
+    'openstack.nova.server.diagnostic.vda_errors',
+    'openstack.nova.server.diagnostic.memory',
+    'openstack.nova.server.diagnostic.memory_actual',
+    'openstack.nova.server.diagnostic.memory_swap_in',
+    'openstack.nova.server.diagnostic.memory_swap_out',
+    'openstack.nova.server.diagnostic.memory_major_fault',
+    'openstack.nova.server.diagnostic.memory_minor_fault',
+    'openstack.nova.server.diagnostic.memory_unused',
+    'openstack.nova.server.diagnostic.memory_available',
+    'openstack.nova.server.diagnostic.memory_usable',
+    'openstack.nova.server.diagnostic.memory_last_update',
+    'openstack.nova.server.diagnostic.memory_disk_caches',
+    'openstack.nova.server.diagnostic.memory_hugetlb_pgalloc',
+    'openstack.nova.server.diagnostic.memory_hugetlb_pgfail',
+    'openstack.nova.server.diagnostic.memory_rss',
+    'openstack.nova.server.diagnostic.memory_details.maximum',
+    'openstack.nova.server.diagnostic.memory_details.used',
+    'openstack.nova.server.diagnostic.uptime',
+    'openstack.nova.server.diagnostic.num_cpus',
+    'openstack.nova.server.diagnostic.num_nics',
+    'openstack.nova.server.diagnostic.num_disks',
+}
+
+NOVA_SERVER_FLAVOR_METRICS = {
+    'openstack.nova.server.flavor.vcpus',
+    'openstack.nova.server.flavor.ram',
+    'openstack.nova.server.flavor.disk',
+    'openstack.nova.server.flavor.os_flv_ext_data:ephemeral',
+    'openstack.nova.server.flavor.ephemeral',
+    'openstack.nova.server.flavor.swap',
+    'openstack.nova.server.flavor.rxtx_factor',
+}
+
+NOVA_SERVER_METRICS = {
+    'openstack.nova.server.count',
+    'openstack.nova.server.active',
+    'openstack.nova.server.error',
+}
+
+NOVA_ALL_DIAGNOSTIC_METRICS = (
+    NOVA_SERVER_DIAGNOSTIC_METRICS
+    | NOVA_SERVER_DIAGNOSTIC_DISK_DETAILS_METRICS
+    | NOVA_SERVER_DIAGNOSTIC_CPU_DETAILS_METRICS
+    | NOVA_SERVER_DIAGNOSTIC_NIC_DETAILS_METRICS
+)
+
+NOVA_ALL_SERVER_METRICS = NOVA_SERVER_METRICS | NOVA_SERVER_FLAVOR_METRICS | NOVA_ALL_DIAGNOSTIC_METRICS
+
+NOVA_PROJECT_METRICS = NOVA_QUOTA_SET_METRICS | NOVA_ALL_SERVER_METRICS
+
+NEUTRON_NETWORK_METRICS = {
+    'openstack.neutron.network.admin_state_up',
+    'openstack.neutron.network.l2_adjacency',
+    'openstack.neutron.network.mtu',
+    'openstack.neutron.network.port_security_enabled',
+    'openstack.neutron.network.shared',
+    'openstack.neutron.network.vlan_transparent',
+    'openstack.neutron.network.is_default',
+}
+
+NEUTRON_QUOTA_METRICS = {
+    'openstack.neutron.quota.floatingip',
+    'openstack.neutron.quota.network',
+    'openstack.neutron.quota.port',
+    'openstack.neutron.quota.rbac_policy',
+    'openstack.neutron.quota.router',
+    'openstack.neutron.quota.security_group',
+    'openstack.neutron.quota.security_group_rule',
+    'openstack.neutron.quota.subnet',
+    'openstack.neutron.quota.subnetpool',
+}
+
+NEUTRON_PROJECT_METRICS = NEUTRON_NETWORK_METRICS | NEUTRON_QUOTA_METRICS
+
+COMPUTE_SERVICES_NOVA_MICROVERSION_DEFAULT = [
+    {
+        'name': 'openstack.nova.service.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:1',
+            'service_name:nova-conductor',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.up',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:1',
+            'service_name:nova-conductor',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:2',
+            'service_name:nova-scheduler',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.up',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:2',
+            'service_name:nova-scheduler',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:3',
+            'service_name:nova-compute',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:availability-zone',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.up',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:3',
+            'service_name:nova-compute',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:availability-zone',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:5',
+            'service_name:nova-conductor',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.up',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:5',
+            'service_name:nova-conductor',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+]
+
+COMPUTE_SERVICES_NOVA_MICROVERSION_2_93 = [
+    {
+        'name': 'openstack.nova.service.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:aadbda65-f523-419a-b3df-c287d196a2c1',
+            'service_name:nova-conductor',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.up',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:aadbda65-f523-419a-b3df-c287d196a2c1',
+            'service_name:nova-conductor',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:2ec2027d-ac70-4e2b-95ed-fb1756d24996',
+            'service_name:nova-scheduler',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.up',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:2ec2027d-ac70-4e2b-95ed-fb1756d24996',
+            'service_name:nova-scheduler',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:7bf08d7e-a939-46c3-bdae-fbe3ebfe78a4',
+            'service_name:nova-compute',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:availability-zone',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.up',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:7bf08d7e-a939-46c3-bdae-fbe3ebfe78a4',
+            'service_name:nova-compute',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:availability-zone',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:aadbda65-f523-419a-b3df-c287d196a2c1',
+            'service_name:nova-conductor',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+    {
+        'name': 'openstack.nova.service.up',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_host:agent-integrations-openstack-default',
+            'service_id:aadbda65-f523-419a-b3df-c287d196a2c1',
+            'service_name:nova-conductor',
+            'service_state:up',
+            'service_status:enabled',
+            'service_zone:internal',
+        ],
+    },
+]
+
+COMPUTE_HYPERVISORS_NOVA_MICROVERSION_DEFAULT = [
+    {
+        'name': 'openstack.nova.hypervisor.up',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:1',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        'hostname': 'agent-integrations-openstack-default',
+    },
+    {
+        'name': 'openstack.nova.hypervisor.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:1',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        'hostname': 'agent-integrations-openstack-default',
+    },
+    {
+        'name': 'openstack.nova.hypervisor.load_1',
+        'count': 1,
+        'value': 0.29,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:1',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        'hostname': 'agent-integrations-openstack-default',
+    },
+    {
+        'name': 'openstack.nova.hypervisor.load_5',
+        'count': 1,
+        'value': 0.36,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:1',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        'hostname': 'agent-integrations-openstack-default',
+    },
+    {
+        'name': 'openstack.nova.hypervisor.load_15',
+        'count': 1,
+        'value': 0.35,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:1',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        'hostname': 'agent-integrations-openstack-default',
+    },
+]
+
+COMPUTE_HYPERVISORS_NOVA_MICROVERSION_2_93 = [
+    {
+        'name': 'openstack.nova.hypervisor.up',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:d884b51a-e464-49dc-916c-766da0237661',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        'hostname': 'agent-integrations-openstack-default',
+    },
+    {
+        'name': 'openstack.nova.hypervisor.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:d884b51a-e464-49dc-916c-766da0237661',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        'hostname': 'agent-integrations-openstack-default',
+    },
+    {
+        'name': 'openstack.nova.hypervisor.load_1',
+        'count': 1,
+        'value': 0.28,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:d884b51a-e464-49dc-916c-766da0237661',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        'hostname': 'agent-integrations-openstack-default',
+    },
+    {
+        'name': 'openstack.nova.hypervisor.load_5',
+        'count': 1,
+        'value': 0.35,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:d884b51a-e464-49dc-916c-766da0237661',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        'hostname': 'agent-integrations-openstack-default',
+    },
+    {
+        'name': 'openstack.nova.hypervisor.load_15',
+        'count': 1,
+        'value': 0.35,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:d884b51a-e464-49dc-916c-766da0237661',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        'hostname': 'agent-integrations-openstack-default',
+    },
+]
+
+COMPUTE_QUOTA_SETS_NOVA_MICROVERSION_DEFAULT = [
+    {
+        'name': 'openstack.nova.quota_set.cores',
+        'count': 1,
+        'value': 20,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'quota_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.cores',
+        'count': 1,
+        'value': 20,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.fixed_ips',
+        'count': 1,
+        'value': -1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.floating_ips',
+        'count': 1,
+        'value': -1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.injected_file_content_bytes',
+        'count': 1,
+        'value': 10240,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.injected_file_path_bytes',
+        'count': 1,
+        'value': 255,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.injected_files',
+        'count': 1,
+        'value': 5,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.instances',
+        'count': 1,
+        'value': 5,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.key_pairs',
+        'count': 1,
+        'value': 100,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.metadata_items',
+        'count': 1,
+        'value': 128,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.ram',
+        'count': 1,
+        'value': 51200,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.security_group_rules',
+        'count': 1,
+        'value': -1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.security_groups',
+        'count': 1,
+        'value': -1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.server_group_members',
+        'count': 1,
+        'value': 10,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.server_groups',
+        'count': 1,
+        'value': 10,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+]
+
+COMPUTE_QUOTA_SETS_NOVA_MICROVERSION_2_93 = [
+    {
+        'name': 'openstack.nova.quota_set.cores',
+        'count': 1,
+        'value': 20,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'quota_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.cores',
+        'count': 1,
+        'value': 20,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.instances',
+        'count': 1,
+        'value': 5,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.key_pairs',
+        'count': 1,
+        'value': 100,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.metadata_items',
+        'count': 1,
+        'value': 128,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.ram',
+        'count': 1,
+        'value': 51200,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.server_group_members',
+        'count': 1,
+        'value': 10,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.server_groups',
+        'count': 1,
+        'value': 10,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+]
+
+COMPUTE_QUOTA_SETS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_DEFAULT = [
+    {
+        'name': 'openstack.nova.quota_set.cores',
+        'count': 0,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'quota_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.cores',
+        'count': 1,
+        'value': 20,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.fixed_ips',
+        'count': 1,
+        'value': -1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.floating_ips',
+        'count': 1,
+        'value': -1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.injected_file_content_bytes',
+        'count': 1,
+        'value': 10240,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.injected_file_path_bytes',
+        'count': 1,
+        'value': 255,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.injected_files',
+        'count': 1,
+        'value': 5,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.instances',
+        'count': 1,
+        'value': 5,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.key_pairs',
+        'count': 1,
+        'value': 100,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.metadata_items',
+        'count': 1,
+        'value': 128,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.ram',
+        'count': 1,
+        'value': 51200,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.security_group_rules',
+        'count': 1,
+        'value': -1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.security_groups',
+        'count': 1,
+        'value': -1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.server_group_members',
+        'count': 1,
+        'value': 10,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.server_groups',
+        'count': 1,
+        'value': 10,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+]
+
+COMPUTE_QUOTA_SETS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_2_93 = [
+    {
+        'name': 'openstack.nova.quota_set.cores',
+        'count': 0,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'quota_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.cores',
+        'count': 1,
+        'value': 20,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.instances',
+        'count': 1,
+        'value': 5,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.key_pairs',
+        'count': 1,
+        'value': 100,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.metadata_items',
+        'count': 1,
+        'value': 128,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.ram',
+        'count': 1,
+        'value': 51200,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.server_group_members',
+        'count': 1,
+        'value': 10,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+    {
+        'name': 'openstack.nova.quota_set.server_groups',
+        'count': 1,
+        'value': 10,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'quota_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    },
+]
+
+COMPUTE_SERVERS_NOVA_MICROVERSION_DEFAULT = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+            'flavor_id:c1',
+            'flavor_name:cirros256',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 7211540000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+            'flavor_id:c1',
+            'flavor_name:cirros256',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6970750000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+            'flavor_id:c1',
+            'flavor_name:cirros256',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 18614670000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+            'flavor_id:c1',
+            'flavor_name:cirros256',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6866230000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.rx',
+        'count': 1,
+        'value': 73628,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+            'interface:tap455c2c46-84',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.tx_errors',
+        'count': 1,
+        'value': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+            'interface:tap455c2c46-84',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_NOVA_MICROVERSION_2_93 = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_driver:libvirt',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_DEFAULT = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 7211540000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6970750000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 18614670000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_2_93 = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_driver:libvirt',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_EXCLUDING_DEV_SERVERS_NOVA_MICROVERSION_DEFAULT = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 7211540000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6970750000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6866230000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_EXCLUDING_DEV_SERVERS_NOVA_MICROVERSION_2_93 = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_driver:libvirt',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_NOVA_MICROVERSION_DEFAULT_FLAVOR_EXCEPTION = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 7211540000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6970750000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 18614670000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6866230000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_NOVA_MICROVERSION_2_93_FLAVOR_EXCEPTION = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_driver:libvirt',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_DISABLED_FLAVORS_NOVA_MICROVERSION_DEFAULT = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+            'flavor_id:c1',
+            'flavor_name:cirros256',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 7211540000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+            'flavor_id:c1',
+            'flavor_name:cirros256',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6970750000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+            'flavor_id:c1',
+            'flavor_name:cirros256',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 18614670000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+            'flavor_id:c1',
+            'flavor_name:cirros256',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6866230000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_DISABLED_FLAVORS_NOVA_MICROVERSION_2_93 = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.flavor.vcpus',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_driver:libvirt',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_NOVA_MICROVERSION_DEFAULT_SERVER_DIAGNOSTICS_EXCEPTION = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6970750000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 18614670000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6866230000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_NOVA_MICROVERSION_2_93_SERVER_DIAGNOSTICS_EXCEPTION = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_driver:libvirt',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_DISABLED_DIAGNOSTICS_NOVA_MICROVERSION_DEFAULT = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 7211540000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 6970750000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 1,
+        'value': 18614670000000,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.cpu0_time',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+COMPUTE_SERVERS_DISABLED_DIAGNOSTICS_NOVA_MICROVERSION_2_93 = [
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:a',
+            'instance_name:instance-0000004a',
+        ],
+        'hostname': '5102fbbf-7156-48dc-8355-af7ab992266f',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:954441a8-552a-476c-985e-6564e6fe93d6',
+            'server_name:admin-2',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:test',
+            'instance_name:instance-00000049',
+        ],
+        'hostname': '954441a8-552a-476c-985e-6564e6fe93d6',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 1,
+        'value': 23407104,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_driver:libvirt',
+            'server_id:2c653a68-b520-4582-a05d-41a68067d76c',
+            'server_name:dev-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:server',
+            'instance_name:instance-00000004',
+        ],
+        'hostname': '2c653a68-b520-4582-a05d-41a68067d76c',
+    },
+    {
+        'name': 'openstack.nova.server.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.active',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+    {
+        'name': 'openstack.nova.server.diagnostic.disk_details.read_bytes',
+        'count': 0,
+        'tags': [
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_driver:libvirt',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_hostname:demo-1',
+            'instance_name:instance-0000004c',
+        ],
+        'hostname': '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+    },
+]
+
+NODES_METRICS_IRONIC_MICROVERSION_DEFAULT = [
+    {
+        'name': 'openstack.ironic.node.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'node_uuid:9d72cf53-19c8-4942-9314-005fa5d2a6a0',
+            'driver:ipmi',
+            'provision_state:active',
+        ],
+        'hostname': '9d72cf53-19c8-4942-9314-005fa5d2a6a0',
+    },
+    {
+        'name': 'openstack.ironic.node.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'node_uuid:bd7a61bb-5fe0-4c93-9628-55e312f9ef0e',
+            'driver:ipmi',
+        ],
+        'hostname': 'bd7a61bb-5fe0-4c93-9628-55e312f9ef0e',
+    },
+    {
+        'name': 'openstack.ironic.node.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'node_uuid:54855e59-83ca-46f8-a78f-55d3370e0656',
+            'driver:ipmi',
+        ],
+        'hostname': '54855e59-83ca-46f8-a78f-55d3370e0656',
+    },
+    {
+        'name': 'openstack.ironic.node.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'node_uuid:20512deb-e493-4796-a046-5d6e4e072c95',
+            'power_state:power on',
+            'driver:fake-hardware',
+            'provision_state:active',
+        ],
+        'hostname': '20512deb-e493-4796-a046-5d6e4e072c95',
+    },
+]
+
+NODES_METRICS_IRONIC_MICROVERSION_1_80 = [
+    {
+        'name': 'openstack.ironic.node.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'conductor_group:',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'node_name:node-0',
+            'node_uuid:9d72cf53-19c8-4942-9314-005fa5d2a6a0',
+            'driver:ipmi',
+            'provision_state:active',
+        ],
+        'hostname': '9d72cf53-19c8-4942-9314-005fa5d2a6a0',
+    },
+    {
+        'name': 'openstack.ironic.node.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'conductor_group:',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'node_name:node-1',
+            'node_uuid:bd7a61bb-5fe0-4c93-9628-55e312f9ef0e',
+            'driver:ipmi',
+            'provision_state:available',
+        ],
+        'hostname': 'bd7a61bb-5fe0-4c93-9628-55e312f9ef0e',
+    },
+    {
+        'name': 'openstack.ironic.node.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'conductor_group:',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'node_name:node-2',
+            'node_uuid:54855e59-83ca-46f8-a78f-55d3370e0656',
+            'driver:ipmi',
+            'provision_state:available',
+        ],
+        'hostname': '54855e59-83ca-46f8-a78f-55d3370e0656',
+    },
+    {
+        'name': 'openstack.ironic.node.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'conductor_group:',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'node_name:test',
+            'node_uuid:20512deb-e493-4796-a046-5d6e4e072c95',
+            'power_state:power on',
+            'driver:fake-hardware',
+            'provision_state:active',
+        ],
+        'hostname': '20512deb-e493-4796-a046-5d6e4e072c95',
+    },
+]
+
+CONDUCTORS_METRICS_IRONIC_MICROVERSION_DEFAULT = []
+
+CONDUCTORS_METRICS_IRONIC_MICROVERSION_1_80 = [
+    {
+        'name': 'openstack.ironic.conductor.count',
+        'count': 1,
+        'value': 1,
+        'tags': [
+            'conductor_group:',
+            'conductor_hostname:agent-integrations-openstack-ironic',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    },
+]
diff --git a/openstack_controller/tests/ssh_tunnel.py b/openstack_controller/tests/ssh_tunnel.py
new file mode 100644
index 0000000000000..1f9b3a0f359c0
--- /dev/null
+++ b/openstack_controller/tests/ssh_tunnel.py
@@ -0,0 +1,152 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+from __future__ import absolute_import
+
+import os
+from contextlib import contextmanager
+
+import psutil
+from six import PY3
+
+from datadog_checks.dev.conditions import WaitForPortListening
+from datadog_checks.dev.env import environment_run
+from datadog_checks.dev.structures import LazyFunction, TempDir
+from datadog_checks.dev.utils import ON_WINDOWS, find_free_port, get_ip
+
+if PY3:
+    import subprocess
+else:
+    import subprocess32 as subprocess
+
+PID_FILE = 'ssh.pid'
+
+
+def run_background_command(command, pid_filename, env=None):
+    """Run `command` in the background, writing its PID in `pid_filename`."""
+    if ON_WINDOWS:
+        process = subprocess.Popen(command, env=env, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
+    else:
+        process = subprocess.Popen(command, env=env, start_new_session=True)
+    with open(pid_filename, 'w') as pid_file:
+        pid_file.write(str(process.pid))
+
+
+@contextmanager
+def socks_proxy(host, user, private_key):
+    """Open a SSH connection with a SOCKS proxy."""
+    set_up = SocksProxyUp(host, user, private_key)
+    tear_down = KillProcess('socks_proxy', PID_FILE)
+
+    with environment_run(up=set_up, down=tear_down) as result:
+        yield result
+
+
+class SocksProxyUp(LazyFunction):
+    """Create a SOCKS proxy using `ssh`.
+
+    It returns the (`ip`, `port`) on which the proxy is listening.
+    """
+
+    def __init__(self, host, user, private_key):
+        self.host = host
+        self.user = user
+        self.private_key = private_key
+
+    def __call__(self):
+        WaitForPortListening(self.host, 22, attempts=1, wait=1)()
+        with TempDir('socks_proxy') as temp_dir:
+            ip = get_ip()
+            local_port = find_free_port(ip)
+            key_file = os.path.join(temp_dir, 'ssh_key')
+            with open(key_file, 'w') as f:
+                f.write(self.private_key)
+            os.chmod(key_file, 0o600)
+            command = [
+                'ssh',
+                '-N',
+                '-D',
+                '{}:{}'.format(ip, local_port),
+                '-i',
+                key_file,
+                '-o',
+                'BatchMode=yes',
+                '-o',
+                'UserKnownHostsFile={}'.format(os.devnull),
+                '-o',
+                'StrictHostKeyChecking=no',
+                '{}@{}'.format(self.user, self.host),
+            ]
+            run_background_command(command, os.path.join(temp_dir, PID_FILE))
+
+            WaitForPortListening(ip, local_port, attempts=1, wait=1)()
+
+            return ip, local_port
+
+
+@contextmanager
+def tcp_tunnel(host, user, private_key, remote_port):
+    """Open a SSH connection with a TCP tunnel proxy."""
+    set_up = TCPTunnelUp(host, user, private_key, remote_port)
+    tear_down = KillProcess('tcp_tunnel', PID_FILE)
+
+    with environment_run(up=set_up, down=tear_down) as result:
+        yield result
+
+
+class TCPTunnelUp(LazyFunction):
+    """Create a TCP tunnel using `ssh`.
+
+    It returns the (`ip`, `port`) on which the tunnel is listening, connecting to `remote_port`.
+    """
+
+    def __init__(self, host, user, private_key, remote_port):
+        self.host = host
+        self.user = user
+        self.private_key = private_key
+        self.remote_port = remote_port
+
+    def __call__(self):
+        with TempDir('tcp_tunnel') as temp_dir:
+            ip = get_ip()
+            local_port = find_free_port(ip)
+            key_file = os.path.join(temp_dir, 'ssh_key')
+            with open(key_file, 'w') as f:
+                f.write(self.private_key)
+            os.chmod(key_file, 0o600)
+            command = [
+                'ssh',
+                '-N',
+                '-L',
+                '{}:{}:localhost:{}'.format(ip, local_port, self.remote_port),
+                '-i',
+                key_file,
+                '-o',
+                'BatchMode=yes',
+                '-o',
+                'UserKnownHostsFile={}'.format(os.devnull),
+                '-o',
+                'StrictHostKeyChecking=no',
+                '{}@{}'.format(self.user, self.host),
+            ]
+            run_background_command(command, os.path.join(temp_dir, PID_FILE))
+
+            WaitForPortListening(ip, local_port)()
+
+            return ip, local_port
+
+
+class KillProcess(LazyFunction):
+    """Kill a process with the `pid_file` residing in the temporary directory `temp_name`."""
+
+    def __init__(self, temp_name, pid_file):
+        self.temp_name = temp_name
+        self.pid_file = pid_file
+
+    def __call__(self):
+        with TempDir(self.temp_name) as temp_dir:
+            with open(os.path.join(temp_dir, self.pid_file)) as pid_file:
+                pid = int(pid_file.read())
+                process = psutil.Process(pid)
+                process.kill()
+                return 0
diff --git a/openstack_controller/tests/terraform.py b/openstack_controller/tests/terraform.py
new file mode 100644
index 0000000000000..67b6c8e3b2f63
--- /dev/null
+++ b/openstack_controller/tests/terraform.py
@@ -0,0 +1,120 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+import json
+import os
+import shutil
+from contextlib import contextmanager
+from shutil import which
+
+import pytest
+
+from datadog_checks.dev.env import environment_run
+from datadog_checks.dev.fs import chdir, copy_path, get_here, path_join
+from datadog_checks.dev.structures import LazyFunction, TempDir
+from datadog_checks.dev.subprocess import run_command
+
+TEMPLATES_DIR = path_join(get_here(), 'terraform')
+
+
+def construct_env_vars():
+    # Terraform expects case-sensitive environment variables, which does not work inside tox
+    # on Windows since it passes down variables using the case-insensitive os.environ.
+    env = dict(os.environ)
+    for key in list(env):
+        _, prefix, variable = key.lower().partition('tf_var_')
+        if prefix:
+            value = env.pop(key)
+            env['TF_VAR_{}'.format(variable)] = value
+
+    return env
+
+
+@contextmanager
+def terraform_run(directory, sleep=None, endpoints=None, conditions=None, env_vars=None, wrappers=None):
+    """
+    A convenient context manager for safely setting up and tearing down Terraform environments.
+
+    - **directory** (_str_) - A path containing Terraform files
+    - **sleep** (_float_) - Number of seconds to wait before yielding. This occurs after all conditions are successful.
+    - **endpoints** (_List[str]_) - Endpoints to verify access for before yielding. Shorthand for adding
+      `CheckEndpoints(endpoints)` to the `conditions` argument.
+    - **conditions** (_callable_) - A list of callable objects that will be executed before yielding to
+      check for errors
+    - **env_vars** (_dict_) - A dictionary to update `os.environ` with during execution
+    - **wrappers** (_List[callable]_) - A list of context managers to use during execution
+    """
+    if not which('terraform'):
+        pytest.skip('Terraform not available')
+
+    set_up = TerraformUp(directory)
+    tear_down = TerraformDown(directory)
+
+    with environment_run(
+        up=set_up,
+        down=tear_down,
+        sleep=sleep,
+        endpoints=endpoints,
+        conditions=conditions,
+        env_vars=env_vars,
+        wrappers=wrappers,
+    ) as result:
+        yield result
+
+
+class TerraformUp(LazyFunction):
+    """Create the terraform environment, calling `init` and `apply`.
+
+    It also returns the outputs as a `dict`.
+    """
+
+    def __init__(self, directory, template_files=None):
+        self.directory = directory
+        # Must be the full path to the template file/directory
+        # Must be an exhaustive list of templates to include
+        self.template_files = template_files or []
+
+    def __call__(self):
+        with TempDir('terraform') as temp_dir:
+            terraform_dir = os.path.join(temp_dir, 'terraform')
+            shutil.copytree(self.directory, terraform_dir)
+            for file in self.template_files:
+                copy_path(file, terraform_dir)
+
+            with chdir(terraform_dir):
+                env = construct_env_vars()
+                env['TF_VAR_desired_status'] = "RUNNING"
+                instance_name = env['TF_VAR_instance_name']
+                run_command(['terraform', 'init'], check=True, env=env)
+                run_command(
+                    [
+                        'terraform',
+                        'import',
+                        '-input=false',
+                        'google_compute_instance.openstack',
+                        instance_name,
+                    ],
+                    check=True,
+                    env=env,
+                )
+                run_command(['terraform', 'apply', '-auto-approve', '-input=false', '-no-color'], check=True, env=env)
+                output = run_command(['terraform', 'output', '-json'], capture='stdout', check=True, env=env).stdout
+                return json.loads(output)
+
+
+class TerraformDown(LazyFunction):
+    """Delete the terraform environment, calling `destroy`."""
+
+    def __init__(self, directory):
+        self.directory = directory
+
+    def __call__(self):
+        with TempDir('terraform') as temp_dir:
+            terraform_dir = os.path.join(temp_dir, 'terraform')
+            with chdir(terraform_dir):
+                return ""
+                # env = construct_env_vars()
+                # env['TF_VAR_desired_status'] = "TERMINATED"
+                # run_command(['terraform', 'apply', '-auto-approve', '-input=false', '-no-color'], check=True, env=env)
+                # output = run_command(['terraform', 'output', '-json'], capture='stdout', check=True, env=env).stdout
+                # return json.loads(output)
diff --git a/openstack_controller/tests/terraform/gke_config.tf b/openstack_controller/tests/terraform/gke_config.tf
new file mode 100644
index 0000000000000..64824bc89ee2f
--- /dev/null
+++ b/openstack_controller/tests/terraform/gke_config.tf
@@ -0,0 +1,24 @@
+variable "credentials_file" {
+  type = string
+}
+
+variable "desired_status" {
+  type = string
+}
+
+variable "network_ip" {
+  type = string
+}
+
+variable "nat_ip" {
+  type = string
+}
+
+variable "instance_name" {
+  type = string
+}
+
+resource "tls_private_key" "ssh-key" {
+  algorithm = "RSA"
+  rsa_bits = 4096
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/terraform/main.tf b/openstack_controller/tests/terraform/main.tf
index 3b1df913c883b..2d0a439cd13f1 100644
--- a/openstack_controller/tests/terraform/main.tf
+++ b/openstack_controller/tests/terraform/main.tf
@@ -1,46 +1,44 @@
-# Shared common terraform config found in the templates/terraform folder in datadog_checks_dev
-resource "google_compute_instance" "devstack" {
-  name = replace("devstack-${var.user}-${random_string.suffix.result}", ".", "-")
+resource "google_compute_instance" "openstack" {
+  desired_status = var.desired_status
+  name = var.instance_name
   machine_type = "n1-standard-4"
-
   tags = ["openstack", "lab"]
-
   boot_disk {
     initialize_params {
-      image = "ubuntu-os-cloud/ubuntu-1804-lts"
+      image = "ubuntu-os-cloud/ubuntu-2004-lts"
       size = 100
     }
   }
-
   network_interface {
     network = "default"
+    network_ip = var.network_ip
     access_config {
+      nat_ip = var.nat_ip
     }
   }
-
   metadata = {
     enable-oslogin = "TRUE"
     ssh-keys = "ubuntu:${tls_private_key.ssh-key.public_key_openssh} ubuntu"
   }
-
   connection {
     type = "ssh"
     user = "ubuntu"
     private_key = "${tls_private_key.ssh-key.private_key_pem}"
-    host = "${google_compute_instance.devstack.network_interface.0.access_config.0.nat_ip}"
+    host = "${google_compute_instance.openstack.network_interface.0.access_config.0.nat_ip}"
   }
+}
 
-  provisioner "remote-exec" {
-    script = "script.sh"
-  }
+data "google_compute_instance" "openstack" {
+  name = google_compute_instance.openstack.name
+  depends_on = [google_compute_instance.openstack]
 }
 
 output "ip" {
-  value = "${google_compute_instance.devstack.network_interface.0.access_config.0.nat_ip}"
+  value = data.google_compute_instance.openstack.network_interface[0].access_config[0].nat_ip
 }
 
 output "internal_ip" {
-  value = "${google_compute_instance.devstack.network_interface.0.network_ip}"
+  value = data.google_compute_instance.openstack.network_interface[0].network_ip
 }
 
 output "ssh_private_key" {
@@ -50,4 +48,4 @@ output "ssh_private_key" {
 
 output "ssh_public_key" {
   value = "${tls_private_key.ssh-key.public_key_openssh}"
-}
+}
\ No newline at end of file
diff --git a/openstack_controller/tests/terraform/providers.tf b/openstack_controller/tests/terraform/providers.tf
new file mode 100644
index 0000000000000..3f77a38de0ea0
--- /dev/null
+++ b/openstack_controller/tests/terraform/providers.tf
@@ -0,0 +1,6 @@
+provider "google" {
+  credentials = var.credentials_file
+  project = "datadog-integrations-lab"
+  region = "europe-west4"
+  zone = "europe-west4-a"
+}
diff --git a/openstack_controller/tests/terraform/script_default.sh b/openstack_controller/tests/terraform/script_default.sh
new file mode 100644
index 0000000000000..d1d5023886c44
--- /dev/null
+++ b/openstack_controller/tests/terraform/script_default.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+sudo apt update
+sudo apt upgrade -y
+sudo useradd -s /bin/bash -d /opt/stack -m stack
+echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers
+cd /opt/stack
+sudo git clone https://opendev.org/openstack/devstack
+cd devstack
+sudo git checkout origin/stable/zed
+cat <<EOF | sudo tee -a local.conf
+[[local|localrc]]
+DATABASE_PASSWORD=password
+ADMIN_PASSWORD=password
+SERVICE_PASSWORD=password
+SERVICE_TOKEN=password
+RABBIT_PASSWORD=password
+# Enable Logging
+LOGFILE=/opt/stack/logs/stack.sh.log
+VERBOSE=True
+LOG_COLOR=True
+EOF
+sudo chown stack:stack /opt/stack/devstack -R
+sudo -u stack -H ./stack.sh
\ No newline at end of file
diff --git a/openstack_controller/tests/terraform/script_ironic.sh b/openstack_controller/tests/terraform/script_ironic.sh
new file mode 100644
index 0000000000000..4b18555f018e3
--- /dev/null
+++ b/openstack_controller/tests/terraform/script_ironic.sh
@@ -0,0 +1,108 @@
+#!/bin/bash
+sudo apt update
+sudo apt upgrade -y
+sudo useradd -s /bin/bash -d /opt/stack -m stack
+echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers
+cd /opt/stack
+sudo git clone https://opendev.org/openstack/devstack
+cd devstack
+sudo git checkout stable/zed
+cat <<EOF | sudo tee -a local.conf
+[[local|localrc]]
+# Credentials
+ADMIN_PASSWORD=password
+DATABASE_PASSWORD=password
+RABBIT_PASSWORD=password
+SERVICE_PASSWORD=password
+SERVICE_TOKEN=password
+
+# Set glance's default limit to be baremetal image friendly
+GLANCE_LIMIT_IMAGE_SIZE_TOTAL=5000
+
+# Configure ironic from ironic devstack plugin.
+enable_plugin ironic https://opendev.org/openstack/ironic stable/zed
+enable_plugin ironic-ui https://github.com/openstack/ironic-ui stable/zed
+
+# Create 3 virtual machines to pose as Ironic's baremetal nodes.
+IRONIC_VM_COUNT=3
+IRONIC_BAREMETAL_BASIC_OPS=True
+DEFAULT_INSTANCE_TYPE=baremetal
+
+# Enable services
+enable_service horizon
+enable_service g-api
+enable_service key
+enable_service memory_tracker
+enable_service mysql
+enable_service q-agt
+enable_service q-dhcp
+enable_service q-l3
+enable_service q-meta
+enable_service q-metering
+enable_service q-svc
+enable_service rabbit
+
+# Enable Ironic API and Ironic Conductor
+enable_service ironic
+enable_service ir-api
+enable_service ir-cond
+
+# Disable nova novnc service, ironic does not support it anyway.
+disable_service n-novnc
+
+# Disable Cinder
+disable_service cinder c-sch c-api c-vol
+
+# Disable Tempest
+disable_service tempest
+
+IRONIC_RPC_TRANSPORT=json-rpc
+IRONIC_RAMDISK_TYPE=tinyipa
+IRONIC_RAMDISK_TYPE=tinyipa
+
+# Enable additional hardware types, if needed.
+IRONIC_ENABLED_HARDWARE_TYPES=ipmi,fake-hardware
+# Don't forget that many hardware types require enabling of additional
+# interfaces, most often power and management:
+IRONIC_ENABLED_MANAGEMENT_INTERFACES=ipmitool,fake
+IRONIC_ENABLED_POWER_INTERFACES=ipmitool,fake
+IRONIC_DEFAULT_DEPLOY_INTERFACE=direct
+
+# Change this to alter the default driver for nodes created by devstack.
+# This driver should be in the enabled list above.
+IRONIC_DEPLOY_DRIVER="ipmi"
+
+# The parameters below represent the minimum possible values to create
+# functional nodes.
+IRONIC_VM_SPECS_RAM=1024
+IRONIC_VM_SPECS_DISK=3
+
+# Size of the ephemeral partition in GB. Use 0 for no ephemeral partition.
+IRONIC_VM_EPHEMERAL_DISK=0
+
+# To build your own IPA ramdisk from source, set this to True
+IRONIC_BUILD_DEPLOY_RAMDISK=False
+
+INSTALL_TEMPEST=False
+VIRT_DRIVER=ironic
+
+# By default, DevStack creates a 10.0.0.0/24 network for instances.
+# If this overlaps with the hosts network, you may adjust with the
+# following.
+IP_VERSION=4
+FIXED_RANGE=10.1.0.0/20
+IPV4_ADDRS_SAFE_TO_USE=10.1.0.0/20
+NETWORK_GATEWAY=10.1.0.1
+
+Q_AGENT=openvswitch
+Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch
+Q_ML2_TENANT_NETWORK_TYPE=vxlan
+
+# Log all output to files
+LOGFILE=/opt/stack/devstack.log
+LOGDIR=/opt/stack/logs
+IRONIC_VM_LOG_DIR=/opt/stack/ironic-bm-logs
+EOF
+sudo chown stack:stack /opt/stack/devstack -R
+sudo -u stack -H ./stack.sh
+
diff --git a/openstack_controller/tests/terraform/script_octavia.sh b/openstack_controller/tests/terraform/script_octavia.sh
new file mode 100644
index 0000000000000..d982b0aef2a21
--- /dev/null
+++ b/openstack_controller/tests/terraform/script_octavia.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+sudo apt update
+sudo apt upgrade -y
+sudo useradd -s /bin/bash -d /opt/stack -m stack
+echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers
+cd /opt/stack
+sudo git clone https://opendev.org/openstack/devstack
+cd devstack
+sudo git checkout stable/zed
+cat <<EOF | sudo tee -a local.conf
+# Sample ``local.conf`` that builds a devstack with neutron LBaaS Version 2
+
+# NOTE: Copy this file to the root DevStack directory for it to work properly.
+
+# ``local.conf`` is a user-maintained settings file that is sourced from ``stackrc``.
+# This gives it the ability to override any variables set in ``stackrc``.
+# Also, most of the settings in ``stack.sh`` are written to only be set if no
+# value has already been set; this lets ``local.conf`` effectively override the
+# default values.
+
+# The ``localrc`` section replaces the old ``localrc`` configuration file.
+# Note that if ``localrc`` is present it will be used in favor of this section.
+
+[[local|localrc]]
+# ===== BEGIN localrc =====
+DATABASE_PASSWORD=password
+ADMIN_PASSWORD=password
+SERVICE_PASSWORD=password
+SERVICE_TOKEN=password
+RABBIT_PASSWORD=password
+# Optional settings:
+# OCTAVIA_AMP_BASE_OS=centos
+# OCTAVIA_AMP_DISTRIBUTION_RELEASE_ID=9-stream
+# OCTAVIA_AMP_IMAGE_SIZE=3
+# OCTAVIA_LB_TOPOLOGY=ACTIVE_STANDBY
+# OCTAVIA_ENABLE_AMPHORAV2_JOBBOARD=True
+# LIBS_FROM_GIT+=octavia-lib,
+# Enable Logging
+LOGFILE=/opt/stack/logs/stack.sh.log
+VERBOSE=True
+LOG_COLOR=True
+enable_service rabbit
+enable_plugin neutron https://opendev.org/openstack/neutron stable/zed
+# Octavia supports using QoS policies on the VIP port:
+enable_service q-qos
+enable_service placement-api placement-client
+# Octavia services
+enable_plugin octavia https://opendev.org/openstack/octavia stable/zed
+enable_plugin octavia-dashboard https://opendev.org/openstack/octavia-dashboard stable/zed
+enable_plugin ovn-octavia-provider https://opendev.org/openstack/ovn-octavia-provider stable/zed
+#enable_plugin octavia-tempest-plugin https://opendev.org/openstack/octavia-tempest-plugin master
+enable_service octavia o-api o-cw o-hm o-hk o-da
+# If you are enabling barbican for TLS offload in Octavia, include it here.
+# enable_plugin barbican https://opendev.org/openstack/barbican stable/zed
+# enable_service barbican
+# Cinder (optional)
+disable_service c-api c-vol c-sch
+# Tempest
+#enable_service tempest
+# ===== END localrc =====
+EOF
+sudo chown stack:stack /opt/stack/devstack -R
+sudo -u stack -H ./stack.sh
\ No newline at end of file
diff --git a/openstack_controller/tests/test_e2e.py b/openstack_controller/tests/test_e2e.py
index 5f41d23899d0a..789f4f0c4fd84 100644
--- a/openstack_controller/tests/test_e2e.py
+++ b/openstack_controller/tests/test_e2e.py
@@ -2,25 +2,23 @@
 # All rights reserved
 # Licensed under Simplified BSD License (see LICENSE)
 
+import os
+
 import pytest
 
 from datadog_checks.base import AgentCheck
 
-from . import common
+pytestmark = [
+    pytest.mark.e2e,
+    pytest.mark.skipif(os.environ.get('OPENSTACK_E2E_LEGACY') == 'true', reason='Not Legacy test'),
+]
 
 
-@pytest.mark.e2e
-def test_check(dd_agent_check):
+def test_connect_ok(dd_agent_check):
     aggregator = dd_agent_check()
-
-    # assert default metrics
-    for metric in common.DEFAULT_METRICS:
-        aggregator.assert_metric(metric)
-    aggregator.assert_all_metrics_covered()
-
-    # assert service checks
-    aggregator.assert_service_check('openstack.neutron.api.up', AgentCheck.OK, count=1)
-    aggregator.assert_service_check('openstack.nova.api.up', AgentCheck.OK, count=1)
-    aggregator.assert_service_check('openstack.keystone.api.up', AgentCheck.OK, count=1)
-    aggregator.assert_service_check('openstack.nova.hypervisor.up', AgentCheck.OK, count=10)
-    aggregator.assert_service_check('openstack.neutron.network.up', AgentCheck.OK, count=2)
+    aggregator.assert_service_check('openstack.keystone.api.up', status=AgentCheck.OK)
+    aggregator.assert_service_check('openstack.nova.api.up', status=AgentCheck.OK)
+    aggregator.assert_service_check('openstack.neutron.api.up', status=AgentCheck.OK)
+    aggregator.assert_service_check('openstack.cinder.api.up', status=AgentCheck.OK)
+    aggregator.assert_service_check('openstack.ironic.api.up', status=AgentCheck.OK)
+    aggregator.assert_service_check('openstack.octavia.api.up', status=AgentCheck.OK)
diff --git a/openstack_controller/tests/test_integration.py b/openstack_controller/tests/test_integration.py
new file mode 100644
index 0000000000000..c06967016267d
--- /dev/null
+++ b/openstack_controller/tests/test_integration.py
@@ -0,0 +1,44 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+import os
+
+import pytest
+
+from datadog_checks.base import AgentCheck
+
+pytestmark = [
+    pytest.mark.integration,
+    pytest.mark.usefixtures('dd_environment'),
+    pytest.mark.skipif(os.environ.get('OPENSTACK_E2E_LEGACY') == 'true', reason='Not Legacy test'),
+    pytest.mark.skipif(os.environ.get('USE_OPENSTACK_GCP') == 'true', reason='Not GCP test'),
+]
+
+
+def test_connect_exception(openstack_controller_check, dd_run_check, caplog):
+    instance = {
+        'keystone_server_url': 'http://10.0.0.0/identity',
+        'username': 'admin',
+        'password': 'password',
+        'use_legacy_check_version': False,
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    assert 'Error while authorizing user' in caplog.text
+
+
+def test_connect_ok(aggregator, openstack_controller_check, dd_run_check):
+    instance = {
+        'keystone_server_url': 'http://127.0.0.1:8080/identity',
+        'username': 'admin',
+        'password': 'password',
+        'use_legacy_check_version': False,
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    aggregator.assert_service_check('openstack.keystone.api.up', status=AgentCheck.OK)
+    aggregator.assert_service_check('openstack.nova.api.up', status=AgentCheck.OK)
+    aggregator.assert_service_check('openstack.neutron.api.up', status=AgentCheck.OK)
+    aggregator.assert_service_check('openstack.ironic.api.up', status=AgentCheck.OK)
+    aggregator.assert_service_check('openstack.octavia.api.up', status=AgentCheck.OK)
diff --git a/openstack_controller/tests/test_unit_auth.py b/openstack_controller/tests/test_unit_auth.py
new file mode 100644
index 0000000000000..9f49ab3c5d558
--- /dev/null
+++ b/openstack_controller/tests/test_unit_auth.py
@@ -0,0 +1,89 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+import logging
+import os
+
+import pytest
+
+import tests.configs as configs
+from datadog_checks.dev.http import MockResponse
+
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(os.environ.get('OPENSTACK_E2E_LEGACY') == 'true', reason='Not Legacy test'),
+]
+
+
+@pytest.mark.parametrize(
+    ('mock_http_post', 'connection_authorize', 'instance'),
+    [
+        pytest.param(
+            {'exception': {'/identity/v3/auth/tokens': Exception()}},
+            None,
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'exception': Exception()},
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_post', 'connection_authorize'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_auth_exception(check, dd_run_check, caplog):
+    caplog.set_level(logging.INFO)
+    dd_run_check(check)
+    assert 'Error while authorizing user' in caplog.text
+    assert 'User successfully authorized' not in caplog.text
+
+
+@pytest.mark.parametrize(
+    ('mock_http_post', 'connection_authorize', 'instance'),
+    [
+        pytest.param(
+            {'http_error': {'/identity/v3/auth/tokens': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': MockResponse(status_code=500)},
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_post', 'connection_authorize'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_auth_http_error(check, dd_run_check, caplog):
+    caplog.set_level(logging.INFO)
+    dd_run_check(check)
+    assert 'Error while authorizing user' in caplog.text
+    assert 'User successfully authorized' not in caplog.text
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_auth_ok(check, dd_run_check, caplog):
+    caplog.set_level(logging.INFO)
+    dd_run_check(check)
+    assert 'Error while authorizing user' not in caplog.text
+    assert 'User successfully authorized' in caplog.text
diff --git a/openstack_controller/tests/test_unit_cinder.py b/openstack_controller/tests/test_unit_cinder.py
new file mode 100644
index 0000000000000..752e2081c52e4
--- /dev/null
+++ b/openstack_controller/tests/test_unit_cinder.py
@@ -0,0 +1,213 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+import logging
+import os
+
+import pytest
+
+import tests.configs as configs
+from datadog_checks.base import AgentCheck
+from datadog_checks.dev.http import MockResponse
+from datadog_checks.openstack_controller.api.type import ApiType
+from tests.common import remove_service_from_catalog
+
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(os.environ.get('OPENSTACK_E2E_LEGACY') == 'true', reason='Not Legacy test'),
+]
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_block_storage_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "block-storage": False,
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.cinder.')
+
+
+@pytest.mark.parametrize(
+    ('mock_http_post', 'session_auth', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'replace': {
+                    '/identity/v3/auth/tokens': lambda d: remove_service_from_catalog(d, ['block-storage', 'volumev3'])
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'catalog': []},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_post', 'session_auth'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_not_in_catalog(aggregator, check, dd_run_check, caplog, mock_http_post, session_auth, api_type):
+    with caplog.at_level(logging.DEBUG):
+        dd_run_check(check)
+
+    aggregator.assert_metric(
+        'openstack.cinder.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.cinder.api.up',
+        status=AgentCheck.UNKNOWN,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_post.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:8776/volume/v3/') == 0
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_post.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/auth/tokens') == 4
+    if api_type == ApiType.SDK:
+        assert session_auth.get_access.call_count == 4
+    assert '`block-storage` component not found in catalog' in caplog.text
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'instance'),
+    [
+        pytest.param(
+            {'http_error': {'/volume/v3/': MockResponse(status_code=500)}},
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            {'http_error': {'/volume/v3/': MockResponse(status_code=500)}},
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time_exception(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.cinder.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.cinder.api.up',
+        status=AgentCheck.CRITICAL,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:8776/volume/v3/') == 2
+
+
+@pytest.mark.parametrize(
+    ('mock_http_post', 'instance'),
+    [
+        pytest.param(
+            {'replace': {'/identity/v3/auth/tokens': lambda d: remove_service_from_catalog(d, ['volumev3'])}},
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_post'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time_block_storage(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.cinder.response_time',
+        count=1,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    aggregator.assert_service_check(
+        'openstack.cinder.api.up',
+        status=AgentCheck.OK,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:8776/volume/v3/') == 1
+
+
+@pytest.mark.parametrize(
+    ('mock_http_post', 'instance'),
+    [
+        pytest.param(
+            {'replace': {'/identity/v3/auth/tokens': lambda d: remove_service_from_catalog(d, ['block-storage'])}},
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_post'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time_volumev3(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.cinder.response_time',
+        count=1,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    aggregator.assert_service_check(
+        'openstack.cinder.api.up',
+        status=AgentCheck.OK,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:8776/volume/v3/') == 1
diff --git a/openstack_controller/tests/test_unit_config.py b/openstack_controller/tests/test_unit_config.py
new file mode 100644
index 0000000000000..c312bc75ff152
--- /dev/null
+++ b/openstack_controller/tests/test_unit_config.py
@@ -0,0 +1,210 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+import logging
+import os
+import re
+
+import pytest
+
+import tests.configs as configs
+from datadog_checks.openstack_controller import OpenStackControllerCheck
+
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(os.environ.get('OPENSTACK_E2E_LEGACY') == 'true', reason='Not Legacy test'),
+]
+
+
+@pytest.mark.parametrize(
+    'instance, exception_msg',
+    [
+        pytest.param(
+            {
+                'user': {'name': 'test_name', 'password': 'test_pass', 'domain': {'id': 'test_id'}},
+                'openstack_cloud_name': 'test',
+                'openstack_config_file_path': configs.TEST_OPENSTACK_CONFIG_UNIT_TESTS_PATH,
+                'use_legacy_check_version': False,
+            },
+            'Cloud test was not found.',
+            id='bad openstack_cloud_name',
+        ),
+        pytest.param(
+            {
+                'user': {'name': 'test_name', 'password': 'test_pass', 'domain': {'id': 'test_id'}},
+                'openstack_config_file_path': 'test',
+                'use_legacy_check_version': False,
+            },
+            'Auth plugin requires parameters which were not given: auth_url',
+            id='openstack_config_file_path doesn\' exist',
+        ),
+        pytest.param(
+            {
+                'user': {'name': 'test_name', 'password': 'test_pass', 'domain': {'id': 'test_id'}},
+                'openstack_cloud_name': 'test_cloud',
+                'openstack_config_file_path': configs.TEST_OPENSTACK_BAD_CONFIG_PATH,
+                'use_legacy_check_version': False,
+            },
+            re.escape('__init__() got an unexpected keyword argument \'auth_type\''),
+            id='invalid openstack_config_file',
+        ),
+        pytest.param(
+            {
+                'use_legacy_check_version': False,
+            },
+            'Either keystone_server_url or openstack_config_file_path need to be provided.',
+            id='no keystone_server_url, no cfg path',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'use_legacy_check_version': False,
+            },
+            'Please specify `username` in your config.',
+            id='no username',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'username': 'admin',
+                'use_legacy_check_version': False,
+            },
+            'Please specify `password` in your config.',
+            id='no password',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'user': {},
+                'use_legacy_check_version': False,
+            },
+            'The user should look like: '
+            '{"name": "my_name", "password": "my_password", "domain": {"id": "my_domain_id"}}',
+            id='no name in user (legacy config)',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'user': {'name': 'my_name'},
+                'use_legacy_check_version': False,
+            },
+            'The user should look like: '
+            '{"name": "my_name", "password": "my_password", "domain": {"id": "my_domain_id"}}',
+            id='no password in user (legacy config)',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'user': {'name': 'my_name', 'password': 'my_password'},
+                'use_legacy_check_version': False,
+            },
+            'The user should look like: '
+            '{"name": "my_name", "password": "my_password", "domain": {"id": "my_domain_id"}}',
+            id='no domain in user (legacy config)',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'user': {'name': 'my_name', 'password': 'my_password', 'domain': {'id': 'my_domain_id'}},
+                'nova_microversion': 'test',
+                'use_legacy_check_version': False,
+            },
+            'Invalid `nova_microversion`: test; please specify a valid version',
+            id='invalid nova_microversion',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'user': {'name': 'my_name', 'password': 'my_password', 'domain': {'id': 'my_domain_id'}},
+                'ironic_microversion': 'tests',
+                'use_legacy_check_version': False,
+            },
+            'Invalid `ironic_microversion`: tests; please specify a valid version',
+            id='invalid ironic_microversion',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'user': {'name': 'my_name', 'password': 'my_password', 'domain': {'id': 'my_domain_id'}},
+                'ironic_microversion': 'tests',
+                'nova_microversion': 'tests',
+                'use_legacy_check_version': False,
+            },
+            'Invalid `nova_microversion`: tests; please specify a valid version',
+            id='invalid nova_microversion and ironic_microversion',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'user': {'name': 'my_name', 'password': 'my_password', 'domain': {}},
+                'use_legacy_check_version': False,
+            },
+            'The user should look like: '
+            '{"name": "my_name", "password": "my_password", "domain": {"id": "my_domain_id"}}',
+            id='no domain id in user (legacy config)',
+        ),
+    ],
+)
+def test_config_exceptions(check, dd_run_check, exception_msg):
+    with pytest.raises(Exception, match=exception_msg):
+        dd_run_check(check)
+
+
+@pytest.mark.parametrize(
+    'instance, warning_msg',
+    [
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'user': {'name': 'my_name', 'password': 'my_password', 'domain': {'id': 'my_domain_id'}},
+                'ironic_microversion': 'latest',
+                'use_legacy_check_version': False,
+            },
+            'Setting `ironic_microversion` to `latest` is not recommended',
+            id='latest ironic_microversion',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'user': {'name': 'my_name', 'password': 'my_password', 'domain': {'id': 'my_domain_id'}},
+                'ironic_microversion': 'LATEST',
+                'use_legacy_check_version': False,
+            },
+            'Setting `ironic_microversion` to `latest` is not recommended',
+            id='capital latest ironic_microversion',
+        ),
+        pytest.param(
+            {
+                'keystone_server_url': 'http://localhost',
+                'user': {'name': 'my_name', 'password': 'my_password', 'domain': {'id': 'my_domain_id'}},
+                'nova_microversion': 'LATEST',
+                'use_legacy_check_version': False,
+            },
+            'Setting `nova_microversion` to `latest` is not recommended',
+            id='capital latest nova_microversion',
+        ),
+    ],
+)
+def test_config_warnings(check, dd_run_check, caplog, warning_msg):
+    with caplog.at_level(logging.DEBUG):
+        dd_run_check(check)
+    assert warning_msg in caplog.text
+
+
+def test_legacy_config_ok():
+    instance = {
+        'keystone_server_url': 'http://localhost',
+        'user': {'name': 'my_name', 'password': 'my_password', 'domain': {'id': 'default'}},
+        'use_legacy_check_version': False,
+    }
+    OpenStackControllerCheck('test', {}, [instance])
+
+
+def test_config_ok():
+    instance = {
+        'keystone_server_url': 'http://localhost',
+        'username': 'my_name',
+        'password': 'my_password',
+        'domain_id': 'default',
+    }
+    OpenStackControllerCheck('test', {}, [instance])
diff --git a/openstack_controller/tests/test_unit_ironic.py b/openstack_controller/tests/test_unit_ironic.py
new file mode 100644
index 0000000000000..9b9ad7fd7db6c
--- /dev/null
+++ b/openstack_controller/tests/test_unit_ironic.py
@@ -0,0 +1,406 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+import logging
+import os
+
+import pytest
+
+import tests.configs as configs
+from datadog_checks.base import AgentCheck
+from datadog_checks.dev.http import MockResponse
+from datadog_checks.openstack_controller.api.type import ApiType
+from tests.common import remove_service_from_catalog
+from tests.metrics import (
+    CONDUCTORS_METRICS_IRONIC_MICROVERSION_1_80,
+    CONDUCTORS_METRICS_IRONIC_MICROVERSION_DEFAULT,
+    NODES_METRICS_IRONIC_MICROVERSION_1_80,
+    NODES_METRICS_IRONIC_MICROVERSION_DEFAULT,
+)
+
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(os.environ.get('OPENSTACK_E2E_LEGACY') == 'true', reason='Not Legacy test'),
+]
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_IRONIC_MICROVERSION_1_80,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_IRONIC_MICROVERSION_1_80,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_ironic_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "baremetal": False,
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.ironic.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_IRONIC_MICROVERSION_1_80,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_IRONIC_MICROVERSION_1_80,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_ironic_node_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "baremetal": {
+                "nodes": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.ironic.node.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_IRONIC_MICROVERSION_1_80,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_IRONIC_MICROVERSION_1_80,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_ironic_conductor_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "baremetal": {
+                "conductors": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.ironic.conductor.')
+
+
+@pytest.mark.parametrize(
+    ('mock_http_post', 'session_auth', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'replace': {'/identity/v3/auth/tokens': lambda d: remove_service_from_catalog(d, ['baremetal'])}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'catalog': []},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_post', 'session_auth'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_not_in_catalog(aggregator, check, dd_run_check, caplog, mock_http_post, session_auth, api_type):
+    with caplog.at_level(logging.DEBUG):
+        dd_run_check(check)
+
+    aggregator.assert_metric(
+        'openstack.ironic.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.ironic.api.up',
+        status=AgentCheck.UNKNOWN,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_post.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:6385/baremetal') == 0
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_post.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/auth/tokens') == 4
+    if api_type == ApiType.SDK:
+        assert session_auth.get_access.call_count == 4
+    assert '`baremetal` component not found in catalog' in caplog.text
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'instance'),
+    [
+        pytest.param(
+            {'http_error': {'/baremetal': MockResponse(status_code=500)}},
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            {'http_error': {'/baremetal': MockResponse(status_code=500)}},
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time_exception(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.ironic.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.ironic.api.up',
+        status=AgentCheck.CRITICAL,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:6385/baremetal') == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.ironic.response_time',
+        count=1,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    aggregator.assert_service_check(
+        'openstack.ironic.api.up',
+        status=AgentCheck.OK,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:6385/baremetal') == 1
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_baremetal', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/baremetal/v1/nodes/detail': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'nodes': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_baremetal'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_nodes_exception(aggregator, check, dd_run_check, mock_http_get, connection_baremetal, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.ironic.node.count',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.ironic.node.up',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:6385/baremetal/v1/nodes/detail') == 2
+    if api_type == ApiType.SDK:
+        assert connection_baremetal.nodes.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics'),
+    [
+        pytest.param(
+            configs.REST,
+            NODES_METRICS_IRONIC_MICROVERSION_DEFAULT,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_IRONIC_MICROVERSION_1_80,
+            NODES_METRICS_IRONIC_MICROVERSION_1_80,
+            id='api rest microversion 1.80',
+        ),
+        pytest.param(
+            configs.SDK,
+            NODES_METRICS_IRONIC_MICROVERSION_DEFAULT,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_IRONIC_MICROVERSION_1_80,
+            NODES_METRICS_IRONIC_MICROVERSION_1_80,
+            id='api sdk microversion 1.80',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_nodes_metrics(aggregator, check, dd_run_check, metrics):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric['count'],
+            value=metric['value'],
+            tags=metric['tags'],
+            hostname=metric.get('hostname'),
+        )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_baremetal', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/baremetal/v1/conductors': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'conductors': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_baremetal'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_conductors_exception(aggregator, check, dd_run_check, mock_http_get, connection_baremetal, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.ironic.conductor.count',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.ironic.conductor.up',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:6385/baremetal/v1/conductors') == 2
+    if api_type == ApiType.SDK:
+        assert connection_baremetal.conductors.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics'),
+    [
+        pytest.param(
+            configs.REST,
+            CONDUCTORS_METRICS_IRONIC_MICROVERSION_DEFAULT,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_IRONIC_MICROVERSION_1_80,
+            CONDUCTORS_METRICS_IRONIC_MICROVERSION_1_80,
+            id='api rest microversion 1.80',
+        ),
+        pytest.param(
+            configs.SDK,
+            CONDUCTORS_METRICS_IRONIC_MICROVERSION_DEFAULT,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_IRONIC_MICROVERSION_1_80,
+            CONDUCTORS_METRICS_IRONIC_MICROVERSION_1_80,
+            id='api sdk microversion 1.80',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_conductors_metrics(aggregator, check, dd_run_check, metrics):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric['count'],
+            value=metric['value'],
+            tags=metric['tags'],
+        )
diff --git a/openstack_controller/tests/test_unit_keystone.py b/openstack_controller/tests/test_unit_keystone.py
new file mode 100644
index 0000000000000..27268be3f9075
--- /dev/null
+++ b/openstack_controller/tests/test_unit_keystone.py
@@ -0,0 +1,1510 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+import logging
+import os
+
+import mock
+import pytest
+
+import tests.configs as configs
+from datadog_checks.base import AgentCheck
+from datadog_checks.dev.http import MockResponse
+from datadog_checks.openstack_controller.api.type import ApiType
+from tests.common import remove_service_from_catalog
+
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(os.environ.get('OPENSTACK_E2E_LEGACY') == 'true', reason='Not Legacy test'),
+]
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_keystone_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "identity": False,
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.keystone.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_keystone_region_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "identity": {
+                "regions": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.keystone.region')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_keystone_domain_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "identity": {
+                "domains": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.keystone.domain')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_keystone_project_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "identity": {
+                "projects": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.keystone.project')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_keystone_user_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "identity": {
+                "users": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.keystone.user')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_keystone_group_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "identity": {
+                "groups": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.keystone.group')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_keystone_service_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "identity": {
+                "services": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.keystone.service')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_keystone_limit_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "identity": {
+                "limits": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.keystone.limit')
+
+
+@pytest.mark.parametrize(
+    ('mock_http_post', 'session_auth', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'replace': {'/identity/v3/auth/tokens': lambda d: remove_service_from_catalog(d, ['identity'])}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'catalog': []},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_post', 'session_auth'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_not_in_catalog(aggregator, check, dd_run_check, caplog, mock_http_post, session_auth, api_type):
+    with caplog.at_level(logging.DEBUG):
+        dd_run_check(check)
+
+    aggregator.assert_metric(
+        'openstack.keystone.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.keystone.api.up',
+        status=AgentCheck.OK,
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.keystone.api.up',
+        status=AgentCheck.CRITICAL,
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.keystone.api.up',
+        status=AgentCheck.UNKNOWN,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_post.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:8080/identity') == 0
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_post.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/auth/tokens') == 4
+    if api_type == ApiType.SDK:
+        assert session_auth.get_access.call_count == 4
+    assert '`identity` component not found in catalog' in caplog.text
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_region_id_in_tags(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "endpoint_region_id": "RegionOne",
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.response_time',
+        count=1,
+        tags=[
+            'region_id:RegionOne',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_service_check(
+        'openstack.keystone.api.up',
+        status=AgentCheck.OK,
+        tags=[
+            'region_id:RegionOne',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'instance'),
+    [
+        pytest.param(
+            {'http_error': {'/identity': MockResponse(status_code=500)}},
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            {'http_error': {'/identity': MockResponse(status_code=500)}},
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time_exception(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.keystone.api.up',
+        status=AgentCheck.OK,
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.keystone.api.up',
+        status=AgentCheck.UNKNOWN,
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.keystone.api.up',
+        status=AgentCheck.CRITICAL,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, _ = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:8080/identity') == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_service_check(
+        'openstack.keystone.api.up',
+        status=AgentCheck.UNKNOWN,
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.keystone.api.up',
+        status=AgentCheck.CRITICAL,
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.response_time',
+        count=1,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    aggregator.assert_service_check(
+        'openstack.keystone.api.up',
+        status=AgentCheck.OK,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:8080/identity') == 1
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_identity', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/identity/v3/regions': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'regions': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_identity'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_regions_exception(aggregator, check, dd_run_check, mock_http_get, connection_identity, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.region.count',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.region.enabled',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/regions') == 2
+    if api_type == ApiType.SDK:
+        assert connection_identity.regions.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_regions_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.region.count',
+        value=1,
+        tags=[
+            'region_id:RegionOne',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.region.count',
+        value=1,
+        tags=[
+            'region_id:my-region',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_identity', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/identity/v3/domains': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'domains': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_identity'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_domains_exception(aggregator, check, dd_run_check, mock_http_get, connection_identity, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.domain.count',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.domain.enabled',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/domains') == 2
+    if api_type == ApiType.SDK:
+        assert connection_identity.domains.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_domains_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.domain.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'domain_name:Default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.domain.count',
+        value=1,
+        tags=[
+            'domain_id:03e40b01788d403e98e4b9a20210492e',
+            'domain_name:New domain',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.domain.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'domain_name:Default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.domain.enabled',
+        value=1,
+        tags=[
+            'domain_id:03e40b01788d403e98e4b9a20210492e',
+            'domain_name:New domain',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_identity', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/identity/v3/projects': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'projects': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_identity'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_projects_exception(aggregator, check, dd_run_check, mock_http_get, connection_identity, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.project.count',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.project.enabled',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/projects') == 2
+    if api_type == ApiType.SDK:
+        assert connection_identity.projects.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_projects_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.project.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.project.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.project.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.project.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.project.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:b0700d860b244dcbb038541976cd8f32',
+            'project_name:alt_demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.project.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:b0700d860b244dcbb038541976cd8f32',
+            'project_name:alt_demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.project.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:c1147335eac0402ea9cabaae59c267e1',
+            'project_name:invisible_to_admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.project.enabled',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:c1147335eac0402ea9cabaae59c267e1',
+            'project_name:invisible_to_admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.project.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:e9e405ed5811407db982e3113e52d26b',
+            'project_name:service',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.project.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:e9e405ed5811407db982e3113e52d26b',
+            'project_name:service',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_identity', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/identity/v3/users': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'users': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_identity'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_users_exception(aggregator, check, dd_run_check, mock_http_get, connection_identity, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.user.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/users') == 2
+    if api_type == ApiType.SDK:
+        assert connection_identity.users.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_users_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.user.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:78205c506b534738bc851d3e189a00c3',
+            'user_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:78205c506b534738bc851d3e189a00c3',
+            'user_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:2059bc7347c94546bef812b1092cc5cf',
+            'user_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:e3e3e90d24b34e52970a54c9e8656778',
+            'user_name:demo_reader',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:3472440960de4595be3b975d230979d3',
+            'user_name:alt_demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:87e289ddac6d4dce8626a659c5ea88ae',
+            'user_name:alt_demo_member',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:61f0cd4dec604f968ff6cc92d4c1c278',
+            'user_name:alt_demo_reader',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:5d0c9a6896c9430b8a1528424c9ee6f6',
+            'user_name:system_member',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:aeaa8e9835284e4380583e10bb2575fd',
+            'user_name:system_reader',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:bc603ecd6ed940119be9a3a933c39509',
+            'user_name:nova',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:ad9f72f911744acbbf69379e45a3ef37',
+            'user_name:glance',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:94fb5df1e547496894f9304a9b4a06d4',
+            'user_name:neutron',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:af4653d4f2dc4a38b8af36cbd3993d5a',
+            'user_name:cinder',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.user.enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'user_id:fc7c3571bed548e98e7df266f57a50f7',
+            'user_name:placement',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_identity', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/identity/v3/groups': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'groups': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_identity'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_groups_exception(aggregator, check, dd_run_check, mock_http_get, connection_identity, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.group.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/groups') == 2
+    if api_type == ApiType.SDK:
+        assert connection_identity.groups.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_identity', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/identity/v3/groups/89b36a4c32c44b0ea8856b6357f101ea/users': MockResponse(status_code=500)
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'group_users': {'89b36a4c32c44b0ea8856b6357f101ea': MockResponse(status_code=500)}}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_identity'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_group_users_exception(aggregator, check, dd_run_check, mock_http_get, connection_identity, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.group.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'group_id:89b36a4c32c44b0ea8856b6357f101ea',
+            'group_name:admins',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.group.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'group_id:9acda6caf16e4828935f4f681ee8b3e5',
+            'group_name:nonadmins',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.group.users',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'group_id:89b36a4c32c44b0ea8856b6357f101ea',
+            'group_name:admins',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.group.users',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'group_id:9acda6caf16e4828935f4f681ee8b3e5',
+            'group_name:nonadmins',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/groups/89b36a4c32c44b0ea8856b6357f101ea/users') == 1
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/groups/9acda6caf16e4828935f4f681ee8b3e5/users') == 1
+    if api_type == ApiType.SDK:
+        assert connection_identity.group_users.call_count == 2
+        assert connection_identity.group_users.call_args_list.count(mock.call('89b36a4c32c44b0ea8856b6357f101ea')) == 1
+        assert connection_identity.group_users.call_args_list.count(mock.call('9acda6caf16e4828935f4f681ee8b3e5')) == 1
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_groups_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.group.count',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'group_id:89b36a4c32c44b0ea8856b6357f101ea',
+            'group_name:admins',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.group.users',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'group_id:89b36a4c32c44b0ea8856b6357f101ea',
+            'group_name:admins',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.group.count',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'group_id:9acda6caf16e4828935f4f681ee8b3e5',
+            'group_name:nonadmins',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.group.users',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'group_id:9acda6caf16e4828935f4f681ee8b3e5',
+            'group_name:nonadmins',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_identity', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/identity/v3/services': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'services': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_identity'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_services_exception(aggregator, check, dd_run_check, mock_http_get, connection_identity, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.service.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, kwargs = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/services') == 2
+    if api_type == ApiType.SDK:
+        assert connection_identity.services.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_services_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.service.count',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_id:9aca42df11e84366924013b2f1a1259b',
+            'service_name:nova',
+            'service_type:compute',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.service.enabled',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_id:155d28a57a054d5fae86410b566ffca1',
+            'service_name:placement',
+            'service_type:placement',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.service.enabled',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_id:17d8088bf93b41b19ae971eb6f2aa7a5',
+            'service_name:nova_legacy',
+            'service_type:compute_legacy',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.service.enabled',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_id:271afc4cc62e493592b6be9b87bfb108',
+            'service_name:keystone',
+            'service_type:identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.service.enabled',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_id:3ef836a26c2c40acabb07a6415384f20',
+            'service_name:cinderv3',
+            'service_type:volumev3',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.service.enabled',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_id:55b21161725a461793a2222749229306',
+            'service_name:cinder',
+            'service_type:block-storage',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.service.enabled',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_id:7dca0a2e55d74d66995f3105ed69608f',
+            'service_name:neutron',
+            'service_type:network',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.service.enabled',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_id:82624ab61fb04f058d043facf315fa3c',
+            'service_name:glance',
+            'service_type:image',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.service.enabled',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'service_id:9aca42df11e84366924013b2f1a1259b',
+            'service_name:nova',
+            'service_type:compute',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_identity', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/identity/v3/registered_limits': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'registered_limits': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_identity'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_registered_limits_exception(aggregator, check, dd_run_check, mock_http_get, connection_identity, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.limit.limit',
+        count=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'limit_id:dd4fefa5602a4414b1c0a01ac7514b97',
+            'resource_name:image_size_total',
+            'region_id:RegionOne',
+            'service_id:82624ab61fb04f058d043facf315fa3c',
+        ],
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, kwargs = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/registered_limits') == 2
+    if api_type == ApiType.SDK:
+        assert connection_identity.registered_limits.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_identity', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/identity/v3/limits': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'limits': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_identity'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_limits_exception(aggregator, check, dd_run_check, mock_http_get, connection_identity, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.limit.limit',
+        count=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'limit_id:25a04c7a065c430590881c646cdcdd58',
+            "project_id:3a705b9f56bb439381b43c4fe59dccce",
+            'resource_name:volume',
+            'service_id:9408080f1970482aa0e38bc2d4ea34b7',
+        ],
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, kwargs = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/limits') == 2
+    if api_type == ApiType.SDK:
+        assert connection_identity.limits.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_limits_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.keystone.limit.limit',
+        value=1000,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'limit_id:dd4fefa5602a4414b1c0a01ac7514b97',
+            'resource_name:image_size_total',
+            'region_id:RegionOne',
+            'service_id:82624ab61fb04f058d043facf315fa3c',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.limit.limit',
+        value=1000,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'limit_id:5e7d44c9d30d47919187a5c1a58a8885',
+            'resource_name:image_stage_total',
+            'region_id:RegionOne',
+            'service_id:82624ab61fb04f058d043facf315fa3c',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.limit.limit',
+        value=100,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'limit_id:9f489d63900841f4a70fe58036c81339',
+            'resource_name:image_count_total',
+            'region_id:RegionOne',
+            'service_id:82624ab61fb04f058d043facf315fa3c',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.limit.limit',
+        value=100,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'limit_id:5d26b57b414c4e25848cd34b38f56606',
+            'resource_name:image_count_uploading',
+            'region_id:RegionOne',
+            'service_id:82624ab61fb04f058d043facf315fa3c',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.limit.limit',
+        value=11,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'limit_id:25a04c7a065c430590881c646cdcdd58',
+            "project_id:3a705b9f56bb439381b43c4fe59dccce",
+            'resource_name:volume',
+            'service_id:9408080f1970482aa0e38bc2d4ea34b7',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.keystone.limit.limit',
+        value=5,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'limit_id:3229b3849f584faea483d6851f7aab05',
+            "project_id:3a705b9f56bb439381b43c4fe59dccce",
+            'region_id:RegionOne',
+            'resource_name:snapshot',
+            'service_id:9408080f1970482aa0e38bc2d4ea34b7',
+        ],
+    )
diff --git a/openstack_controller/tests/test_unit_neutron.py b/openstack_controller/tests/test_unit_neutron.py
new file mode 100644
index 0000000000000..f7226c6a297d4
--- /dev/null
+++ b/openstack_controller/tests/test_unit_neutron.py
@@ -0,0 +1,1426 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+import logging
+import os
+
+import mock
+import pytest
+
+import tests.configs as configs
+import tests.metrics as metrics
+from datadog_checks.base import AgentCheck
+from datadog_checks.dev.http import MockResponse
+from datadog_checks.openstack_controller.api.type import ApiType
+from tests.common import remove_service_from_catalog
+
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(os.environ.get('OPENSTACK_E2E_LEGACY') == 'true', reason='Not Legacy test'),
+]
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_neutron_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "network": False,
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.neutron.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_neutron_agent_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "network": {
+                "agents": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.neutron.agent.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_neutron_quota_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "network": {
+                "quotas": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.neutron.quota.')
+
+
+@pytest.mark.parametrize(
+    ('mock_http_post', 'session_auth', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'replace': {'/identity/v3/auth/tokens': lambda d: remove_service_from_catalog(d, ['network'])}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'catalog': []},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_post', 'session_auth'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_not_in_catalog(aggregator, check, dd_run_check, caplog, mock_http_post, session_auth, api_type):
+    with caplog.at_level(logging.DEBUG):
+        dd_run_check(check)
+
+    aggregator.assert_metric(
+        'openstack.neutron.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.neutron.api.up',
+        status=AgentCheck.UNKNOWN,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_post.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:9696/networking') == 0
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_post.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/auth/tokens') == 4
+    if api_type == ApiType.SDK:
+        assert session_auth.get_access.call_count == 4
+    assert '`network` component not found in catalog' in caplog.text
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'instance'),
+    [
+        pytest.param(
+            {'http_error': {'/networking': MockResponse(status_code=500)}},
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            {'http_error': {'/networking': MockResponse(status_code=500)}},
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time_exception(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.neutron.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.neutron.api.up',
+        status=AgentCheck.CRITICAL,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:9696/networking') == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.neutron.response_time',
+        count=1,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    aggregator.assert_service_check(
+        'openstack.neutron.api.up',
+        status=AgentCheck.OK,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:9696/networking') == 1
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_network', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/networking/v2.0/agents': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'agents': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_network'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_agents_exception(aggregator, check, dd_run_check, mock_http_get, connection_network, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.neutron.agent.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:9696/networking/v2.0/agents') == 2
+    if api_type == ApiType.SDK:
+        assert connection_network.agents.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_agents_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.neutron.agent.count',
+        value=1,
+        tags=[
+            'agent_availability_zone:',
+            'agent_host:agent-integrations-openstack-default',
+            'agent_id:2f4eba9c-8c8a-5836-b0d7-85d6eb176f20',
+            'agent_name:neutron-ovn-metadata-agent',
+            'agent_type:OVN Metadata agent',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.agent.alive',
+        value=1,
+        tags=[
+            'agent_availability_zone:',
+            'agent_host:agent-integrations-openstack-default',
+            'agent_id:2f4eba9c-8c8a-5836-b0d7-85d6eb176f20',
+            'agent_name:neutron-ovn-metadata-agent',
+            'agent_type:OVN Metadata agent',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.agent.admin_state_up',
+        value=1,
+        tags=[
+            'agent_availability_zone:',
+            'agent_host:agent-integrations-openstack-default',
+            'agent_id:2f4eba9c-8c8a-5836-b0d7-85d6eb176f20',
+            'agent_name:neutron-ovn-metadata-agent',
+            'agent_type:OVN Metadata agent',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.agent.count',
+        value=1,
+        tags=[
+            'agent_availability_zone:',
+            'agent_host:agent-integrations-openstack-default',
+            'agent_id:203083d6-ddae-4023-aa83-ab679c9f4d2d',
+            'agent_name:ovn-controller',
+            'agent_type:OVN Controller Gateway agent',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.agent.alive',
+        value=1,
+        tags=[
+            'agent_availability_zone:',
+            'agent_host:agent-integrations-openstack-default',
+            'agent_id:203083d6-ddae-4023-aa83-ab679c9f4d2d',
+            'agent_name:ovn-controller',
+            'agent_type:OVN Controller Gateway agent',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.agent.admin_state_up',
+        value=1,
+        tags=[
+            'agent_availability_zone:',
+            'agent_host:agent-integrations-openstack-default',
+            'agent_id:203083d6-ddae-4023-aa83-ab679c9f4d2d',
+            'agent_name:ovn-controller',
+            'agent_type:OVN Controller Gateway agent',
+            'keystone_server:http://127.0.0.1:8080/identity',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_network_collect_for_all_projects(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "projects": {
+            "include": [
+                {
+                    "name": ".*",
+                    "network": False,
+                },
+            ],
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in metrics.NEUTRON_PROJECT_METRICS:
+        aggregator.assert_metric(metric, count=0)
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_networks_collect_for_all_projects(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "projects": {
+            "include": [
+                {
+                    "name": ".*",
+                    "network": {
+                        "networks": False,
+                    },
+                },
+            ],
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in metrics.NEUTRON_NETWORK_METRICS:
+        aggregator.assert_metric(metric, count=0)
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_quotas_collect_for_all_projects(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "projects": {
+            "include": [
+                {
+                    "name": ".*",
+                    "network": {
+                        "quotas": False,
+                    },
+                },
+            ],
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in metrics.NEUTRON_QUOTA_METRICS:
+        aggregator.assert_metric(metric, count=0)
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_network', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/networking/v2.0/networks?project_id=1e6e233e637d4d55a50a62b63398ad15': MockResponse(
+                        status_code=500
+                    ),
+                    '/networking/v2.0/networks?project_id=6e39099cccde4f809b003d9e0dd09304': MockResponse(
+                        status_code=500
+                    ),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'networks': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_network'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_networks_exception(aggregator, check, dd_run_check, mock_http_get, connection_network, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.neutron.network.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9696/networking/v2.0/networks?project_id=1e6e233e637d4d55a50a62b63398ad15'
+            )
+            == 1
+        )
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9696/networking/v2.0/networks?project_id=6e39099cccde4f809b003d9e0dd09304'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert connection_network.networks.call_count == 2
+        assert (
+            connection_network.networks.call_args_list.count(mock.call(project_id='1e6e233e637d4d55a50a62b63398ad15'))
+            == 1
+        )
+        assert (
+            connection_network.networks.call_args_list.count(mock.call(project_id='6e39099cccde4f809b003d9e0dd09304'))
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_networks_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.neutron.network.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.admin_state_up',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.mtu',
+        value=1500,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.port_security_enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.shared',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.is_default',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.admin_state_up',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.mtu',
+        value=1442,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.port_security_enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.shared',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.admin_state_up',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.mtu',
+        value=1442,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.port_security_enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.shared',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_networks_metrics_with_include(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "projects": {
+            "include": [
+                {
+                    "name": ".*",
+                    "network": {
+                        "networks": {
+                            "include": [
+                                {
+                                    "name": "^public.*",
+                                },
+                            ],
+                        },
+                    },
+                },
+            ],
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.neutron.network.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.admin_state_up',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.mtu',
+        value=1500,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.port_security_enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.shared',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.is_default',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.count',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.admin_state_up',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.mtu',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.port_security_enabled',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.shared',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.count',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.admin_state_up',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.mtu',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.port_security_enabled',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.shared',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_networks_metrics_with_exclude(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "projects": {
+            "include": [
+                {
+                    "name": ".*",
+                    "network": {
+                        "networks": {
+                            "include": [
+                                {
+                                    "name": "^.*",
+                                },
+                            ],
+                            "exclude": ["^private.*"],
+                        },
+                    },
+                },
+            ],
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.neutron.network.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.admin_state_up',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.mtu',
+        value=1500,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.port_security_enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.shared',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.is_default',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ec38babc-37e8-4bd7-9de0-03009304b2e4',
+            'network_name:public',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.admin_state_up',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.mtu',
+        value=1442,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.port_security_enabled',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.shared',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:f7b6adc8-24ea-490c-9537-5c4eae015cd8',
+            'network_name:shared',
+            'network_status:ACTIVE',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.count',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.admin_state_up',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.mtu',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.port_security_enabled',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.network.shared',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'network_id:ebdfddd9-14b8-46bd-98d6-10205d13038c',
+            'network_name:private',
+            'network_status:ACTIVE',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_network', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/networking/v2.0/quotas/1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                    '/networking/v2.0/quotas/6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'quotas': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_network'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_quotas_exception(aggregator, check, dd_run_check, mock_http_get, connection_network, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.quota.floatingip',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.nova.quota.network',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.nova.quota.port',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:9696/networking/v2.0/quotas/1e6e233e637d4d55a50a62b63398ad15') == 1
+        assert args_list.count('http://127.0.0.1:9696/networking/v2.0/quotas/6e39099cccde4f809b003d9e0dd09304') == 1
+    if api_type == ApiType.SDK:
+        assert connection_network.get_quota.call_count == 2
+        assert (
+            connection_network.get_quota.call_args_list.count(
+                mock.call('1e6e233e637d4d55a50a62b63398ad15', details=True)
+            )
+            == 1
+        )
+        assert (
+            connection_network.get_quota.call_args_list.count(
+                mock.call('6e39099cccde4f809b003d9e0dd09304', details=True)
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=[],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_quotas_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.neutron.quota.floatingip',
+        value=50,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.quota.network',
+        value=100,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.quota.port',
+        value=500,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.quota.rbac_policy',
+        value=10,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.quota.floatingip',
+        value=50,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.quota.network',
+        value=100,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.quota.port',
+        value=500,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.neutron.quota.rbac_policy',
+        value=10,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
diff --git a/openstack_controller/tests/test_unit_nova.py b/openstack_controller/tests/test_unit_nova.py
new file mode 100644
index 0000000000000..9d35c12bd9835
--- /dev/null
+++ b/openstack_controller/tests/test_unit_nova.py
@@ -0,0 +1,2264 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+
+
+import logging
+import os
+
+import mock
+import pytest
+
+import tests.configs as configs
+import tests.metrics as metrics
+from datadog_checks.base import AgentCheck
+from datadog_checks.dev.http import MockResponse
+from datadog_checks.openstack_controller.api.type import ApiType
+from tests.common import remove_service_from_catalog
+
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(os.environ.get('OPENSTACK_E2E_LEGACY') == 'true', reason='Not Legacy test'),
+]
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_external_tags(datadog_agent, dd_run_check, check):
+    dd_run_check(check)
+    datadog_agent.assert_external_tags(
+        'agent-integrations-openstack-default',
+        {
+            'openstack': [
+                'host_type:hypervisor',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '3b27b706-c0ad-4528-a865-7afaf7712130',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '4caf78dc-2e5d-40a7-8d56-1c2f7f664283',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '67ca710a-e73f-4801-a12f-d0c55ccb8955',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '7994720d-62a5-4b48-9158-f941d98db5c1',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '97dec705-edab-4b3a-bbe6-b2121a85a603',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '9e80aa16-5a28-4ec0-bfce-f83bf56d0c86',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        'cca55639-448f-44cc-ae6a-150afe0fa6b3',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        'd34c4531-7cd1-4454-b39e-356463af7700',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '5102fbbf-7156-48dc-8355-af7ab992266f',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '954441a8-552a-476c-985e-6564e6fe93d6',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '2c653a68-b520-4582-a05d-41a68067d76c',
+        {
+            'openstack': [
+                'host_type:server',
+                'aggregate:primary-aggregate',
+                'aggregate:secondary-aggregate',
+                'availability_zone:availability-zone',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '9d72cf53-19c8-4942-9314-005fa5d2a6a0',
+        {
+            'openstack': [
+                'host_type:baremetal',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        'bd7a61bb-5fe0-4c93-9628-55e312f9ef0e',
+        {
+            'openstack': [
+                'host_type:baremetal',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '54855e59-83ca-46f8-a78f-55d3370e0656',
+        {
+            'openstack': [
+                'host_type:baremetal',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags(
+        '20512deb-e493-4796-a046-5d6e4e072c95',
+        {
+            'openstack': [
+                'host_type:baremetal',
+            ]
+        },
+    )
+    datadog_agent.assert_external_tags_count(16)
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_nova_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": False,
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.nova.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_nova_limit_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": {
+                "limits": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.nova.limit.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_nova_service_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": {
+                "services": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.nova.service.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_nova_flavor_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": {
+                "flavors": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.nova.flavor.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_nova_quota_set_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": {
+                "quota_sets": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.nova.quota_set.')
+
+
+@pytest.mark.parametrize(
+    ('mock_http_post', 'session_auth', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'replace': {'/identity/v3/auth/tokens': lambda d: remove_service_from_catalog(d, ['compute'])}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'catalog': []},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_post', 'session_auth'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_not_in_catalog(aggregator, check, dd_run_check, caplog, mock_http_post, session_auth, api_type):
+    with caplog.at_level(logging.DEBUG):
+        dd_run_check(check)
+
+    aggregator.assert_metric(
+        'openstack.nova.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.nova.api.up',
+        status=AgentCheck.UNKNOWN,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_post.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:8774/compute/v2.1') == 0
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_post.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/auth/tokens') == 4
+    if api_type == ApiType.SDK:
+        assert session_auth.get_access.call_count == 4
+    assert '`compute` component not found in catalog' in caplog.text
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'instance'),
+    [
+        pytest.param(
+            {'http_error': {'/compute/v2.1': MockResponse(status_code=500)}},
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            {'http_error': {'/compute/v2.1': MockResponse(status_code=500)}},
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time_exception(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.nova.api.up',
+        status=AgentCheck.CRITICAL,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, _ = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:8774/compute/v2.1') == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.response_time',
+        count=1,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    aggregator.assert_service_check(
+        'openstack.nova.api.up',
+        status=AgentCheck.OK,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, _ = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:8774/compute/v2.1') == 1
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_compute', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/compute/v2.1/limits?tenant_id=1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                    '/compute/v2.1/limits?tenant_id=6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'limits': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_compute'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_limits_exception(aggregator, check, dd_run_check, mock_http_get, connection_compute, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_instances',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_cores',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_ram_size',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_server_meta',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        num_calls = sum('http://127.0.0.1:8774/compute/v2.1/limits?tenant_id=' in arg for arg in args_list)
+        assert num_calls == 2
+    if api_type == ApiType.SDK:
+        assert connection_compute.get_limits.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_limits_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_instances',
+        value=10,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_instances',
+        value=10,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_cores',
+        value=20,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_cores',
+        value=20,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_ram_size',
+        value=51200,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_ram_size',
+        value=51200,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_server_meta',
+        value=128,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_server_meta',
+        value=128,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_keypairs',
+        value=100,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_total_keypairs',
+        value=100,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_server_groups',
+        value=10,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_server_groups',
+        value=10,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_server_group_members',
+        value=10,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.max_server_group_members',
+        value=10,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.total_ram_used',
+        value=2048,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.total_ram_used',
+        value=2048,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.total_cores_used',
+        value=8,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.total_cores_used',
+        value=8,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.total_instances_used',
+        value=8,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.total_instances_used',
+        value=8,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.total_server_groups_used',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:admin',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.limit.absolute.total_server_groups_used',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'domain_id:default',
+            'project_name:demo',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_compute', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/compute/v2.1/os-services': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'services': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_compute'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_services_exception(aggregator, check, dd_run_check, mock_http_get, connection_compute, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.service.up',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8774/compute/v2.1/os-services') == 2
+    if api_type == ApiType.SDK:
+        assert connection_compute.services.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics'),
+    [
+        pytest.param(
+            configs.REST,
+            metrics.COMPUTE_SERVICES_NOVA_MICROVERSION_DEFAULT,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_SERVICES_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            metrics.COMPUTE_SERVICES_NOVA_MICROVERSION_DEFAULT,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_SERVICES_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_services_metrics(aggregator, check, dd_run_check, metrics):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+        )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_compute', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/compute/v2.1/flavors/detail': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'flavors': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_compute'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_flavors_exception(aggregator, check, dd_run_check, mock_http_get, connection_compute, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8774/compute/v2.1/flavors/detail') == 2
+    if api_type == ApiType.SDK:
+        assert connection_compute.flavors.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_flavors_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:1',
+            'flavor_name:m1.tiny',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:2',
+            'flavor_name:m1.small',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=2,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:3',
+            'flavor_name:m1.medium',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=4,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:4',
+            'flavor_name:m1.large',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:42',
+            'flavor_name:m1.nano',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=8,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:5',
+            'flavor_name:m1.xlarge',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:84',
+            'flavor_name:m1.micro',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:c1',
+            'flavor_name:cirros256',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:d1',
+            'flavor_name:ds512M',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:d2',
+            'flavor_name:ds1G',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=2,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:d3',
+            'flavor_name:ds2G',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.vcpus',
+        value=4,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:d4',
+            'flavor_name:ds4G',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:1',
+            'flavor_name:m1.tiny',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:2',
+            'flavor_name:m1.small',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:3',
+            'flavor_name:m1.medium',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:4',
+            'flavor_name:m1.large',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:42',
+            'flavor_name:m1.nano',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:5',
+            'flavor_name:m1.xlarge',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:84',
+            'flavor_name:m1.micro',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:c1',
+            'flavor_name:cirros256',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:d1',
+            'flavor_name:ds512M',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:d2',
+            'flavor_name:ds1G',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:d3',
+            'flavor_name:ds2G',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.nova.flavor.swap',
+        value=0,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'flavor_id:d4',
+            'flavor_name:ds4G',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_compute', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/compute/v2.1/os-hypervisors/detail': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'hypervisors': MockResponse(status_code=500)}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_compute'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_hypervisors_exception(aggregator, check, dd_run_check, mock_http_get, connection_compute, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.hypervisor.up',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8774/compute/v2.1/os-hypervisors/detail') == 2
+    if api_type == ApiType.SDK:
+        assert connection_compute.hypervisors.call_count == 2
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_compute', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'http_error': {'/compute/v2.1/os-hypervisors/1/uptime': MockResponse(status_code=500)}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'http_error': {'hypervisor_uptime': {1: MockResponse(status_code=500)}}},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_compute'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_hypervisor_uptime_exception(aggregator, check, dd_run_check, mock_http_get, connection_compute, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.hypervisor.up',
+        value=1,
+        tags=[
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'hypervisor_id:1',
+            'hypervisor_name:agent-integrations-openstack-default',
+            'hypervisor_state:up',
+            'hypervisor_status:enabled',
+            'hypervisor_type:QEMU',
+        ],
+        hostname='agent-integrations-openstack-default',
+    )
+    aggregator.assert_metric(
+        'openstack.nova.hypervisor.load_1',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.nova.hypervisor.load_5',
+        count=0,
+    )
+    aggregator.assert_metric(
+        'openstack.nova.hypervisor.load_15',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8774/compute/v2.1/os-hypervisors/1/uptime') == 1
+    if api_type == ApiType.SDK:
+        assert connection_compute.get_hypervisor_uptime.call_count == 1
+        assert connection_compute.get_hypervisor_uptime.call_args_list.count(mock.call(1)) == 1
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_hypervisors_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": {
+                "hypervisors": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in metrics.NOVA_ALL_HYPERVISOR_METRICS:
+        aggregator.assert_metric(metric, count=0)
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_all_hypervisors_uptime_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": {
+                "hypervisors": {
+                    "include": [
+                        {
+                            "hypervisor_hostname": ".*",
+                            "uptime": False,
+                        },
+                    ],
+                },
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in metrics.NOVA_HYPERVISOR_UPTIME_METRICS:
+        aggregator.assert_metric(metric, count=0)
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics'),
+    [
+        pytest.param(
+            configs.REST,
+            metrics.COMPUTE_HYPERVISORS_NOVA_MICROVERSION_DEFAULT,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_HYPERVISORS_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            metrics.COMPUTE_HYPERVISORS_NOVA_MICROVERSION_DEFAULT,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_HYPERVISORS_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_hypervisors_metrics(aggregator, check, dd_run_check, metrics):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+            hostname=metric.get('hostname'),
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest nova microverion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk nova microverion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_compute_collect_for_all_projects(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": False,
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in metrics.NOVA_PROJECT_METRICS:
+        aggregator.assert_metric(metric, count=0)
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest nova microverion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk nova microverion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_servers_collect_for_all_projects(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": {
+                "servers": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in metrics.NOVA_ALL_SERVER_METRICS:
+        aggregator.assert_metric(metric, count=0)
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest nova microverion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk nova microverion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_flavors_collect_for_all_servers(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": {
+                "servers": {
+                    "include": [
+                        {
+                            "name": ".*",
+                            "flavors": False,
+                        }
+                    ]
+                },
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in metrics.NOVA_SERVER_FLAVOR_METRICS:
+        aggregator.assert_metric(metric, count=0)
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest nova microverion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk nova microverion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_diagnostics_collect_for_all_servers(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "compute": {
+                "servers": {
+                    "include": [
+                        {
+                            "name": ".*",
+                            "diagnostics": False,
+                        }
+                    ]
+                },
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in metrics.NOVA_ALL_DIAGNOSTIC_METRICS:
+        aggregator.assert_metric(metric, count=0)
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_compute', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/compute/v2.1/os-quota-sets/1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                    '/compute/v2.1/os-quota-sets/6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'quota_sets': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_compute'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_quota_sets_exception(aggregator, check, dd_run_check, mock_http_get, connection_compute, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.quota_set.cores',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8774/compute/v2.1/os-quota-sets/1e6e233e637d4d55a50a62b63398ad15') == 1
+        assert args_list.count('http://127.0.0.1:8774/compute/v2.1/os-quota-sets/6e39099cccde4f809b003d9e0dd09304') == 1
+    if api_type == ApiType.SDK:
+        assert connection_compute.get_quota_set.call_count == 2
+        assert connection_compute.get_quota_set.call_args_list.count(mock.call('1e6e233e637d4d55a50a62b63398ad15')) == 1
+        assert connection_compute.get_quota_set.call_args_list.count(mock.call('6e39099cccde4f809b003d9e0dd09304')) == 1
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics'),
+    [
+        pytest.param(
+            configs.REST,
+            metrics.COMPUTE_QUOTA_SETS_NOVA_MICROVERSION_DEFAULT,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_QUOTA_SETS_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            metrics.COMPUTE_QUOTA_SETS_NOVA_MICROVERSION_DEFAULT,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_QUOTA_SETS_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_quota_sets_metrics(aggregator, check, dd_run_check, metrics):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics'),
+    [
+        pytest.param(
+            configs.REST_EXCLUDING_DEMO_PROJECT,
+            metrics.COMPUTE_QUOTA_SETS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_DEFAULT,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93_EXCLUDING_DEMO_PROJECT,
+            metrics.COMPUTE_QUOTA_SETS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK_EXCLUDING_DEMO_PROJECT,
+            metrics.COMPUTE_QUOTA_SETS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_DEFAULT,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93_EXCLUDING_DEMO_PROJECT,
+            metrics.COMPUTE_QUOTA_SETS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_quota_sets_metrics_excluding_demo_project(aggregator, check, dd_run_check, metrics):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+        )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_compute', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/compute/v2.1/servers/detail?project_id=1e6e233e637d4d55a50a62b63398ad15': MockResponse(
+                        status_code=500
+                    ),
+                    '/compute/v2.1/servers/detail?project_id=6e39099cccde4f809b003d9e0dd09304': MockResponse(
+                        status_code=500
+                    ),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'servers': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_compute'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_servers_exception(aggregator, check, dd_run_check, mock_http_get, connection_compute, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.server.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:8774/compute/v2.1/servers/detail?project_id=1e6e233e637d4d55a50a62b63398ad15'
+            )
+            == 1
+        )
+        assert (
+            args_list.count(
+                'http://127.0.0.1:8774/compute/v2.1/servers/detail?project_id=6e39099cccde4f809b003d9e0dd09304'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert connection_compute.servers.call_count == 2
+        assert (
+            connection_compute.servers.call_args_list.count(
+                mock.call(details=True, project_id='1e6e233e637d4d55a50a62b63398ad15')
+            )
+            == 1
+        )
+        assert (
+            connection_compute.servers.call_args_list.count(
+                mock.call(details=True, project_id='6e39099cccde4f809b003d9e0dd09304')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance', 'api_type'),
+    [
+        pytest.param(
+            configs.REST_DEMO_SERVERS_COLLECT_FALSE,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK_DEMO_SERVERS_COLLECT_FALSE,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_servers_disable_call(aggregator, check, dd_run_check, mock_http_get, connection_compute, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.nova.server.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+            'server_id:5102fbbf-7156-48dc-8355-af7ab992266f',
+            'server_name:admin-1',
+            'server_status:ACTIVE',
+            'hypervisor:agent-integrations-openstack-default',
+            'instance_name:instance-0000004a',
+        ],
+        hostname='5102fbbf-7156-48dc-8355-af7ab992266f',
+    )
+    aggregator.assert_metric(
+        'openstack.nova.server.count',
+        count=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'server_id:67ca710a-e73f-4801-a12f-d0c55ccb8955',
+            'server_name:demo-1',
+            'server_status:ACTIVE',
+        ],
+    ),
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:8774/compute/v2.1/servers/detail?project_id=1e6e233e637d4d55a50a62b63398ad15'
+            )
+            == 0
+        )
+        assert (
+            args_list.count(
+                'http://127.0.0.1:8774/compute/v2.1/servers/detail?project_id=6e39099cccde4f809b003d9e0dd09304'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert connection_compute.servers.call_count == 1
+        assert (
+            connection_compute.servers.call_args_list.count(
+                mock.call(details=True, project_id='1e6e233e637d4d55a50a62b63398ad15')
+            )
+            == 0
+        )
+        assert (
+            connection_compute.servers.call_args_list.count(
+                mock.call(details=True, project_id='6e39099cccde4f809b003d9e0dd09304')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics'),
+    [
+        pytest.param(
+            configs.REST,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_DEFAULT,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_DEFAULT,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_servers_metrics(aggregator, check, dd_run_check, metrics):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+            hostname=metric.get('hostname'),
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics'),
+    [
+        pytest.param(
+            configs.REST_EXCLUDING_DEMO_PROJECT,
+            metrics.COMPUTE_SERVERS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_DEFAULT,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93_EXCLUDING_DEMO_PROJECT,
+            metrics.COMPUTE_SERVERS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK_EXCLUDING_DEMO_PROJECT,
+            metrics.COMPUTE_SERVERS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_DEFAULT,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93_EXCLUDING_DEMO_PROJECT,
+            metrics.COMPUTE_SERVERS_EXCLUDING_DEMO_PROJECT_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_servers_metrics_excluding_demo_project(aggregator, check, dd_run_check, metrics):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+            hostname=metric.get('hostname'),
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics'),
+    [
+        pytest.param(
+            configs.REST_EXCLUDING_DEV_SERVERS,
+            metrics.COMPUTE_SERVERS_EXCLUDING_DEV_SERVERS_NOVA_MICROVERSION_DEFAULT,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93_EXCLUDING_DEV_SERVERS,
+            metrics.COMPUTE_SERVERS_EXCLUDING_DEV_SERVERS_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK_EXCLUDING_DEV_SERVERS,
+            metrics.COMPUTE_SERVERS_EXCLUDING_DEV_SERVERS_NOVA_MICROVERSION_DEFAULT,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93_EXCLUDING_DEV_SERVERS,
+            metrics.COMPUTE_SERVERS_EXCLUDING_DEV_SERVERS_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_servers_metrics_excluding_dev_servers(aggregator, check, dd_run_check, metrics):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+            hostname=metric.get('hostname'),
+        )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_compute', 'instance', 'metrics', 'api_type', 'microversion'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/compute/v2.1/flavors/c1': MockResponse(status_code=500),
+                }
+            },
+            None,
+            configs.REST,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_DEFAULT_FLAVOR_EXCEPTION,
+            ApiType.REST,
+            None,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            {
+                'http_error': {
+                    '/compute/v2.1/flavors/c1': MockResponse(status_code=500),
+                }
+            },
+            None,
+            configs.REST_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_2_93_FLAVOR_EXCEPTION,
+            ApiType.REST,
+            '2.93',
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'flavors': {
+                        'c1': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_DEFAULT_FLAVOR_EXCEPTION,
+            ApiType.SDK,
+            None,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'flavors': {
+                        'c1': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_2_93_FLAVOR_EXCEPTION,
+            ApiType.SDK,
+            '2.93',
+            id='api sdk microversion 2.93',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_compute'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_server_flavors_exception(
+    aggregator, check, dd_run_check, mock_http_get, connection_compute, metrics, api_type, microversion
+):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+            hostname=metric.get('hostname'),
+        )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:8774/compute/v2.1/servers/5102fbbf-7156-48dc-8355-af7ab992266f/diagnostics'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert connection_compute.get_server_diagnostics.call_count == 11
+        assert (
+            connection_compute.get_server_diagnostics.call_args_list.count(
+                mock.call('5102fbbf-7156-48dc-8355-af7ab992266f')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics', 'api_type', 'microversion', 'get_flavor_calls'),
+    [
+        pytest.param(
+            configs.REST_DEMO_SERVERS_FLAVORS_FALSE,
+            metrics.COMPUTE_SERVERS_DISABLED_FLAVORS_NOVA_MICROVERSION_DEFAULT,
+            ApiType.REST,
+            None,
+            3,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93_DEMO_SERVERS_FLAVORS_FALSE,
+            metrics.COMPUTE_SERVERS_DISABLED_FLAVORS_NOVA_MICROVERSION_2_93,
+            ApiType.REST,
+            '2.93',
+            0,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK_DEMO_SERVERS_FLAVORS_FALSE,
+            metrics.COMPUTE_SERVERS_DISABLED_FLAVORS_NOVA_MICROVERSION_DEFAULT,
+            ApiType.SDK,
+            None,
+            3,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93_DEMO_SERVERS_FLAVORS_FALSE,
+            metrics.COMPUTE_SERVERS_DISABLED_FLAVORS_NOVA_MICROVERSION_2_93,
+            ApiType.SDK,
+            '2.93',
+            0,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_server_disable_flavors(
+    aggregator,
+    check,
+    dd_run_check,
+    mock_http_get,
+    connection_compute,
+    metrics,
+    api_type,
+    microversion,
+    get_flavor_calls,
+):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+            hostname=metric.get('hostname'),
+        )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8774/compute/v2.1/flavors/c1') == get_flavor_calls
+    if api_type == ApiType.SDK:
+        assert connection_compute.get_flavor.call_args_list.count(mock.call('c1')) == get_flavor_calls
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_compute', 'instance', 'metrics', 'api_type', 'microversion'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/compute/v2.1/servers/5102fbbf-7156-48dc-8355-af7ab992266f/diagnostics': MockResponse(
+                        status_code=500
+                    ),
+                }
+            },
+            None,
+            configs.REST,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_DEFAULT_SERVER_DIAGNOSTICS_EXCEPTION,
+            ApiType.REST,
+            None,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            {
+                'http_error': {
+                    '/compute/v2.1/servers/5102fbbf-7156-48dc-8355-af7ab992266f/diagnostics': MockResponse(
+                        status_code=500
+                    ),
+                }
+            },
+            None,
+            configs.REST_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_2_93_SERVER_DIAGNOSTICS_EXCEPTION,
+            ApiType.REST,
+            '2.93',
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'server_diagnostics': {
+                        '5102fbbf-7156-48dc-8355-af7ab992266f': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_DEFAULT_SERVER_DIAGNOSTICS_EXCEPTION,
+            ApiType.SDK,
+            None,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'server_diagnostics': {
+                        '5102fbbf-7156-48dc-8355-af7ab992266f': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            metrics.COMPUTE_SERVERS_NOVA_MICROVERSION_2_93_SERVER_DIAGNOSTICS_EXCEPTION,
+            ApiType.SDK,
+            '2.93',
+            id='api sdk microversion 2.93',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_compute'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_server_diagnostics_exception(
+    aggregator, check, dd_run_check, mock_http_get, connection_compute, metrics, api_type, microversion
+):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+            hostname=metric.get('hostname'),
+        )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:8774/compute/v2.1/servers/5102fbbf-7156-48dc-8355-af7ab992266f/diagnostics'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert connection_compute.get_server_diagnostics.call_count == 11
+        assert (
+            connection_compute.get_server_diagnostics.call_args_list.count(
+                mock.call('5102fbbf-7156-48dc-8355-af7ab992266f')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance', 'metrics', 'api_type', 'microversion'),
+    [
+        pytest.param(
+            configs.REST_DEMO_SERVERS_DIAGNOSTICS_FALSE,
+            metrics.COMPUTE_SERVERS_DISABLED_DIAGNOSTICS_NOVA_MICROVERSION_DEFAULT,
+            ApiType.REST,
+            None,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93_DEMO_SERVERS_DIAGNOSTICS_FALSE,
+            metrics.COMPUTE_SERVERS_DISABLED_DIAGNOSTICS_NOVA_MICROVERSION_2_93,
+            ApiType.REST,
+            '2.93',
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK_DEMO_SERVERS_DIAGNOSTICS_FALSE,
+            metrics.COMPUTE_SERVERS_DISABLED_DIAGNOSTICS_NOVA_MICROVERSION_DEFAULT,
+            ApiType.SDK,
+            None,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93_DEMO_SERVERS_DIAGNOSTICS_FALSE,
+            metrics.COMPUTE_SERVERS_DISABLED_DIAGNOSTICS_NOVA_MICROVERSION_2_93,
+            ApiType.SDK,
+            '2.93',
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_server_disable_diagnostics(
+    aggregator, check, dd_run_check, mock_http_get, connection_compute, metrics, api_type, microversion
+):
+    dd_run_check(check)
+    for metric in metrics:
+        aggregator.assert_metric(
+            metric['name'],
+            count=metric.get('count'),
+            value=metric.get('value'),
+            tags=metric.get('tags'),
+            hostname=metric.get('hostname'),
+        )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:8774/compute/v2.1/servers/67ca710a-e73f-4801-a12f-d0c55ccb8955/diagnostics'
+            )
+            == 0
+        )
+    if api_type == ApiType.SDK:
+        assert (
+            connection_compute.get_server_diagnostics.call_args_list.count(
+                mock.call('67ca710a-e73f-4801-a12f-d0c55ccb8955', microversion=microversion)
+            )
+            == 0
+        )
diff --git a/openstack_controller/tests/test_unit_octavia.py b/openstack_controller/tests/test_unit_octavia.py
new file mode 100644
index 0000000000000..5d5cf51949915
--- /dev/null
+++ b/openstack_controller/tests/test_unit_octavia.py
@@ -0,0 +1,2422 @@
+# (C) Datadog, Inc. 2023-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+import logging
+import os
+
+import mock
+import pytest
+
+import tests.configs as configs
+from datadog_checks.base import AgentCheck
+from datadog_checks.dev.http import MockResponse
+from datadog_checks.openstack_controller.api.type import ApiType
+from tests.common import remove_service_from_catalog
+
+pytestmark = [
+    pytest.mark.unit,
+    pytest.mark.skipif(os.environ.get('OPENSTACK_E2E_LEGACY') == 'true', reason='Not Legacy test'),
+]
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": False,
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_loadbalancer_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": {
+                "loadbalancers": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.loadbalancer.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_loadbalancer_stats_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": {
+                "loadbalancers": {
+                    "include": [
+                        {
+                            "name": ".*",
+                            "stats": False,
+                        }
+                    ],
+                },
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.loadbalancer.stats.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_listener_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": {
+                "listeners": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.listener.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_listener_stats_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": {
+                "listeners": {
+                    "include": [
+                        {
+                            "name": ".*",
+                            "stats": False,
+                        }
+                    ],
+                },
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.listener.stats.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_pool_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": {
+                "pools": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.pool.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_pool_member_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": {
+                "pools": {
+                    "include": [
+                        {
+                            "name": ".*",
+                            "members": False,
+                        }
+                    ],
+                },
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.pool.member')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_healthmonitor_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": {
+                "healthmonitors": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.healthmonitor.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_quota_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": {
+                "quotas": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.quota.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_amphora_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": {
+                "amphorae": False,
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.amphora.')
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest no microversion',
+        ),
+        pytest.param(
+            configs.REST_NOVA_MICROVERSION_2_93,
+            id='api rest microversion 2.93',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk no microversion',
+        ),
+        pytest.param(
+            configs.SDK_NOVA_MICROVERSION_2_93,
+            id='api sdk microversion 2.93',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_disable_octavia_amphora_stats_metrics(aggregator, dd_run_check, instance, openstack_controller_check):
+    instance = instance | {
+        "components": {
+            "load-balancer": {
+                "amphorae": {
+                    "include": [
+                        {
+                            "id": ".*",
+                            "stats": False,
+                        }
+                    ],
+                },
+            },
+        },
+    }
+    check = openstack_controller_check(instance)
+    dd_run_check(check)
+    for metric in aggregator.metric_names:
+        assert not metric.startswith('openstack.octavia.amphora.stats')
+
+
+@pytest.mark.parametrize(
+    ('mock_http_post', 'session_auth', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {'replace': {'/identity/v3/auth/tokens': lambda d: remove_service_from_catalog(d, ['load-balancer'])}},
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {'catalog': []},
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_post', 'session_auth'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_not_in_catalog(aggregator, check, dd_run_check, caplog, mock_http_post, session_auth, api_type):
+    with caplog.at_level(logging.DEBUG):
+        dd_run_check(check)
+
+    aggregator.assert_metric(
+        'openstack.octavia.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.octavia.api.up',
+        status=AgentCheck.UNKNOWN,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_post.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:9876/load-balancer') == 0
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_post.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert args_list.count('http://127.0.0.1:8080/identity/v3/auth/tokens') == 4
+    if api_type == ApiType.SDK:
+        assert session_auth.get_access.call_count == 4
+    assert '`load-balancer` component not found in catalog' in caplog.text
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'instance'),
+    [
+        pytest.param(
+            {'http_error': {'/load-balancer': MockResponse(status_code=500)}},
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            {'http_error': {'/load-balancer': MockResponse(status_code=500)}},
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time_exception(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.response_time',
+        count=0,
+    )
+    aggregator.assert_service_check(
+        'openstack.octavia.api.up',
+        status=AgentCheck.CRITICAL,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, kwargs = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:9876/load-balancer') == 2
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_response_time(aggregator, check, dd_run_check, mock_http_get):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.response_time',
+        count=1,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    aggregator.assert_service_check(
+        'openstack.octavia.api.up',
+        status=AgentCheck.OK,
+        tags=['keystone_server:http://127.0.0.1:8080/identity'],
+    )
+    args_list = []
+    for call in mock_http_get.call_args_list:
+        args, _ = call
+        args_list += list(args)
+    assert args_list.count('http://127.0.0.1:9876/load-balancer') == 1
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_load_balancer', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/load-balancer/v2/lbaas/loadbalancers?project_id=1e6e233e637d4d55a50a62b63398ad15': MockResponse(
+                        status_code=500
+                    ),
+                    '/load-balancer/v2/lbaas/loadbalancers?project_id=6e39099cccde4f809b003d9e0dd09304': MockResponse(
+                        status_code=500
+                    ),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'load_balancers': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_load_balancer'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_loadbalancers_exception(aggregator, check, dd_run_check, mock_http_get, connection_load_balancer, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.loadbalancer.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/loadbalancers?project_id=1e6e233e637d4d55a50a62b63398ad15'
+            )
+            == 1
+        )
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/loadbalancers?project_id=6e39099cccde4f809b003d9e0dd09304'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert connection_load_balancer.load_balancers.call_count == 2
+        assert (
+            connection_load_balancer.load_balancers.call_args_list.count(
+                mock.call(project_id='1e6e233e637d4d55a50a62b63398ad15')
+            )
+            == 1
+        )
+        assert (
+            connection_load_balancer.load_balancers.call_args_list.count(
+                mock.call(project_id='6e39099cccde4f809b003d9e0dd09304')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_loadbalancers_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.loadbalancer.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'loadbalancer_name:loadbalancer-1',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.loadbalancer.admin_state_up',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'loadbalancer_name:loadbalancer-1',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.loadbalancer.stats.active_connections',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'loadbalancer_name:loadbalancer-1',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.loadbalancer.stats.bytes_in',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'loadbalancer_name:loadbalancer-1',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.loadbalancer.stats.bytes_out',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'loadbalancer_name:loadbalancer-1',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.loadbalancer.stats.request_errors',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'loadbalancer_name:loadbalancer-1',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.loadbalancer.stats.total_connections',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'loadbalancer_name:loadbalancer-1',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_load_balancer', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/load-balancer/v2/lbaas/listeners?project_id=1e6e233e637d4d55a50a62b63398ad15': MockResponse(
+                        status_code=500
+                    ),
+                    '/load-balancer/v2/lbaas/listeners?project_id=6e39099cccde4f809b003d9e0dd09304': MockResponse(
+                        status_code=500
+                    ),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'listeners': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_load_balancer'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_listeners_exception(aggregator, check, dd_run_check, mock_http_get, connection_load_balancer, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.listener.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/listeners?project_id=1e6e233e637d4d55a50a62b63398ad15'
+            )
+            == 1
+        )
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/listeners?project_id=6e39099cccde4f809b003d9e0dd09304'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert connection_load_balancer.listeners.call_count == 2
+        assert (
+            connection_load_balancer.listeners.call_args_list.count(
+                mock.call(project_id='1e6e233e637d4d55a50a62b63398ad15')
+            )
+            == 1
+        )
+        assert (
+            connection_load_balancer.listeners.call_args_list.count(
+                mock.call(project_id='6e39099cccde4f809b003d9e0dd09304')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_listeners_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.listener.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'listener_name:listener-2',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.connection_limit',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.connection_limit',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'listener_name:listener-2',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.connection_limit',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_client_data',
+        value=50000,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_client_data',
+        value=50000,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'listener_name:listener-2',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_client_data',
+        value=50000,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_member_connect',
+        value=5000,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_member_connect',
+        value=5000,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'listener_name:listener-2',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_member_connect',
+        value=5000,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_member_data',
+        value=50000,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_member_data',
+        value=50000,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_member_data',
+        value=50000,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_tcp_inspect',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_tcp_inspect',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'listener_name:listener-2',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.timeout_tcp_inspect',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.active_connections',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.active_connections',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'listener_name:listener-2',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.active_connections',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.bytes_in',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.bytes_in',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'listener_name:listener-2',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.bytes_in',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.bytes_out',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.bytes_out',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'listener_name:listener-2',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.bytes_out',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.request_errors',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.request_errors',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'listener_name:listener-2',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.request_errors',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.total_connections',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'listener_name:listener-1',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.total_connections',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'listener_name:listener-2',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.listener.stats.total_connections',
+        value=0,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'listener_name:listener-3',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'operating_status:ONLINE',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_load_balancer', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/load-balancer/v2/lbaas/pools?project_id=1e6e233e637d4d55a50a62b63398ad15': MockResponse(
+                        status_code=500
+                    ),
+                    '/load-balancer/v2/lbaas/pools?project_id=6e39099cccde4f809b003d9e0dd09304': MockResponse(
+                        status_code=500
+                    ),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'pools': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_load_balancer'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_pools_exception(aggregator, dd_run_check, check, mock_http_get, connection_load_balancer, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.pool.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/pools?project_id=1e6e233e637d4d55a50a62b63398ad15'
+            )
+            == 1
+        )
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/pools?project_id=6e39099cccde4f809b003d9e0dd09304'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert connection_load_balancer.pools.call_count == 2
+        assert (
+            connection_load_balancer.pools.call_args_list.count(
+                mock.call(project_id='1e6e233e637d4d55a50a62b63398ad15')
+            )
+            == 1
+        )
+        assert (
+            connection_load_balancer.pools.call_args_list.count(
+                mock.call(project_id='6e39099cccde4f809b003d9e0dd09304')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_pools_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.pool.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'operating_status:ERROR',
+            'pool_id:d0335b34-3115-4b3b-9a1a-7e2363ebfee3',
+            'pool_name:pool-1',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_load_balancer', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/load-balancer/v2/lbaas/pools/d0335b34-3115-4b3b-9a1a-7e2363ebfee3/members'
+                    '?project_id=1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'pool_members': {
+                        'd0335b34-3115-4b3b-9a1a-7e2363ebfee3': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_load_balancer'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_pool_members_exception(aggregator, check, dd_run_check, mock_http_get, connection_load_balancer, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.pool.member.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/pools/d0335b34-3115-4b3b-9a1a-7e2363ebfee3'
+                '/members?project_id=1e6e233e637d4d55a50a62b63398ad15'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert (
+            connection_load_balancer.members.call_args_list.count(
+                mock.call('d0335b34-3115-4b3b-9a1a-7e2363ebfee3', project_id='1e6e233e637d4d55a50a62b63398ad15')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_pool_members_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.pool.member.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'member_id:e79e1011-2eb4-486f-84c3-99d2a4aef88d',
+            'member_name:amphora-a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.pool.member.admin_state_up',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'member_id:e79e1011-2eb4-486f-84c3-99d2a4aef88d',
+            'member_name:amphora-a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.pool.member.weight',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'member_id:e79e1011-2eb4-486f-84c3-99d2a4aef88d',
+            'member_name:amphora-a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.pool.member.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'member_id:0abcafea-2ad2-44cd-957f-690644ba479c',
+            'member_name:amphora-042bcca4-4d97-47a9-bc04-d88c1e3a4d72',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.pool.member.admin_state_up',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'member_id:0abcafea-2ad2-44cd-957f-690644ba479c',
+            'member_name:amphora-042bcca4-4d97-47a9-bc04-d88c1e3a4d72',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.pool.member.weight',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'member_id:0abcafea-2ad2-44cd-957f-690644ba479c',
+            'member_name:amphora-042bcca4-4d97-47a9-bc04-d88c1e3a4d72',
+            'operating_status:ERROR',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_load_balancer', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/load-balancer/v2/lbaas/healthmonitors?project_id=1e6e233e637d4d55a50a62b63398ad15': MockResponse(
+                        status_code=500
+                    ),
+                    '/load-balancer/v2/lbaas/healthmonitors?project_id=6e39099cccde4f809b003d9e0dd09304': MockResponse(
+                        status_code=500
+                    ),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'health_monitors': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_load_balancer'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_healthmonitors_exception(aggregator, check, dd_run_check, mock_http_get, connection_load_balancer, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.healthmonitor.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/healthmonitors?project_id=1e6e233e637d4d55a50a62b63398ad15'
+            )
+            == 1
+        )
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/healthmonitors?project_id=6e39099cccde4f809b003d9e0dd09304'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert (
+            connection_load_balancer.health_monitors.call_args_list.count(
+                mock.call(project_id='1e6e233e637d4d55a50a62b63398ad15')
+            )
+            == 1
+        )
+        assert (
+            connection_load_balancer.health_monitors.call_args_list.count(
+                mock.call(project_id='6e39099cccde4f809b003d9e0dd09304')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_healthmonitors_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.healthmonitor.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'healthmonitor_id:268883b7-c057-4e85-b2c5-d8760267dad1',
+            'healthmonitor_name:healthmonitor-1',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'operating_status:ONLINE',
+            'pool_id:d0335b34-3115-4b3b-9a1a-7e2363ebfee3',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'type:HTTP',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.healthmonitor.delay',
+        value=5,
+        tags=[
+            'domain_id:default',
+            'healthmonitor_id:268883b7-c057-4e85-b2c5-d8760267dad1',
+            'healthmonitor_name:healthmonitor-1',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'operating_status:ONLINE',
+            'pool_id:d0335b34-3115-4b3b-9a1a-7e2363ebfee3',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'type:HTTP',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.healthmonitor.timeout',
+        value=5,
+        tags=[
+            'domain_id:default',
+            'healthmonitor_id:268883b7-c057-4e85-b2c5-d8760267dad1',
+            'healthmonitor_name:healthmonitor-1',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'operating_status:ONLINE',
+            'pool_id:d0335b34-3115-4b3b-9a1a-7e2363ebfee3',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'type:HTTP',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.healthmonitor.max_retries',
+        value=3,
+        tags=[
+            'domain_id:default',
+            'healthmonitor_id:268883b7-c057-4e85-b2c5-d8760267dad1',
+            'healthmonitor_name:healthmonitor-1',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'operating_status:ONLINE',
+            'pool_id:d0335b34-3115-4b3b-9a1a-7e2363ebfee3',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'type:HTTP',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.healthmonitor.max_retries_down',
+        value=3,
+        tags=[
+            'domain_id:default',
+            'healthmonitor_id:268883b7-c057-4e85-b2c5-d8760267dad1',
+            'healthmonitor_name:healthmonitor-1',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'operating_status:ONLINE',
+            'pool_id:d0335b34-3115-4b3b-9a1a-7e2363ebfee3',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'provisioning_status:ACTIVE',
+            'type:HTTP',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_load_balancer', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/load-balancer/v2/lbaas/quotas?project_id=1e6e233e637d4d55a50a62b63398ad15': MockResponse(
+                        status_code=500
+                    ),
+                    '/load-balancer/v2/lbaas/quotas?project_id=6e39099cccde4f809b003d9e0dd09304': MockResponse(
+                        status_code=500
+                    ),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'quotas': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_load_balancer'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_quotas_exception(aggregator, check, dd_run_check, mock_http_get, connection_load_balancer, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.quota.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/quotas?project_id=1e6e233e637d4d55a50a62b63398ad15'
+            )
+            == 1
+        )
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/lbaas/quotas?project_id=6e39099cccde4f809b003d9e0dd09304'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert connection_load_balancer.quotas.call_count == 2
+        assert (
+            connection_load_balancer.quotas.call_args_list.count(
+                mock.call(project_id='1e6e233e637d4d55a50a62b63398ad15')
+            )
+            == 1
+        )
+        assert (
+            connection_load_balancer.quotas.call_args_list.count(
+                mock.call(project_id='6e39099cccde4f809b003d9e0dd09304')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_quotas_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.quota.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.count',
+        value=1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.loadbalancer',
+        value=10,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.loadbalancer',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.load_balancer',
+        value=10,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.load_balancer',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.listener',
+        value=20,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.listener',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.member',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.member',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.pool',
+        value=20,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.pool',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.healthmonitor',
+        value=10,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.healthmonitor',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.health_monitor',
+        value=10,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.health_monitor',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.l7policy',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.l7policy',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.l7rule',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.quota.l7rule',
+        value=-1,
+        tags=[
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'project_id:6e39099cccde4f809b003d9e0dd09304',
+            'project_name:admin',
+        ],
+    )
+
+
+@pytest.mark.parametrize(
+    ('mock_http_get', 'connection_load_balancer', 'instance', 'api_type'),
+    [
+        pytest.param(
+            {
+                'http_error': {
+                    '/load-balancer/v2/octavia/amphorae?project_id=1e6e233e637d4d55a50a62b63398ad15': MockResponse(
+                        status_code=500
+                    ),
+                    '/load-balancer/v2/octavia/amphorae?project_id=6e39099cccde4f809b003d9e0dd09304': MockResponse(
+                        status_code=500
+                    ),
+                }
+            },
+            None,
+            configs.REST,
+            ApiType.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            None,
+            {
+                'http_error': {
+                    'amphorae': {
+                        '1e6e233e637d4d55a50a62b63398ad15': MockResponse(status_code=500),
+                        '6e39099cccde4f809b003d9e0dd09304': MockResponse(status_code=500),
+                    }
+                }
+            },
+            configs.SDK,
+            ApiType.SDK,
+            id='api sdk',
+        ),
+    ],
+    indirect=['mock_http_get', 'connection_load_balancer'],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_amphorae_exception(aggregator, check, dd_run_check, mock_http_get, connection_load_balancer, api_type):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.count',
+        count=0,
+    )
+    if api_type == ApiType.REST:
+        args_list = []
+        for call in mock_http_get.call_args_list:
+            args, _ = call
+            args_list += list(args)
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/octavia/amphorae?project_id=1e6e233e637d4d55a50a62b63398ad15'
+            )
+            == 1
+        )
+        assert (
+            args_list.count(
+                'http://127.0.0.1:9876/load-balancer/v2/octavia/amphorae?project_id=6e39099cccde4f809b003d9e0dd09304'
+            )
+            == 1
+        )
+    if api_type == ApiType.SDK:
+        assert connection_load_balancer.quotas.call_count == 2
+        assert (
+            connection_load_balancer.amphorae.call_args_list.count(
+                mock.call(project_id='1e6e233e637d4d55a50a62b63398ad15')
+            )
+            == 1
+        )
+        assert (
+            connection_load_balancer.amphorae.call_args_list.count(
+                mock.call(project_id='6e39099cccde4f809b003d9e0dd09304')
+            )
+            == 1
+        )
+
+
+@pytest.mark.parametrize(
+    ('instance'),
+    [
+        pytest.param(
+            configs.REST,
+            id='api rest',
+        ),
+        pytest.param(
+            configs.SDK,
+            id='api sdk',
+        ),
+    ],
+)
+@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection')
+def test_amphorae_metrics(aggregator, check, dd_run_check):
+    dd_run_check(check)
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.count',
+        value=1,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.active_connections',
+        value=0,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.bytes_in',
+        value=0,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.bytes_out',
+        value=0,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.request_errors',
+        value=0,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.total_connections',
+        value=0,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:de81cbdc-8207-4253-8f21-3eea9870e7a9',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.active_connections',
+        value=0,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.bytes_in',
+        value=0,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.bytes_out',
+        value=0,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.request_errors',
+        value=0,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.total_connections',
+        value=0,
+        tags=[
+            'amphora_id:a34dc4b7-b608-4a9d-9fbd-2a4e611475c2',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:9da03992-77a4-4b65-b39a-0e106961f577',
+            'loadbalancer_id:4bb7bfb1-83c2-45e8-b0e1-ed3022329115',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.count',
+        value=1,
+        tags=[
+            'amphora_id:042bcca4-4d97-47a9-bc04-d88c1e3a4d72',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.active_connections',
+        value=0,
+        tags=[
+            'amphora_id:042bcca4-4d97-47a9-bc04-d88c1e3a4d72',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.bytes_in',
+        value=0,
+        tags=[
+            'amphora_id:042bcca4-4d97-47a9-bc04-d88c1e3a4d72',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.bytes_out',
+        value=0,
+        tags=[
+            'amphora_id:042bcca4-4d97-47a9-bc04-d88c1e3a4d72',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.request_errors',
+        value=0,
+        tags=[
+            'amphora_id:042bcca4-4d97-47a9-bc04-d88c1e3a4d72',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
+    aggregator.assert_metric(
+        'openstack.octavia.amphora.stats.total_connections',
+        value=0,
+        tags=[
+            'amphora_id:042bcca4-4d97-47a9-bc04-d88c1e3a4d72',
+            'domain_id:default',
+            'keystone_server:http://127.0.0.1:8080/identity',
+            'listener_id:243decd9-3370-4fc1-b163-80c4155bda04',
+            'loadbalancer_id:ae54877c-b186-4b90-b71c-d331b9e732bc',
+            'project_id:1e6e233e637d4d55a50a62b63398ad15',
+            'project_name:demo',
+            'status:ALLOCATED',
+        ],
+    )
diff --git a/postgres/changelog.d/16146.fixed b/postgres/changelog.d/16146.fixed
new file mode 100644
index 0000000000000..5db4004942213
--- /dev/null
+++ b/postgres/changelog.d/16146.fixed
@@ -0,0 +1 @@
+Database instance metadata payloads should not contain duplicate `db` tags
diff --git a/postgres/datadog_checks/postgres/postgres.py b/postgres/datadog_checks/postgres/postgres.py
index 8941cf53468b5..f5de64d3c4376 100644
--- a/postgres/datadog_checks/postgres/postgres.py
+++ b/postgres/datadog_checks/postgres/postgres.py
@@ -902,7 +902,7 @@ def _send_database_instance_metadata(self):
                 "collection_interval": self._config.database_instance_collection_interval,
                 'dbms_version': payload_pg_version(self.version),
                 'integration_version': __version__,
-                "tags": self._non_internal_tags,
+                "tags": [t for t in self._non_internal_tags if not t.startswith('db:')],
                 "timestamp": time() * 1000,
                 "cloud_metadata": self._config.cloud_metadata,
                 "metadata": {
diff --git a/requirements-agent-release.txt b/requirements-agent-release.txt
index c75e220329fed..0e994c8fb1e61 100644
--- a/requirements-agent-release.txt
+++ b/requirements-agent-release.txt
@@ -110,7 +110,7 @@ datadog-nginx-ingress-controller==2.4.1
 datadog-nginx==6.0.0
 datadog-openldap==1.11.1
 datadog-openmetrics==4.0.0
-datadog-openstack-controller==5.0.0
+datadog-openstack-controller==6.0.0
 datadog-openstack==1.13.2
 datadog-oracle==5.0.0
 datadog-pan-firewall==1.1.1
@@ -165,7 +165,7 @@ datadog-varnish==2.0.0
 datadog-vault==4.0.1
 datadog-vertica==4.2.0
 datadog-voltdb==3.0.0
-datadog-vsphere==7.1.0
+datadog-vsphere==7.2.0
 datadog-weaviate==2.1.0
 datadog-weblogic==1.2.1
 datadog-win32-event-log==3.1.1; sys_platform == 'win32'
diff --git a/sqlserver/changelog.d/16080.fixed b/sqlserver/changelog.d/16080.fixed
new file mode 100644
index 0000000000000..de77fe27da120
--- /dev/null
+++ b/sqlserver/changelog.d/16080.fixed
@@ -0,0 +1 @@
+Fix `aarch64` compatibility of the `sqlserver` check by downgrading `lxml` to version 4.9.2 ([16080](https://github.com/DataDog/integrations-core/pull/16080))
\ No newline at end of file
diff --git a/sqlserver/hatch.toml b/sqlserver/hatch.toml
index 6b6ab485852da..6bdbe024cf197 100644
--- a/sqlserver/hatch.toml
+++ b/sqlserver/hatch.toml
@@ -56,7 +56,7 @@ matrix.version.env-vars = [
   { key = "SQLSERVER_ENGINE_EDITION" },
   { key = "SQLSERVER_IMAGE_TAG", value = "2017-CU24-ubuntu-16.04", if = ["2017"], platform = ["linux"] },
   { key = "SQLSERVER_IMAGE_TAG", value = "2019-CU11-ubuntu-16.04", if = ["2019"], platform = ["linux"] },
-  { key = "SQLSERVER_IMAGE_TAG", value = "2022-preview-ubuntu-22.04", if = ["2022"], platform = ["linux"] },
+  { key = "SQLSERVER_IMAGE_TAG", value = "2022-CU9-ubuntu-20.04", if = ["2022"], platform = ["linux"] },
   { key = "SQLSERVER_BASE_IMAGE", value = "datadog/docker-library:sqlserver_{matrix:version}", platform = ["windows"] },
 ]
 matrix.driver.env-vars = [
diff --git a/vsphere/CHANGELOG.md b/vsphere/CHANGELOG.md
index 3c1a4b64344e1..6680315ea55f3 100644
--- a/vsphere/CHANGELOG.md
+++ b/vsphere/CHANGELOG.md
@@ -2,9 +2,11 @@
 
 <!-- towncrier release notes start -->
 
+## 7.2.0 / 2023-11-07
+
 ***Added***:
 
-* Add support for configuring what resources to collect events from ([#15992](https://github.com/DataDog/integrations-core/pull/15992))
+* Add support for configuring what resources to collect events for. ([#15992](https://github.com/DataDog/integrations-core/pull/15992))
 
 ## 7.1.0 / 2023-09-29 / Agent 7.49.0
 
diff --git a/vsphere/datadog_checks/vsphere/__about__.py b/vsphere/datadog_checks/vsphere/__about__.py
index 2ab230cc7432c..9fa41233efdd1 100644
--- a/vsphere/datadog_checks/vsphere/__about__.py
+++ b/vsphere/datadog_checks/vsphere/__about__.py
@@ -2,4 +2,4 @@
 # All rights reserved
 # Licensed under a 3-clause BSD style license (see LICENSE)
 
-__version__ = "7.1.0"
+__version__ = "7.2.0"