【问题标题】:jclouds with OpenStack => java.util.NoSuchElementException: apiType compute not found in catalog []jclouds with OpenStack => java.util.NoSuchElementException: apiType compute not found in catalog []
【发布时间】:2014-02-05 22:03:59
【问题描述】:

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

抛出异常并显示以下消息:java.util.NoSuchElementException: apiType compute not found in catalog []。

其他 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());
   }
}

非常感谢任何帮助或提示

【问题讨论】:

    标签: java openstack jclouds


    【解决方案1】:

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

    看起来像这样:

      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);
    

    希望对大家有所帮助

    【讨论】:

      【解决方案2】:

      您缺少运行此程序的正确依赖项。使用Maven 获取它们是最简单的。

      上述示例所需的最低限度是 openstack-nova 依赖项。要获取它,请创建一个名为 pom.xml 的文件并复制此代码。

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <properties>
          <jclouds.version>1.7.0</jclouds.version>
        </properties>
        <groupId>org.apache.jclouds.examples</groupId>
        <artifactId>openstack-examples</artifactId>
        <version>1.0</version>
        <dependencies>
          <dependency>
            <groupId>org.apache.jclouds.api</groupId>
            <artifactId>openstack-nova</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
        </dependencies>
      </project>
      

      然后运行mvn dependency:copy-dependencies "-DoutputDirectory=./lib",它将下载运行示例所需的所有依赖项。

      当你编译或运行它时不要忘记在你的路径中包含 lib 目录java -classpath ".:lib/*" jcloudsOpenStack

      一个更完整的 pom.xml 文件用于处理 jclouds 中支持的所有 OpenStack 服务。

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven 4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <properties>
          <jclouds.version>1.7.0</jclouds.version>
        </properties>
        <groupId>org.apache.jclouds.examples</groupId>
        <artifactId>openstack-examples</artifactId>
        <version>1.0</version>
        <dependencies>
          <!-- jclouds dependencies -->
          <dependency>
            <groupId>org.apache.jclouds.driver</groupId>
            <artifactId>jclouds-slf4j</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
          <dependency>
            <groupId>org.apache.jclouds.driver</groupId>
            <artifactId>jclouds-sshj</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
          <!-- OpenStack dependencies -->
          <dependency>
            <groupId>org.apache.jclouds.api</groupId>
            <artifactId>openstack-keystone</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
          <dependency>
            <groupId>org.apache.jclouds.api</groupId>
            <artifactId>openstack-nova</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
          <dependency>
            <groupId>org.apache.jclouds.api</groupId>
            <artifactId>swift</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
          <dependency>
            <groupId>org.apache.jclouds.api</groupId>
            <artifactId>openstack-cinder</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
          <dependency>
            <groupId>org.apache.jclouds.api</groupId>
            <artifactId>openstack-trove</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
          <dependency>
            <groupId>org.apache.jclouds.labs</groupId>
            <artifactId>openstack-glance</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
          <dependency>
            <groupId>org.apache.jclouds.labs</groupId>
            <artifactId>openstack-marconi</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
          <dependency>
            <groupId>org.apache.jclouds.labs</groupId>
            <artifactId>openstack-neutron</artifactId>
            <version>${jclouds.version}</version>
          </dependency>
          <!-- 3rd party dependencies -->
          <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.13</version>
          </dependency>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.25</version>
          </dependency>
        </dependencies>
      </project>
      

      【讨论】:

      • 这些我都有。如果我没有,我将无法编译代码,而我能够做到这一点。我会检查我是否有你提到的一切,谢谢。
      • 我完全按照我的 DevStack Havana 部署运行了您的示例,并且效果很好。希望它也对你有用。
      • 谢谢,到目前为止还没有,但我们正在努力。很高兴知道它对您有用。
      • @user2436366 你有没有解决这个问题?我正在使用 rackspace 私有云并遇到同样的问题
      • 这是一个常见问题。看看jclouds.apache.org/reference/troubleshooting 看看是否有帮助。
      猜你喜欢
      • 2022-07-14
      • 2015-05-30
      • 2020-12-12
      • 2022-08-07
      • 2019-05-12
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      相关资源
      最近更新 更多