背景
在使用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");