neutron-tempest-plugin/neutron_tempest_plugin/api/test_local_ip.py
Nurmatov Mamatisa 3f2bbb5702 Add Local IP API tests
Tests were verified on OVS environment.
API job definition is not changed, because OVN does not
support Local IP.

Depends-On: https://review.opendev.org/c/openstack/neutron/+/816435
Depends-On: https://review.opendev.org/c/openstack/neutron/+/818228
Change-Id: I4760db4dd9916ec895ef63573c49bde91727d142
2022-01-13 18:10:34 +03:00

143 lines
5.7 KiB
Python

# Copyright 2021 Huawei, Inc. 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.lib import decorators
from tempest.lib import exceptions
from neutron_tempest_plugin.api import base
from neutron_tempest_plugin import config
CONF = config.CONF
class LocalIPTestJSON(base.BaseNetworkTest):
credentials = ['primary', 'admin']
required_extensions = ['local_ip']
@classmethod
def resource_setup(cls):
super(LocalIPTestJSON, cls).resource_setup()
cls.ext_net_id = CONF.network.public_network_id
# Create network and subnet
cls.network = cls.create_network()
cls.subnet = cls.create_subnet(cls.network)
@decorators.idempotent_id('369257b0-521d-43f5-9482-50e18e87a472')
def test_local_ip_lifecycle(self):
port = self.create_port(self.network)
lip_description = 'Test Local IP description'
lip_name = 'test-local-ip'
created_local_ip = self.create_local_ip(
name=lip_name,
description=lip_description,
local_port_id=port['id'],
local_ip_address=port['fixed_ips'][0]['ip_address'])
self.assertEqual(self.network['id'], created_local_ip['network_id'])
self.assertEqual(lip_description, created_local_ip['description'])
self.assertEqual(lip_name, created_local_ip['name'])
self.assertEqual(port['id'], created_local_ip['local_port_id'])
self.assertEqual(port['fixed_ips'][0]['ip_address'],
created_local_ip['local_ip_address'])
# Show created local_ip
body = self.client.get_local_ip(created_local_ip['id'])
local_ip = body['local_ip']
self.assertEqual(lip_description, local_ip['description'])
self.assertEqual(lip_name, local_ip['name'])
# List local_ips
body = self.client.list_local_ips()
local_ip_ids = [lip['id'] for lip in body['local_ips']]
self.assertIn(created_local_ip['id'], local_ip_ids)
# Update local_ip
updated_local_ip = self.client.update_local_ip(
created_local_ip['id'],
name='updated_local_ip')
self.assertEqual('updated_local_ip',
updated_local_ip['local_ip']['name'])
self.delete_local_ip(created_local_ip)
self.assertRaises(exceptions.NotFound,
self.client.get_local_ip, created_local_ip['id'])
@decorators.idempotent_id('e32df8ac-4e29-4adf-8057-46ae8684eff2')
def test_create_local_ip_with_network(self):
local_ip = self.create_local_ip(self.network['id'])
self.assertEqual(self.network['id'], local_ip['network_id'])
class LocalIPAssociationTestJSON(base.BaseNetworkTest):
required_extensions = ['local_ip']
@classmethod
def resource_setup(cls):
super(LocalIPAssociationTestJSON, cls).resource_setup()
cls.ext_net_id = CONF.network.public_network_id
# Create network
cls.network = cls.create_network()
cls.subnet = cls.create_subnet(cls.network)
@decorators.idempotent_id('602d2874-49be-4c72-8799-b20c95853b6b')
def test_local_ip_association_lifecycle(self):
local_ip = self.create_local_ip(self.network['id'])
port = self.create_port(self.network)
local_ip_association = self.create_local_ip_association(
local_ip['id'],
fixed_port_id=port['id'])
self.assertEqual(local_ip['id'], local_ip_association['local_ip_id'])
self.assertEqual(port['id'], local_ip_association['fixed_port_id'])
# Test List Local IP Associations
body = self.client.list_local_ip_associations(local_ip['id'])
associations = body['port_associations']
self.assertEqual(local_ip['id'], associations[0]['local_ip_id'])
self.assertEqual(port['id'], associations[0]['fixed_port_id'])
# Show
body = self.client.get_local_ip_association(
local_ip['id'], port['id'])
association = body['port_association']
self.assertEqual(local_ip['id'], association['local_ip_id'])
self.assertEqual(port['id'], association['fixed_port_id'])
# Delete
self.client.delete_local_ip_association(local_ip['id'], port['id'])
self.assertRaises(exceptions.NotFound,
self.client.get_local_ip_association,
local_ip['id'], port['id'])
@decorators.idempotent_id('5d26edab-78d2-4cbd-9d0b-3c0b19f0f52d')
def test_local_ip_association_with_two_ips_on_port(self):
local_ip = self.create_local_ip(self.network['id'])
s = self.subnet
port = self.create_port(self.network)
# request another IP on the same subnet
port['fixed_ips'].append({'subnet_id': s['id']})
updated = self.client.update_port(port['id'],
fixed_ips=port['fixed_ips'])
port = updated['port']
local_ip_association = self.create_local_ip_association(
local_ip['id'],
fixed_port_id=port['id'],
fixed_ip_address=port['fixed_ips'][0]['ip_address'])
self.assertEqual(port['fixed_ips'][0]['ip_address'],
local_ip_association['fixed_ip'])