java - jclouds 与 OpenStack => java.util.NoSuchElementException : apiType compute not found in catalog []

标签 java openstack jclouds

Java jclouds API 无法连接到 OpenStack 提供程序。

抛出异常并显示以下消息:java.util.NoSuchElementException:在目录 [] 中找不到 apiType 计算。

其他 API(python-novaclient、ruby-fog)工作得很好,因此问题看起来是特定于语言 (API) 的。

import static com.google.common.io.Closeables.closeQuietly;

import java.io.Closeable;
import java.util.Set;

import org.jclouds.ContextBuilder;
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.domain.ComputeMetadata;
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
import org.jclouds.openstack.nova.v2_0.NovaApi;
import org.jclouds.openstack.nova.v2_0.NovaAsyncApi;
import org.jclouds.openstack.nova.v2_0.domain.Server;
import org.jclouds.openstack.nova.v2_0.features.ServerApi;
import org.jclouds.rest.RestContext;

import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;

public class jcloudsOpenStack implements Closeable {
   private ComputeService compute;
   private RestContext nova;

   public static void main(String[] args) {
      jcloudsOpenStack jcloudOpenStack = new jcloudsOpenStack();

      try {
         jcloudOpenStack.init();
         jcloudOpenStack.listServers();
         jcloudOpenStack.close();
      }
      catch (Exception e) {
         e.printStackTrace();
      }
      finally {
         jcloudOpenStack.close();
      }
   }

   private void init() {
      Iterable modules = ImmutableSet. of(new SLF4JLoggingModule());

      String provider = "openstack-nova";
      String identity = "...";   // login name
      String password = "...";   // password

      ComputeServiceContext context = ContextBuilder.newBuilder(provider)
            .endpoint("https://UltiCloud.com:5000/v2.0/")
            .credentials(identity, password)
            .modules(modules)
            .buildView(ComputeServiceContext.class);
      compute = context.getComputeService();
      nova = context.unwrap();
   }

   private void listServers() {
      Set<? extends ComputeMetadata> nodes = compute.listNodes();
      System.out.println(nodes.size());
   }

   public void close() {
      closeQuietly(compute.getContext());
   }
}

非常感谢任何帮助或提示

最佳答案

这几天我也遇到了同样的问题,终于解决了。 您应该使用“用户名:租户名”作为“凭据”函数的参数“身份”。 如果您使用“username”而不是“tenantname:username”,jclouds 将仅查询 token ,而不是在 token 查询后查询端点列表,并抛出异常。

看起来像这样:

  ComputeServiceContext context = ContextBuilder.newBuilder(provider)
        .endpoint("https://UltiCloud.com:5000/v2.0/")
        .credentials("admin:admin", "123456")
        .modules(modules)
        .buildView(ComputeServiceContext.class);

不是这样的:

  ComputeServiceContext context = ContextBuilder.newBuilder(provider)
        .endpoint("https://UltiCloud.com:5000/v2.0/")
        .credentials("admin", "123456")
        .modules(modules)
        .buildView(ComputeServiceContext.class);

希望对大家有帮助

关于java - jclouds 与 OpenStack => java.util.NoSuchElementException : apiType compute not found in catalog [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21171261/

相关文章:

java - Codeigniter 相关下拉列表

openstack - 如何更改 openstack 仪表板中的默认 http 端口?

java - 为什么与 jclouds 一起使用的 CloudWatch API getMetricStatisticsInRegion 会抛出 UndeclaredThrowableException?

jclouds - 在 CloudStack 3 : NumberFormatException 上的 Cloudify 版本 2.2 或更低版本上注册 VM

ssh - 在 openstack 中使用 jclouds 传递 ssh key

java - 如何动态过滤 Lucene 的 MoreLikeThis?

javascript - 使用不同的二进制数查找给定集合的子集

ubuntu - 联系 http ://controller:5000/v3 时未能发现可用的身份版本

c# - openstacksdknet 上的 CloudIdentity(找不到用户)

java - 为什么 Controller 中的 @RequestMapping Spring 注释捕获了我想要的更多内容?