【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");
分类:
Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!