Show reserved status for a fixed_ip if available
Commit 8886590f30daf736ae30a95b3e4a77cb586d4f02 adds the v2.4 microversion to nova so that we can get back the reserved value of a fixed IP. This change adds support to novaclient to display the reserved status from the fixed_ip resource if it's available in the response. Related blueprint show-reserved-status-in-os-fixed-ips-api Change-Id: Idf3df1728ba87006d1b0f82a1c01712202670e0a
This commit is contained in:
parent
0820a9e793
commit
5fdb861ad4
@ -243,3 +243,36 @@ class ClientTestBase(testtools.TestCase):
|
||||
if l_property.strip() == key:
|
||||
return l_value.strip()
|
||||
raise ValueError("Property '%s' is missing from the table." % key)
|
||||
|
||||
def _get_column_value_from_single_row_table(self, table, column):
|
||||
"""Get the value for the column in the single-row table
|
||||
|
||||
Example table:
|
||||
|
||||
+----------+-------------+----------+----------+
|
||||
| address | cidr | hostname | host |
|
||||
+----------+-------------+----------+----------+
|
||||
| 10.0.0.3 | 10.0.0.0/24 | test | myhost |
|
||||
+----------+-------------+----------+----------+
|
||||
|
||||
:param table: newline-separated table with |-separated cells
|
||||
:param column: name of the column to look for
|
||||
:raises: ValueError if the column value is not found
|
||||
"""
|
||||
lines = table.split("\n")
|
||||
# Determine the column header index first.
|
||||
column_index = -1
|
||||
for line in lines:
|
||||
if "|" in line:
|
||||
if column_index == -1:
|
||||
headers = line.split("|")[1:-1]
|
||||
for index, header in enumerate(headers):
|
||||
if header.strip() == column:
|
||||
column_index = index
|
||||
break
|
||||
else:
|
||||
# We expect a single-row table so we should be able to get
|
||||
# the value now using the column index.
|
||||
return line.split("|")[1:-1][column_index].strip()
|
||||
|
||||
raise ValueError("Unable to find value for column '%s'.")
|
||||
|
67
novaclient/tests/functional/test_fixedips.py
Normal file
67
novaclient/tests/functional/test_fixedips.py
Normal file
@ -0,0 +1,67 @@
|
||||
# Copyright 2015 IBM Corp.
|
||||
# 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 oslo_utils import strutils
|
||||
|
||||
from novaclient.tests.functional import base
|
||||
from novaclient.v2 import shell
|
||||
|
||||
|
||||
class TestFixedIPsNovaClient(base.ClientTestBase):
|
||||
"""FixedIPs functional tests."""
|
||||
|
||||
API_VERSION = '2.1'
|
||||
|
||||
def nova(self, *args, **kwargs):
|
||||
flags = '--os-compute-api-version %s ' % self.API_VERSION
|
||||
return self.cli_clients.nova(flags=flags, *args, **kwargs)
|
||||
|
||||
def _create_server(self):
|
||||
name = self.name_generate(prefix='server')
|
||||
server = self.client.servers.create(name, self.image, self.flavor)
|
||||
shell._poll_for_status(
|
||||
self.client.servers.get, server.id,
|
||||
'building', ['active'])
|
||||
self.addCleanup(server.delete)
|
||||
return server
|
||||
|
||||
def _test_fixedip_get(self, expect_reserved=False):
|
||||
server = self._create_server()
|
||||
networks = server.networks
|
||||
self.assertIn('private', networks)
|
||||
fixed_ip = networks['private'][0]
|
||||
table = self.nova('fixed-ip-get %s' % fixed_ip)
|
||||
addr = self._get_column_value_from_single_row_table(table, 'address')
|
||||
self.assertEqual(fixed_ip, addr)
|
||||
if expect_reserved:
|
||||
reserved = self._get_column_value_from_single_row_table(table,
|
||||
'reserved')
|
||||
# By default the fixed IP should not be reserved.
|
||||
self.assertEqual(False, strutils.bool_from_string(reserved,
|
||||
strict=True))
|
||||
else:
|
||||
self.assertRaises(ValueError,
|
||||
self._get_column_value_from_single_row_table,
|
||||
table, 'reserved')
|
||||
|
||||
def test_fixedip_get(self):
|
||||
self._test_fixedip_get()
|
||||
|
||||
|
||||
class TestFixedIPsNovaClientV24(TestFixedIPsNovaClient):
|
||||
"""FixedIPs functional tests for v2.4 nova-api microversion."""
|
||||
|
||||
API_VERSION = '2.4'
|
||||
|
||||
def test_fixedip_get(self):
|
||||
self._test_fixedip_get(expect_reserved=True)
|
@ -3621,11 +3621,23 @@ def do_service_delete(cs, args):
|
||||
cs.services.delete(args.id)
|
||||
|
||||
|
||||
@api_versions.wraps("2.0", "2.3")
|
||||
def _print_fixed_ip(cs, fixed_ip):
|
||||
fields = ['address', 'cidr', 'hostname', 'host']
|
||||
utils.print_list([fixed_ip], fields)
|
||||
|
||||
|
||||
@api_versions.wraps("2.4")
|
||||
def _print_fixed_ip(cs, fixed_ip):
|
||||
fields = ['address', 'cidr', 'hostname', 'host', 'reserved']
|
||||
utils.print_list([fixed_ip], fields)
|
||||
|
||||
|
||||
@cliutils.arg('fixed_ip', metavar='<fixed_ip>', help=_('Fixed IP Address.'))
|
||||
def do_fixed_ip_get(cs, args):
|
||||
"""Retrieve info on a fixed IP."""
|
||||
result = cs.fixed_ips.get(args.fixed_ip)
|
||||
utils.print_list([result], ['address', 'cidr', 'hostname', 'host'])
|
||||
_print_fixed_ip(cs, result)
|
||||
|
||||
|
||||
@cliutils.arg('fixed_ip', metavar='<fixed_ip>', help=_('Fixed IP Address.'))
|
||||
|
Loading…
x
Reference in New Issue
Block a user