我想以.vmdk格式拍摄正在运行的服务器(Openstack env)的快照,并在我的本地下载.vmdk文件。是否有相同的Java API?
我希望Java API类似于openstack CLI“nova image-create”和“glance image-download”。
答案 0 :(得分:1)
jclouds openstack-nova
API支持creating an image from a server。
此外,根据您使用的Glance版本,jclouds支持downloading an image。
答案 1 :(得分:0)
我不确定我是否了解.vmdk快照与OpenStack的java api之间的关系。如果您正在寻找使用OpenStack原生api的替代方案,请查看基于java的https://github.com/paypal/aurora
答案 2 :(得分:0)
OpenStack提供REST API。
Java没有项目认可的API客户端,这意味着您可以从https://wiki.openstack.org/wiki/SDKs#Java中选择三个。
或者,您可以使用任何您喜欢的Java客户端库(例如https://developer.openstack.org/api-ref/image/)直接针对https://github.com/google/google-http-java-client中记录的API,将OpenStack视为任何其他REST服务和代码。
我一直在解决类似的问题,我决定使用上面列表中的Apache jclouds库。
下载图片数据仅适用于我在构建文件(Gradle Script Kotlin)中使用
包含的betaopenstack-glance
包中
compile(group="org.apache.jclouds", name="jclouds-all", version="2.1.0")
compile(group="org.apache.jclouds.labs", name="openstack-glance", version = "2.1.0")
我不得不重写gson,这是与Sprint Boot的一些不良交互的解决方法,我也在我的项目中使用(我没有深入研究)
// resolve com.google.inject.internal.util.$ComputationException: com.google.inject.internal.util.$ComputationException: com.google.inject.internal.util.$ComputationException: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
// https://stackoverflow.com/questions/43574426/how-to-resolve-java-lang-noclassdeffounderror-javax-xml-bind-jaxbexception-in-j
runtime(group="javax.xml.bind", name="jaxb-api", version="2.3.0")
现在,我可以通过
列出OpenStack上的所有图像val tenantName = "xxx"
val userName = "yyy"
val password = "zzz"
val endpoint = "https://aaa.com:13000/v2.0"
val region = "regionOne"
val identity = "$tenantName:$userName"
// val modules = setOf(SLF4JLoggingModule()) // not actually necessary
val novaApi = ContextBuilder.newBuilder("openstack-nova")
.endpoint(endpoint)
.credentials(identity, password)
// .modules(modules)
.buildApi(NovaApi::class.java)
val imageApi = novaApi.getImageApi(region)
for (images in imageApi.listInDetail()) {
for (image in images) {
print(image.id)
}
}
}
novaApi.close()
您不能使用NovaApi
实际下载数据,为此,您必须这样做
val glanceApi = ContextBuilder.newBuilder("openstack-glance")
.endpoint(endpoint)
.credentials(identity, password)
.buildApi(org.jclouds.openstack.glance.v1_0.GlanceApi::class.java)
val imageApi = glanceApi.getImageApi(region)
val length = imageApi.get(id).size.or(-1)
val stream = imageApi.getAsStream(id)
glanceApi.close()
同时使用NovaApi
和GlanceApi
的原因是,当我列出图片时,我无法使用GlanceApi
进行分页。它适用于NovaApi
。
此时,stream
只是一个InputStream
实例,您可以将其写入文件。 Java 7中有一种有用的方法可以做到这一点。
Files.copy(InputStream in, Path target)