【Openstack 4j】如何指定Nova的版本
背景
在使用openstack4j的过程中,发现openstack的版本和文档有一些问题。
openstack4j 通过Identity服务返回的catalog信息,获取Endpoint节点,访问例如nova-compute的服务。
而由于openstack的某些版本,例如yoga,它的compute服务版本是2.1,因此无法使用一些高版本的参数。
例如:
{ "badRequest":
{
"code": 400, "message": "Invalid input for field/attribute 0. Value:{'device_name': 'local0', 'source_type': 'blank', 'destination_type': 'volume',
'volume_size': 200, 'delete_on_termination': True, 'volume_type': 'slankka-ssd'}.
Additional properties are not allowed ('volume_type' was unexpected)"
}
}
调查
通过查阅资料,发现社区也有类似得需求。
Openstack4j-PR-132
MicroVersions
Openstack4j的文档也没说Openstack怎么使用不同的子版本,还是藏在一个没有被合并的PR中。
分析
OSClientSession.headers() (and OSClientSession.getHeaders()).
- 使用 OSClientSession类的headers获取已经存在的
Map<String, String>
- 使用 OSClientSession类的headers(...) 设置要存储的Headers
具体切换版本的方法如Openstack文档所说:
X-OpenStack-Nova-API-Version: 2.4
通过Openstack的API查阅支持的版本范围:
别请求这个服务,因为是示例
curl openstack.slankka.com:8774
得出
{
"versions": [
{
"id": "v2.0",
"status": "SUPPORTED",
"version": "",
"min_version": "",
"updated": "2011-01-21T11:33:21Z",
"links": [
{
"rel": "self",
"href": "http://openstack.slankka.com:8774/v2/"
}
]
},
{
"id": "v2.1",
"status": "CURRENT",
"version": "2.90",
"min_version": "2.1",
"updated": "2013-07-23T11:33:21Z",
"links": [
{
"rel": "self",
"href": "http://openstack.slankka.com:8774/v2.1/"
}
]
}
]
}
因此支持的范围是 2.1~2.90
结论
使用Openstack4j的API:
OSClientSessionV3是OSClientSession的子类,如果没有getHeaders,可以向上转型
实际使用中,发现getHeaders没有值,因此可以直接headers传入最新 Map<String,String>
Map<String,String> versions = new HashMap<>();
versions.put("X-OpenStack-Nova-API-Version", "2.90");