Use Block Storage API v3 instead of API v2

Block Storage API v2 was deprecated during Pike cycle and is being
removed during Xena cycle, and current v3 API should be used instead.
Unused volume_client and network_client in integration test code are
also removed by this change.

Note:
granade tests is made non-voting temporally until the same issue is
fixed in stable/victoria.

Also, changes to use fedora 33 for tests.

Depends-on: https://review.opendev.org/802150/
Change-Id: I6a2b5afa13480791971bbd8bba1f43b9f2db8294
(cherry picked from commit 1828df32fa)

Move testing to Fedora 33

Now that the gate is unblocked, we can also test F33 for gating purposes
here.

Change-Id: Ie1c9075623d85b27aaf1ac67a3063e219726bc6f
(cherry picked from commit 6a9c35d898)
This commit is contained in:
Takashi Kajinami 2021-07-25 02:13:11 +09:00 committed by rabi
parent 437c43d452
commit db86090ce7
11 changed files with 15 additions and 52 deletions

View File

@ -65,6 +65,7 @@
- job: - job:
name: grenade-heat name: grenade-heat
parent: grenade parent: grenade
voting: false
required-projects: required-projects:
- opendev.org/openstack/heat - opendev.org/openstack/heat
- opendev.org/openstack/heat-tempest-plugin - opendev.org/openstack/heat-tempest-plugin

View File

@ -51,8 +51,8 @@ a VM image that heat can launch. To do that add the following to
`[[local|localrc]]` section of `local.conf`:: `[[local|localrc]]` section of `local.conf`::
IMAGE_URL_SITE="https://download.fedoraproject.org" IMAGE_URL_SITE="https://download.fedoraproject.org"
IMAGE_URL_PATH="/pub/fedora/linux/releases/32/Cloud/x86_64/images/" IMAGE_URL_PATH="/pub/fedora/linux/releases/33/Cloud/x86_64/images/"
IMAGE_URL_FILE="Fedora-Cloud-Base-32-1.6.x86_64.qcow2" IMAGE_URL_FILE="Fedora-Cloud-Base-33-1.2.x86_64.qcow2"
IMAGE_URLS+=","$IMAGE_URL_SITE$IMAGE_URL_PATH$IMAGE_URL_FILE IMAGE_URLS+=","$IMAGE_URL_SITE$IMAGE_URL_PATH$IMAGE_URL_FILE
URLs for any cloud image may be specified, but fedora images from F20 contain URLs for any cloud image may be specified, but fedora images from F20 contain

View File

@ -163,14 +163,6 @@ class CinderClientAPIVersionTest(common.HeatTestCase):
client = ctx.clients.client('cinder') client = ctx.clients.client('cinder')
self.assertEqual('3.0', client.version) self.assertEqual('3.0', client.version)
def test_cinder_api_v2(self):
ctx = utils.dummy_context()
self.patchobject(ctx.keystone_session, 'get_endpoint',
side_effect=[ks_exceptions.EndpointNotFound,
None])
client = ctx.clients.client('cinder')
self.assertEqual('2.0', client.version)
def test_cinder_api_not_supported(self): def test_cinder_api_not_supported(self):
ctx = utils.dummy_context() ctx = utils.dummy_context()
self.patchobject(ctx.keystone_session, 'get_endpoint', self.patchobject(ctx.keystone_session, 'get_endpoint',

View File

@ -1253,7 +1253,7 @@ class CinderVolumeTest(vt_base.VolumeTestCase):
vol.to_dict.return_value = vol_resp vol.to_dict.return_value = vol_resp
rsrc.client().volumes = mock.MagicMock() rsrc.client().volumes = mock.MagicMock()
rsrc.client().volumes.get = mock.MagicMock(return_value=vol) rsrc.client().volumes.get = mock.MagicMock(return_value=vol)
rsrc.client().volume_api_version = 2 rsrc.client().volume_api_version = 3
rsrc.data = mock.MagicMock(return_value={'volume_type': 'lvmdriver-1'}) rsrc.data = mock.MagicMock(return_value={'volume_type': 'lvmdriver-1'})
reality = rsrc.get_live_state(rsrc.properties) reality = rsrc.get_live_state(rsrc.properties)

View File

@ -93,7 +93,7 @@ class CinderVolumeTypeTest(common.HeatTestCase):
self._test_handle_create(is_public=False) self._test_handle_create(is_public=False)
def test_volume_type_with_projects(self): def test_volume_type_with_projects(self):
self.cinderclient.volume_api_version = 2 self.cinderclient.volume_api_version = 3
self._test_handle_create(projects=['id1', 'id2']) self._test_handle_create(projects=['id1', 'id2'])
def _test_update(self, update_args, is_update_metadata=False): def _test_update(self, update_args, is_update_metadata=False):
@ -179,7 +179,7 @@ class CinderVolumeTypeTest(common.HeatTestCase):
props['projects'] = ['id1'] props['projects'] = ['id1']
self.my_volume_type.t = self.my_volume_type.t.freeze(properties=props) self.my_volume_type.t = self.my_volume_type.t.freeze(properties=props)
self.my_volume_type.reparse() self.my_volume_type.reparse()
self.cinderclient.volume_api_version = 2 self.cinderclient.volume_api_version = 3
self.stub_KeystoneProjectConstraint() self.stub_KeystoneProjectConstraint()
ex = self.assertRaises(exception.StackValidationFailed, ex = self.assertRaises(exception.StackValidationFailed,
self.my_volume_type.validate) self.my_volume_type.validate)
@ -194,7 +194,7 @@ class CinderVolumeTypeTest(common.HeatTestCase):
props['projects'] = ['id1'] props['projects'] = ['id1']
self.my_volume_type.t = self.my_volume_type.t.freeze(properties=props) self.my_volume_type.t = self.my_volume_type.t.freeze(properties=props)
self.my_volume_type.reparse() self.my_volume_type.reparse()
self.cinderclient.volume_api_version = 2 self.cinderclient.volume_api_version = 3
self.stub_KeystoneProjectConstraint() self.stub_KeystoneProjectConstraint()
self.assertIsNone(self.my_volume_type.validate()) self.assertIsNone(self.my_volume_type.validate())

View File

@ -10,11 +10,12 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from cinderclient.v2 import client as cinderclient
import mock import mock
import six import six
from cinderclient.v3 import client as cinderclient
from heat.engine.clients.os import cinder from heat.engine.clients.os import cinder
from heat.engine.clients.os import nova from heat.engine.clients.os import nova
from heat.engine.resources.aws.ec2 import volume as aws_vol from heat.engine.resources.aws.ec2 import volume as aws_vol
@ -31,7 +32,7 @@ class VolumeTestCase(common.HeatTestCase):
super(VolumeTestCase, self).setUp() super(VolumeTestCase, self).setUp()
self.fc = fakes_nova.FakeClient() self.fc = fakes_nova.FakeClient()
self.cinder_fc = cinderclient.Client('username', 'password') self.cinder_fc = cinderclient.Client('username', 'password')
self.cinder_fc.volume_api_version = 2 self.cinder_fc.volume_api_version = 3
self.patchobject(cinder.CinderClientPlugin, '_create', self.patchobject(cinder.CinderClientPlugin, '_create',
return_value=self.cinder_fc) return_value=self.cinder_fc)
self.patchobject(nova.NovaClientPlugin, 'client', self.patchobject(nova.NovaClientPlugin, 'client',

View File

@ -30,4 +30,4 @@ openstack flavor delete m1.heat_int
openstack flavor delete m1.heat_micro openstack flavor delete m1.heat_micro
# delete the image created # delete the image created
openstack image delete Fedora-Cloud-Base-32-1.6.x86_64 openstack image delete Fedora-Cloud-Base-33-1.2.x86_64

View File

@ -12,12 +12,10 @@
import os import os
from cinderclient import client as cinder_client
from heat.common.i18n import _ from heat.common.i18n import _
from heatclient import client as heat_client from heatclient import client as heat_client
from keystoneauth1.identity.generic import password from keystoneauth1.identity.generic import password
from keystoneauth1 import session from keystoneauth1 import session
from neutronclient.v2_0 import client as neutron_client
from novaclient import client as nova_client from novaclient import client as nova_client
from swiftclient import client as swift_client from swiftclient import client as swift_client
@ -60,7 +58,6 @@ class ClientManager(object):
calling various OpenStack APIs. calling various OpenStack APIs.
""" """
CINDERCLIENT_VERSION = '2'
HEATCLIENT_VERSION = '1' HEATCLIENT_VERSION = '1'
NOVA_API_VERSION = '2.1' NOVA_API_VERSION = '2.1'
@ -81,8 +78,6 @@ class ClientManager(object):
self.identity_client = self._get_identity_client() self.identity_client = self._get_identity_client()
self.orchestration_client = self._get_orchestration_client() self.orchestration_client = self._get_orchestration_client()
self.compute_client = self._get_compute_client() self.compute_client = self._get_compute_client()
self.network_client = self._get_network_client()
self.volume_client = self._get_volume_client()
self.object_client = self._get_object_client() self.object_client = self._get_object_client()
def _username(self): def _username(self):
@ -154,22 +149,6 @@ class ClientManager(object):
os_cache=False, os_cache=False,
http_log_debug=True) http_log_debug=True)
def _get_network_client(self):
return neutron_client.Client(
session=self.identity_client.session,
service_type='network',
region_name=self.conf.region,
endpoint_type='publicURL')
def _get_volume_client(self):
return cinder_client.Client(
self.CINDERCLIENT_VERSION,
session=self.identity_client.session,
endpoint_type='publicURL',
region_name=self.conf.region,
http_log_debug=True)
def _get_object_client(self): def _get_object_client(self):
args = { args = {
'auth_version': self.auth_version, 'auth_version': self.auth_version,

View File

@ -105,8 +105,6 @@ class HeatIntegrationTest(testscenarios.WithScenarios,
self.identity_client = self.manager.identity_client self.identity_client = self.manager.identity_client
self.orchestration_client = self.manager.orchestration_client self.orchestration_client = self.manager.orchestration_client
self.compute_client = self.manager.compute_client self.compute_client = self.manager.compute_client
self.network_client = self.manager.network_client
self.volume_client = self.manager.volume_client
self.object_client = self.manager.object_client self.object_client = self.manager.object_client
self.client = self.orchestration_client self.client = self.orchestration_client
@ -170,14 +168,6 @@ class HeatIntegrationTest(testscenarios.WithScenarios,
def _stack_rand_name(cls): def _stack_rand_name(cls):
return rand_name(cls.__name__) return rand_name(cls.__name__)
def _get_network(self, net_name=None):
if net_name is None:
net_name = self.conf.fixed_network_name
networks = self.network_client.list_networks()
for net in networks['networks']:
if net['name'] == net_name:
return net
def is_service_available(self, service_type): def is_service_available(self, service_type):
try: try:
self.identity_client.get_endpoint_url( self.identity_client.get_endpoint_url(

View File

@ -44,9 +44,9 @@ echo "[[local|localrc]]" >> $localconf
# to network # to network
if [[ -e /etc/ci/mirror_info.sh ]]; then if [[ -e /etc/ci/mirror_info.sh ]]; then
source /etc/ci/mirror_info.sh source /etc/ci/mirror_info.sh
echo "IMAGE_URLS+=${NODEPOOL_FEDORA_MIRROR}/releases/32/Cloud/x86_64/images/Fedora-Cloud-Base-32-1.6.x86_64.qcow2" >> $localconf echo "IMAGE_URLS+=${NODEPOOL_FEDORA_MIRROR}/releases/33/Cloud/x86_64/images/Fedora-Cloud-Base-33-1.2.x86_64.qcow2" >> $localconf
else else
echo "IMAGE_URLS+=https://download.fedoraproject.org/pub/fedora/linux/releases/32/Cloud/x86_64/images/Fedora-Cloud-Base-32-1.6.x86_64.qcow2" >> $localconf echo "IMAGE_URLS+=https://download.fedoraproject.org/pub/fedora/linux/releases/33/Cloud/x86_64/images/Fedora-Cloud-Base-33-1.2.x86_64.qcow2" >> $localconf
fi fi
echo "CEILOMETER_PIPELINE_INTERVAL=60" >> $localconf echo "CEILOMETER_PIPELINE_INTERVAL=60" >> $localconf

View File

@ -46,7 +46,7 @@ function _config_iniset {
iniset $conf_file heat_plugin instance_type m1.heat_int iniset $conf_file heat_plugin instance_type m1.heat_int
iniset $conf_file heat_plugin minimal_instance_type m1.heat_micro iniset $conf_file heat_plugin minimal_instance_type m1.heat_micro
iniset $conf_file heat_plugin image_ref Fedora-Cloud-Base-32-1.6.x86_64 iniset $conf_file heat_plugin image_ref Fedora-Cloud-Base-33-1.2.x86_64
iniset $conf_file heat_plugin minimal_image_ref $default_image_name iniset $conf_file heat_plugin minimal_image_ref $default_image_name
iniset $conf_file heat_plugin hidden_stack_tag hidden iniset $conf_file heat_plugin hidden_stack_tag hidden