263 lines
11 KiB
Python
263 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
# 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.
|
|
|
|
import random
|
|
import string
|
|
|
|
from novaclient.tests.functional import base
|
|
from novaclient.tests.functional.v2.legacy import test_servers
|
|
from novaclient.v2 import shell
|
|
|
|
|
|
class TestServersBootNovaClient(test_servers.TestServersBootNovaClient):
|
|
"""Servers boot functional tests."""
|
|
|
|
COMPUTE_API_VERSION = "2.latest"
|
|
|
|
|
|
class TestServersListNovaClient(test_servers.TestServersListNovaClient):
|
|
"""Servers list functional tests."""
|
|
|
|
COMPUTE_API_VERSION = "2.latest"
|
|
|
|
|
|
class TestServerLockV29(base.ClientTestBase):
|
|
|
|
COMPUTE_API_VERSION = "2.9"
|
|
|
|
def _show_server_and_check_lock_attr(self, server, value):
|
|
output = self.nova("show %s" % server.id)
|
|
self.assertEqual(str(value),
|
|
self._get_value_from_the_table(output, "locked"))
|
|
|
|
def test_attribute_presented(self):
|
|
# prepare
|
|
server = self._create_server()
|
|
|
|
# testing
|
|
self._show_server_and_check_lock_attr(server, False)
|
|
|
|
self.nova("lock %s" % server.id)
|
|
self._show_server_and_check_lock_attr(server, True)
|
|
|
|
self.nova("unlock %s" % server.id)
|
|
self._show_server_and_check_lock_attr(server, False)
|
|
|
|
|
|
class TestServersDescription(base.ClientTestBase):
|
|
|
|
COMPUTE_API_VERSION = "2.19"
|
|
|
|
def _boot_server_with_description(self):
|
|
descr = "Some words about this test VM."
|
|
server = self._create_server(description=descr)
|
|
|
|
self.assertEqual(descr, server.description)
|
|
|
|
return server, descr
|
|
|
|
def test_create(self):
|
|
# Add a description to the tests that create a server
|
|
server, descr = self._boot_server_with_description()
|
|
output = self.nova("show %s" % server.id)
|
|
self.assertEqual(descr, self._get_value_from_the_table(output,
|
|
"description"))
|
|
|
|
def test_list_servers_with_description(self):
|
|
# Check that the description is returned as part of server details
|
|
# for a server list
|
|
server, descr = self._boot_server_with_description()
|
|
output = self.nova("list --fields description")
|
|
self.assertEqual(server.id,
|
|
self._get_column_value_from_single_row_table(
|
|
output, "ID"))
|
|
self.assertEqual(descr,
|
|
self._get_column_value_from_single_row_table(
|
|
output, "Description"))
|
|
|
|
def test_rebuild(self):
|
|
# Add a description to the tests that rebuild a server
|
|
server, descr = self._boot_server_with_description()
|
|
descr = "New description for rebuilt VM."
|
|
self.nova("rebuild --description '%s' %s %s" %
|
|
(descr, server.id, self.image.name))
|
|
shell._poll_for_status(
|
|
self.client.servers.get, server.id,
|
|
'rebuild', ['active'])
|
|
output = self.nova("show %s" % server.id)
|
|
self.assertEqual(descr, self._get_value_from_the_table(output,
|
|
"description"))
|
|
|
|
def test_remove_description(self):
|
|
# Remove description from server booted with it
|
|
server, descr = self._boot_server_with_description()
|
|
self.nova("update %s --description ''" % server.id)
|
|
output = self.nova("show %s" % server.id)
|
|
self.assertEqual("-", self._get_value_from_the_table(output,
|
|
"description"))
|
|
|
|
def test_add_remove_description_on_existing_server(self):
|
|
# Set and remove the description on an existing server
|
|
server = self._create_server()
|
|
descr = "Add a description for previously-booted VM."
|
|
self.nova("update %s --description '%s'" % (server.id, descr))
|
|
output = self.nova("show %s" % server.id)
|
|
self.assertEqual(descr, self._get_value_from_the_table(output,
|
|
"description"))
|
|
self.nova("update %s --description ''" % server.id)
|
|
output = self.nova("show %s" % server.id)
|
|
self.assertEqual("-", self._get_value_from_the_table(output,
|
|
"description"))
|
|
|
|
def test_update_with_description_longer_than_255_symbols(self):
|
|
# Negative case for description longer than 255 characters
|
|
server = self._create_server()
|
|
descr = ''.join(random.choice(string.ascii_letters)
|
|
for i in range(256))
|
|
output = self.nova("update %s --description '%s'" % (server.id, descr),
|
|
fail_ok=True, merge_stderr=True)
|
|
self.assertIn("ERROR (BadRequest): Invalid input for field/attribute"
|
|
" description. Value: %s. u\'%s\' is too long (HTTP 400)"
|
|
% (descr, descr), output)
|
|
|
|
|
|
class TestServersTagsV226(base.ClientTestBase):
|
|
|
|
COMPUTE_API_VERSION = "2.26"
|
|
|
|
def _boot_server_with_tags(self, tags=["t1", "t2"]):
|
|
uuid = self._create_server().id
|
|
self.client.servers.set_tags(uuid, tags)
|
|
return uuid
|
|
|
|
def test_show(self):
|
|
uuid = self._boot_server_with_tags()
|
|
output = self.nova("show %s" % uuid)
|
|
self.assertEqual('["t1", "t2"]', self._get_value_from_the_table(
|
|
output, "tags"))
|
|
|
|
def test_unicode_tag_correctly_displayed(self):
|
|
"""Regression test for bug #1669683.
|
|
|
|
List and dict fields with unicode cannot be correctly
|
|
displayed.
|
|
|
|
Ensure that once we fix this it doesn't regress.
|
|
"""
|
|
# create an instance with chinese tag
|
|
uuid = self._boot_server_with_tags(tags=["中文标签"])
|
|
output = self.nova("show %s" % uuid)
|
|
self.assertEqual('["中文标签"]', self._get_value_from_the_table(
|
|
output, "tags"))
|
|
|
|
def test_list(self):
|
|
uuid = self._boot_server_with_tags()
|
|
output = self.nova("server-tag-list %s" % uuid)
|
|
tags = self._get_list_of_values_from_single_column_table(
|
|
output, "Tag")
|
|
self.assertEqual(["t1", "t2"], tags)
|
|
|
|
def test_add(self):
|
|
uuid = self._boot_server_with_tags()
|
|
self.nova("server-tag-add %s t3" % uuid)
|
|
self.assertEqual(["t1", "t2", "t3"],
|
|
self.client.servers.tag_list(uuid))
|
|
|
|
def test_add_many(self):
|
|
uuid = self._boot_server_with_tags()
|
|
self.nova("server-tag-add %s t3 t4" % uuid)
|
|
self.assertEqual(["t1", "t2", "t3", "t4"],
|
|
self.client.servers.tag_list(uuid))
|
|
|
|
def test_set(self):
|
|
uuid = self._boot_server_with_tags()
|
|
self.nova("server-tag-set %s t3 t4" % uuid)
|
|
self.assertEqual(["t3", "t4"], self.client.servers.tag_list(uuid))
|
|
|
|
def test_delete(self):
|
|
uuid = self._boot_server_with_tags()
|
|
self.nova("server-tag-delete %s t2" % uuid)
|
|
self.assertEqual(["t1"], self.client.servers.tag_list(uuid))
|
|
|
|
def test_delete_many(self):
|
|
uuid = self._boot_server_with_tags()
|
|
self.nova("server-tag-delete %s t1 t2" % uuid)
|
|
self.assertEqual([], self.client.servers.tag_list(uuid))
|
|
|
|
def test_delete_all(self):
|
|
uuid = self._boot_server_with_tags()
|
|
self.nova("server-tag-delete-all %s" % uuid)
|
|
self.assertEqual([], self.client.servers.tag_list(uuid))
|
|
|
|
|
|
class TestServersAutoAllocateNetworkCLI(base.ClientTestBase):
|
|
|
|
COMPUTE_API_VERSION = '2.37'
|
|
|
|
def _find_network_in_table(self, table):
|
|
# Example:
|
|
# +-----------------+-----------------------------------+
|
|
# | Property | Value |
|
|
# +-----------------+-----------------------------------+
|
|
# | private network | 192.168.154.128 |
|
|
# +-----------------+-----------------------------------+
|
|
for line in table.split('\n'):
|
|
if '|' in line:
|
|
l_property, l_value = line.split('|')[1:3]
|
|
if ' network' in l_property.strip():
|
|
return ' '.join(l_property.strip().split()[:-1])
|
|
|
|
def test_boot_server_with_auto_network(self):
|
|
"""Tests that the CLI defaults to 'auto' when --nic isn't specified.
|
|
"""
|
|
# check to see if multiple networks are available because if so we
|
|
# have to skip this test as auto will fail with a 409 conflict as it's
|
|
# an ambiguous request and nova won't know which network to pick
|
|
if self.multiple_networks:
|
|
# we could potentially get around this by extending TenantTestBase
|
|
self.skipTest('multiple networks available')
|
|
server_info = self.nova('boot', params=(
|
|
'%(name)s --flavor %(flavor)s --poll '
|
|
'--image %(image)s ' % {'name': self.name_generate('server'),
|
|
'flavor': self.flavor.id,
|
|
'image': self.image.id}))
|
|
server_id = self._get_value_from_the_table(server_info, 'id')
|
|
self.addCleanup(self.wait_for_resource_delete,
|
|
server_id, self.client.servers)
|
|
self.addCleanup(self.client.servers.delete, server_id)
|
|
# get the server details to verify there is a network, we don't care
|
|
# what the network name is, we just want to see an entry show up
|
|
server_info = self.nova('show', params=server_id)
|
|
network = self._find_network_in_table(server_info)
|
|
self.assertIsNotNone(
|
|
network, 'Auto-allocated network not found: %s' % server_info)
|
|
|
|
def test_boot_server_with_no_network(self):
|
|
"""Tests that '--nic none' is honored.
|
|
"""
|
|
server_info = self.nova('boot', params=(
|
|
'%(name)s --flavor %(flavor)s --poll '
|
|
'--image %(image)s --nic none' %
|
|
{'name': self.name_generate('server'),
|
|
'flavor': self.flavor.id,
|
|
'image': self.image.id}))
|
|
server_id = self._get_value_from_the_table(server_info, 'id')
|
|
self.addCleanup(self.wait_for_resource_delete,
|
|
server_id, self.client.servers)
|
|
self.addCleanup(self.client.servers.delete, server_id)
|
|
# get the server details to verify there is not a network
|
|
server_info = self.nova('show', params=server_id)
|
|
network = self._find_network_in_table(server_info)
|
|
self.assertIsNone(
|
|
network, 'Unexpected network allocation: %s' % server_info)
|