![zhufl](/assets/img/avatar_default.png)
1. For microversion 2.33 hypervisor_links is added to the response body for the following APIs: - GET /os-hypervisors - GET /os-hypervisors/detail 2. For microversion 2.53 servers is added to the response body for the following APIs: - GET /os-hypervisor - GET /os-hypervisors - GET /os-hypervisors/detail This is to fix the hypervisor schema for microversion 2.33 and 2.53. Partially Implements: blueprint fix-microversion-gap Co-authored-by: Ghanshyam Mann <gmann@ghanshyammann.com> Change-Id: Ifeb26a50b604d257e9ab00cceed7cd2f34621419
171 lines
6.8 KiB
Python
171 lines
6.8 KiB
Python
# Copyright 2013 IBM Corporation
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from tempest.api.compute import base
|
|
from tempest.lib import decorators
|
|
|
|
|
|
class HypervisorAdminTestBase(base.BaseV2ComputeAdminTest):
|
|
"""Tests Hypervisors API that require admin privileges"""
|
|
|
|
@classmethod
|
|
def setup_clients(cls):
|
|
super(HypervisorAdminTestBase, cls).setup_clients()
|
|
cls.client = cls.os_admin.hypervisor_client
|
|
|
|
def _list_hypervisors(self):
|
|
# List of hypervisors
|
|
hypers = self.client.list_hypervisors()['hypervisors']
|
|
return hypers
|
|
|
|
|
|
class HypervisorAdminTestJSON(HypervisorAdminTestBase):
|
|
"""Tests Hypervisors API that require admin privileges"""
|
|
|
|
@decorators.idempotent_id('7f0ceacd-c64d-4e96-b8ee-d02943142cc5')
|
|
def test_get_hypervisor_list(self):
|
|
"""List of hypervisor and available hypervisors hostname"""
|
|
hypers = self._list_hypervisors()
|
|
self.assertNotEmpty(hypers, "No hypervisors found.")
|
|
|
|
@decorators.idempotent_id('1e7fdac2-b672-4ad1-97a4-bad0e3030118')
|
|
def test_get_hypervisor_list_details(self):
|
|
"""Display the details of the all hypervisor"""
|
|
hypers = self.client.list_hypervisors(detail=True)['hypervisors']
|
|
self.assertNotEmpty(hypers, "No hypervisors found.")
|
|
|
|
@decorators.idempotent_id('94ff9eae-a183-428e-9cdb-79fde71211cc')
|
|
def test_get_hypervisor_show_details(self):
|
|
"""Display the details of the specified hypervisor"""
|
|
hypers = self._list_hypervisors()
|
|
self.assertNotEmpty(hypers, "No hypervisors found.")
|
|
|
|
details = self.client.show_hypervisor(hypers[0]['id'])['hypervisor']
|
|
self.assertNotEmpty(details)
|
|
self.assertEqual(details['hypervisor_hostname'],
|
|
hypers[0]['hypervisor_hostname'])
|
|
|
|
@decorators.idempotent_id('797e4f28-b6e0-454d-a548-80cc77c00816')
|
|
def test_get_hypervisor_stats(self):
|
|
"""Verify the stats of the all hypervisor"""
|
|
stats = (self.client.show_hypervisor_statistics()
|
|
['hypervisor_statistics'])
|
|
self.assertNotEmpty(stats)
|
|
|
|
@decorators.idempotent_id('91a50d7d-1c2b-4f24-b55a-a1fe20efca70')
|
|
def test_get_hypervisor_uptime(self):
|
|
"""Verify that GET shows the specified hypervisor uptime"""
|
|
hypers = self._list_hypervisors()
|
|
|
|
# Ironic will register each baremetal node as a 'hypervisor',
|
|
# so the hypervisor list can contain many hypervisors of type
|
|
# 'ironic'. If they are ALL ironic, skip this test since ironic
|
|
# doesn't support hypervisor uptime. Otherwise, remove them
|
|
# from the list of hypervisors to test.
|
|
ironic_only = True
|
|
hypers_without_ironic = []
|
|
for hyper in hypers:
|
|
details = (self.client.show_hypervisor(hyper['id'])
|
|
['hypervisor'])
|
|
if (details['hypervisor_type'] != 'ironic' and
|
|
details['state'] == 'up'):
|
|
hypers_without_ironic.append(hyper)
|
|
ironic_only = False
|
|
|
|
if ironic_only:
|
|
raise self.skipException(
|
|
"Ironic does not support hypervisor uptime")
|
|
|
|
has_valid_uptime = False
|
|
for hyper in hypers_without_ironic:
|
|
# because hypervisors might be disabled, this loops looking
|
|
# for any good hit.
|
|
try:
|
|
uptime = (self.client.show_hypervisor_uptime(hyper['id'])
|
|
['hypervisor'])
|
|
if uptime:
|
|
has_valid_uptime = True
|
|
break
|
|
except Exception:
|
|
pass
|
|
self.assertTrue(
|
|
has_valid_uptime,
|
|
"None of the hypervisors had a valid uptime: %s" % hypers)
|
|
|
|
|
|
class HypervisorAdminV228Test(HypervisorAdminTestBase):
|
|
"""Tests Hypervisors API higher than 2.27 that require admin privileges"""
|
|
|
|
min_microversion = '2.28'
|
|
|
|
@decorators.idempotent_id('d46bab64-0fbe-4eb8-9133-e6ee56188cc5')
|
|
def test_get_list_hypervisor_details(self):
|
|
"""Test listing and showing hypervisor details"""
|
|
# NOTE(zhufl): This test tests the hypervisor APIs response schema
|
|
# for 2.28 microversion. No specific assert or behaviour verification
|
|
# is needed.
|
|
hypers = self._list_hypervisors()
|
|
self.assertNotEmpty(hypers, "No hypervisors found.")
|
|
self.client.show_hypervisor(hypers[0]['id'])
|
|
|
|
|
|
class HypervisorAdminUnderV252Test(HypervisorAdminTestBase):
|
|
"""Tests Hypervisors API below 2.53 that require admin privileges"""
|
|
|
|
max_microversion = '2.52'
|
|
|
|
@decorators.idempotent_id('e81bba3f-6215-4e39-a286-d52d2f906862')
|
|
def test_get_hypervisor_show_servers(self):
|
|
"""Test showing instances about the specific hypervisors"""
|
|
hypers = self._list_hypervisors()
|
|
self.assertNotEmpty(hypers, "No hypervisors found.")
|
|
|
|
hostname = hypers[0]['hypervisor_hostname']
|
|
hypervisors = (self.client.list_servers_on_hypervisor(hostname)
|
|
['hypervisors'])
|
|
self.assertNotEmpty(hypervisors)
|
|
|
|
@decorators.idempotent_id('d7e1805b-3b14-4a3b-b6fd-50ec6d9f361f')
|
|
def test_search_hypervisor(self):
|
|
"""Test searching for hypervisors by its name"""
|
|
hypers = self._list_hypervisors()
|
|
self.assertNotEmpty(hypers, "No hypervisors found.")
|
|
hypers = self.client.search_hypervisor(
|
|
hypers[0]['hypervisor_hostname'])['hypervisors']
|
|
self.assertNotEmpty(hypers, "No hypervisors found.")
|
|
|
|
|
|
class HypervisorAdminV253TestBase(base.BaseV2ComputeAdminTest):
|
|
"""Tests Hypervisors API above 2.53 that require admin privileges"""
|
|
|
|
min_microversion = '2.53'
|
|
|
|
@classmethod
|
|
def setup_clients(cls):
|
|
super(HypervisorAdminV253TestBase, cls).setup_clients()
|
|
cls.client = cls.os_admin.hypervisor_client
|
|
|
|
@decorators.idempotent_id('4ab54a14-77a2-4e39-b9d2-1306d157c705')
|
|
def test_list_show_detail_hypervisors(self):
|
|
"""Verify the list, list details, and show hypevisors
|
|
|
|
This verify the Hypervisor API response schema with v2.53 microversion
|
|
"""
|
|
self.client.list_hypervisors(
|
|
detail=True, with_servers=True)['hypervisors']
|
|
hypers = self.client.list_hypervisors(with_servers=True)['hypervisors']
|
|
self.client.show_hypervisor(
|
|
hypers[0]['id'], with_servers=True)['hypervisor']
|