Update microversion header to include service type magnum

This change updates the version header to meet the microversion
guildlines. See link in bug for api-wg guidelines. Adds "magnum"
to the version header as the service type.

Change-Id: Ibcb1f7b20847198c15612e8bd6ba30279bec1d04
Closes-Bug: #1569776
This commit is contained in:
Jaycen Grant 2016-06-03 02:01:37 -07:00
parent 220e74da1f
commit 2b3c4a0fe7
4 changed files with 49 additions and 22 deletions

View File

@ -53,15 +53,17 @@ class APIBase(wtypes.Base):
class Version(object):
"""API Version object."""
string = 'X-OpenStack-Magnum-API-Version'
string = 'X-OpenStack-API-Version'
"""HTTP Header string carrying the requested version"""
min_string = 'X-OpenStack-Magnum-API-Minimum-Version'
min_string = 'X-OpenStack-API-Minimum-Version'
"""HTTP response header"""
max_string = 'X-OpenStack-Magnum-API-Maximum-Version'
max_string = 'X-OpenStack-API-Maximum-Version'
"""HTTP response header"""
service_string = 'magnum'
def __init__(self, headers, default_version, latest_version):
"""Create an API Version object from the supplied headers.
@ -87,15 +89,23 @@ class Version(object):
:returns: a tuple of (major, minor) version numbers
:raises: webob.HTTPNotAcceptable
"""
version_str = headers.get(Version.string, default_version)
if version_str.lower() == 'latest':
parse_str = latest_version
else:
parse_str = version_str
version_hdr = headers.get(Version.string, default_version)
try:
version = tuple(int(i) for i in parse_str.split('.'))
version_service, version_str = version_hdr.split()
except ValueError:
raise exc.HTTPNotAcceptable(_(
"Invalid service type for %s header") % Version.string)
if version_str.lower() == 'latest':
version_service, version_str = latest_version.split()
if version_service != Version.service_string:
raise exc.HTTPNotAcceptable(_(
"Invalid service type for %s header") % Version.string)
try:
version = tuple(int(i) for i in version_str.split('.'))
except ValueError:
version = ()

View File

@ -48,14 +48,15 @@ BASE_VERSION = 1
#
# v1.1: API at the point in time when microversioning support was added
MIN_VER_STR = '1.1'
MIN_VER_STR = 'magnum 1.1'
# v1.1: Add API changelog here
MAX_VER_STR = '1.1'
MAX_VER_STR = 'magnum 1.1'
MIN_VER = controllers_base.Version(
{controllers_base.Version.string: MIN_VER_STR}, MIN_VER_STR, MAX_VER_STR)
{controllers_base.Version.string: MIN_VER_STR},
MIN_VER_STR, MAX_VER_STR)
MAX_VER = controllers_base.Version(
{controllers_base.Version.string: MAX_VER_STR},
MIN_VER_STR, MAX_VER_STR)

View File

@ -25,7 +25,7 @@ fakeAuthTokenHeaders = {'X-User-Id': u'773a902f022949619b5c2f32cd89d419',
'X-User-Domain-Name': 'domain',
'X-Project-Domain-Id': 'project_domain_id',
'X-User-Domain-Id': 'user_domain_id',
'X-OpenStack-Magnum-API-Version': '1.0'
'X-OpenStack-API-Version': 'magnum 1.0'
}

View File

@ -21,8 +21,10 @@ class TestVersion(test_base.TestCase):
def setUp(self):
super(TestVersion, self).setUp()
self.a = base.Version({base.Version.string: "2.0"}, "2.0", "2.1")
self.b = base.Version({base.Version.string: "2.0"}, "2.0", "2.1")
self.a = base.Version(
{base.Version.string: "magnum 2.0"}, "magnum 2.0", "magnum 2.1")
self.b = base.Version(
{base.Version.string: "magnum 2.0"}, "magnum 2.0", "magnum 2.1")
def test__lt__with_higher_major_version(self):
self.a.major = 2
@ -103,30 +105,44 @@ class TestVersion(test_base.TestCase):
def test_parse_headers_ok(self):
version = base.Version.parse_headers(
{base.Version.string: '123.456'}, mock.ANY, mock.ANY)
{base.Version.string: 'magnum 123.456'}, mock.ANY, mock.ANY)
self.assertEqual((123, 456), version)
def test_parse_headers_latest(self):
for s in ['latest', 'LATEST']:
for s in ['magnum latest', 'magnum LATEST']:
version = base.Version.parse_headers(
{base.Version.string: s}, mock.ANY, '1.9')
{base.Version.string: s}, mock.ANY, 'magnum 1.9')
self.assertEqual((1, 9), version)
def test_parse_headers_bad_length(self):
self.assertRaises(
exc.HTTPNotAcceptable,
base.Version.parse_headers,
{base.Version.string: '1'},
{base.Version.string: 'magnum 1'},
mock.ANY,
mock.ANY)
self.assertRaises(
exc.HTTPNotAcceptable,
base.Version.parse_headers,
{base.Version.string: '1.2.3'},
{base.Version.string: 'magnum 1.2.3'},
mock.ANY,
mock.ANY)
def test_parse_no_header(self):
# this asserts that the minimum version string of "1.1" is applied
version = base.Version.parse_headers({}, '1.1', '1.5')
# this asserts that the minimum version string is applied
version = base.Version.parse_headers({}, 'magnum 1.1', 'magnum 1.5')
self.assertEqual((1, 1), version)
def test_parse_incorrect_service_type(self):
self.assertRaises(
exc.HTTPNotAcceptable,
base.Version.parse_headers,
{base.Version.string: '1.1'},
'magnum 1.1',
'magnum 1.1')
self.assertRaises(
exc.HTTPNotAcceptable,
base.Version.parse_headers,
{base.Version.string: 'nova 1.1'},
'magnum 1.1',
'magnum 1.1')