用于下载Openstack图像的Java API

用于下载Openstack图像的Java API,openstack,jclouds,openstack-nova,Openstack,Jclouds,Openstack Nova,我想以.vmdk格式拍摄正在运行的服务器(Openstack env)的快照,并在本地文件中下载.vmdk文件。是否有相同的java API 我希望Java API与openstack CLI“nova image create”和“glance image download”类似。jcloudsopenstack novaAPI支持 另外,根据您使用的Glance版本,jclouds对v1的支持。我不确定是否理解.vmdk快照和OpenStack的java api之间的关系。如果您正在寻找使用

我想以.vmdk格式拍摄正在运行的服务器(Openstack env)的快照,并在本地文件中下载.vmdk文件。是否有相同的java API


我希望Java API与openstack CLI“nova image create”和“glance image download”类似。jclouds
openstack nova
API支持


另外,根据您使用的Glance版本,jclouds对v1的支持。

我不确定是否理解.vmdk快照和OpenStack的java api之间的关系。如果您正在寻找使用OpenStack原生api的替代方法,请查看基于java的OpenStack提供的REST api

Java没有项目认可的API客户机,这意味着您可以从以下三个方面进行选择

或者,您可以像对待任何其他REST服务一样对待OpenStack,并直接针对在使用您喜欢的任何HTTP Java客户端库时记录的API编写代码

我一直在解决一个类似的问题,我决定使用上面列表中的ApacheJClouds库

下载图像数据仅在beta
openstack glance
包中可用,我使用

我不得不重写gson,这是一个解决与Sprint Boot的一些不良交互的方法,我也在我的项目中使用了它(我没有深入研究)

现在,我可以通过执行以下操作列出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
gleaseapi
的原因是,当我列出图像时,我无法使用
gleaseapi
进行分页。它与NovaApi一起工作正常

此时,
只是一个
InputStream
实例,您可以将其写入文件。Java7中有一个有用的方法来实现这一点

Files.copy(InputStream in, Path target)
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()
Files.copy(InputStream in, Path target)