Support --os-baremetal-api-version latest
For OSC commands, the --os-baremetal-api-version optional argument does not have the value 'latest'. Unlike the ironic CLI osc_lib does not support passing 'latest', so this is replaced by latest known API version which is used in requests to the Bare Metal service. Change-Id: Id98d1ab4b6dd1fdfb41d3a4fdd384baf75e69d6f Closes-Bug: #1657502
This commit is contained in:
parent
6702a7de1f
commit
be5c99cd11
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
"""OpenStackClient plugin for Bare Metal service."""
|
"""OpenStackClient plugin for Bare Metal service."""
|
||||||
|
|
||||||
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from ironicclient.common import http
|
from ironicclient.common import http
|
||||||
@ -53,7 +54,6 @@ def make_client(instance):
|
|||||||
region_name=instance._region_name
|
region_name=instance._region_name
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
return client
|
return client
|
||||||
|
|
||||||
|
|
||||||
@ -65,7 +65,24 @@ def build_option_parser(parser):
|
|||||||
default=utils.env(
|
default=utils.env(
|
||||||
'OS_BAREMETAL_API_VERSION',
|
'OS_BAREMETAL_API_VERSION',
|
||||||
default=http.DEFAULT_VER),
|
default=http.DEFAULT_VER),
|
||||||
|
choices=sorted(
|
||||||
|
API_VERSIONS,
|
||||||
|
key=lambda k: [int(x) for x in k.split('.')]) + ['latest'],
|
||||||
|
action=ReplaceLatestVersion,
|
||||||
help='Baremetal API version, default=' +
|
help='Baremetal API version, default=' +
|
||||||
http.DEFAULT_VER +
|
http.DEFAULT_VER +
|
||||||
' (Env: OS_BAREMETAL_API_VERSION)')
|
' (Env: OS_BAREMETAL_API_VERSION). '
|
||||||
|
'"latest" is the latest known API version',
|
||||||
|
)
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
|
|
||||||
|
class ReplaceLatestVersion(argparse.Action):
|
||||||
|
"""Replaces `latest` keyword by last known version."""
|
||||||
|
def __call__(self, parser, namespace, values, option_string=None):
|
||||||
|
latest = values == 'latest'
|
||||||
|
if latest:
|
||||||
|
values = '1.%d' % LAST_KNOWN_API_VERSION
|
||||||
|
LOG.debug("Replacing 'latest' API version with the "
|
||||||
|
"latest known version '%s'", values)
|
||||||
|
setattr(namespace, self.dest, values)
|
||||||
|
@ -10,9 +10,12 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
|
from ironicclient.common import http
|
||||||
from ironicclient.osc import plugin
|
from ironicclient.osc import plugin
|
||||||
from ironicclient.tests.unit.osc import fakes
|
from ironicclient.tests.unit.osc import fakes
|
||||||
from ironicclient.v1 import client
|
from ironicclient.v1 import client
|
||||||
@ -33,3 +36,38 @@ class MakeClientTest(testtools.TestCase):
|
|||||||
instance.get_endpoint_for_service_type.assert_called_once_with(
|
instance.get_endpoint_for_service_type.assert_called_once_with(
|
||||||
'baremetal', region_name=instance._region_name,
|
'baremetal', region_name=instance._region_name,
|
||||||
interface=instance.interface)
|
interface=instance.interface)
|
||||||
|
|
||||||
|
|
||||||
|
class BuildOptionParserTest(testtools.TestCase):
|
||||||
|
|
||||||
|
@mock.patch.object(argparse.ArgumentParser, 'add_argument')
|
||||||
|
def test_build_option_parser(self, mock_add_argument):
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
mock_add_argument.reset_mock()
|
||||||
|
plugin.build_option_parser(parser)
|
||||||
|
version_list = ['1'] + ['1.%d' % i for i in range(
|
||||||
|
1, plugin.LAST_KNOWN_API_VERSION + 1)] + ['latest']
|
||||||
|
mock_add_argument.assert_called_once_with(
|
||||||
|
'--os-baremetal-api-version', action=plugin.ReplaceLatestVersion,
|
||||||
|
choices=version_list, default=http.DEFAULT_VER, help=mock.ANY,
|
||||||
|
metavar='<baremetal-api-version>')
|
||||||
|
|
||||||
|
|
||||||
|
class ReplaceLatestVersionTest(testtools.TestCase):
|
||||||
|
|
||||||
|
def test___call___latest(self):
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
plugin.build_option_parser(parser)
|
||||||
|
namespace = argparse.Namespace()
|
||||||
|
parser.parse_known_args(['--os-baremetal-api-version', 'latest'],
|
||||||
|
namespace)
|
||||||
|
self.assertEqual('1.%d' % plugin.LAST_KNOWN_API_VERSION,
|
||||||
|
namespace.os_baremetal_api_version)
|
||||||
|
|
||||||
|
def test___call___specific_version(self):
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
plugin.build_option_parser(parser)
|
||||||
|
namespace = argparse.Namespace()
|
||||||
|
parser.parse_known_args(['--os-baremetal-api-version', '1.4'],
|
||||||
|
namespace)
|
||||||
|
self.assertEqual('1.4', namespace.os_baremetal_api_version)
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- For OSC commands, the --os-baremetal-api-version optional argument
|
||||||
|
(or OS_BAREMETAL_API_VERSION environment variable) can have the
|
||||||
|
value 'latest'. If set to 'latest', the latest API version known by client
|
||||||
|
will be used in requests to the Bare Metal service.
|
Loading…
Reference in New Issue
Block a user