0

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

我想要类似于 openstack CLI“nova image-create”和“glance image-download”的 Java API。

4

3 回答 3

1

jclouds openstack-novaAPI 支持从服务器创建图像

此外,根据您使用的 Glance 版本,jclouds 支持 v1下载图像

于 2014-09-24T16:03:21.877 回答
0

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

于 2014-10-19T06:38:54.843 回答
0

OpenStack 提供 REST API。

没有项目认可的 Java API 客户端,这意味着您可以从https://wiki.openstack.org/wiki/SDKs#Java中选择三个。

或者,您可以将 OpenStack 视为任何其他 REST 服务和代码,直接针对https://developer.openstack.org/api-ref/image/中记录的 API,使用您喜欢的任何 Java 的 HTTP 客户端库,例如https:// github.com/google/google-http-java-client

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

下载图像数据仅openstack-glance在我的构建文件(Gradle Script Kotlin)中包含的 beta 包中可用,使用

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)
于 2018-05-02T07:30:09.560 回答