2014-01-16 4 views
1

Java jclouds API가 OpenStack 공급자에 연결하지 못했습니다.OpenStack에서 jclouds => java.util.NoSuchElementException : apiType이 카탈로그 []에서 컴퓨팅을 찾을 수 없음

다음 메시지와 함께 예외가 발생합니다. 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()); 
    } 
} 

어떤 도움이나 힌트는 크게 본을 실행하는 데 적절한 종속성을 놓치고

답변

0

을 감사합니다. 그들을 얻으려면 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" 실행합니다. 당신은 다음과 jclouds에서 지원되는 OpenStack은 서비스의 모든 작업을위한 더 완벽한 pom.xml 파일을 컴파일 또는 java -classpath ".:lib/*" jcloudsOpenStack

처럼 실행하면

는 경로의 lib 디렉토리 디렉토리를 포함하는 것을 잊지 마십시오.

<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> 
+1

나는 모든이를 도울 수. 만약 내가하지 않았다면, 내가 할 수 있었던 코드를 컴파일 할 수 없었을 것입니다. 내가 언급 한 모든 것을 가지고 있는지 확인해 보겠습니다. 고마워요. –

+0

DevStack Havana 배치에 맞춰 정확하게 예제를 실행 했으므로 제대로 작동했습니다. 그것이 당신을 위해 일하고 있기를 바랍니다. –

+0

고마워, 지금까지는 그렇지 않지만 우리는 그것에 대해 연구 중이다. 그것이 당신을 위해 일하는 것을 아는 것이 좋습니다. –

3

나는 지난 며칠 동안 똑같은 문제를 겪었고, 결국이 문제가 해결되었습니다. '자격증 명'기능의 '신원'매개 변수에는 "username : tenantname"을 사용해야합니다. "tenantname : username"대신 "username"을 사용하면 jclouds는 토큰 쿼리 후 endpoint-list를 쿼리하는 대신 토큰 만 쿼리하므로 예외가 발생합니다.

은 다음과 같습니다

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

희망이 너희들