【问题标题】:Overriding authentication behavior in jclouds覆盖 jclouds 中的身份验证行为
【发布时间】:2014-01-19 21:26:03
【问题描述】:

我希望将 RackSpace 的 CloudFiles 平台用于大型对象存储(word 文档、图像等)。按照他们的一些指南,我发现了一个有用的代码 sn-p,它看起来应该可以工作,但在我的情况下却不行。

    Iterable<Module> modules = ImmutableSet.<Module> of(
            new Log4JLoggingModule());
    Properties properties = new Properties();
    properties.setProperty(LocationConstants.PROPERTY_ZONE, ZONE);
    properties.setProperty(LocationConstants.PROPERTY_REGION, "ORD");
    CloudFilesClient cloudFilesClient = ContextBuilder.newBuilder(PROVIDER)
            .credentials(username, apiKey)
            .overrides(properties)
            .modules(modules)
            .buildApi(CloudFilesClient.class);

问题在于,当此代码执行时,它会尝试将我登录到 CloudFiles 的 IAD(弗吉尼亚)实例。我的组织的目标是使用 ORD (Chicago) 实例作为主要与我们的云共置并使用 DFW 作为备份环境。登录响应导致 IAD 实例首先返回,所以我假设 JClouds 正在使用它。浏览一下,CloudFiles 似乎忽略了 ZONE/REGION 属性。我想知道是否有任何方法可以覆盖返回以进行身份​​验证的代码,以遍历返回的提供程序并选择要登录的提供程序。

更新:

接受的答案大多是好的,在这个 sn-p 中提供了更多信息:

    RestContext<CommonSwiftClient, CommonSwiftAsyncClient> swift = cloudFilesClient.unwrap();
    CommonSwiftClient client = swift.getApi();
    SwiftObject object = client.newSwiftObject();

    object.getInfo().setName(FILENAME + SUFFIX);
    object.setPayload("This is my payload."); //input stream.
    String id = client.putObject(CONTAINER, object);
    System.out.println(id);
    SwiftObject obj2 = client.getObject(CONTAINER,FILENAME + SUFFIX);
    System.out.println(obj2.getPayload());

【问题讨论】:

    标签: java jclouds


    【解决方案1】:

    我们正在开发下一版本的 jclouds (1.7.1),其中应该包括对 Rackspace Cloud Files 和 OpenStack Swift 的多区域支持。与此同时,您也许可以使用此代码作为解决方法。

    private void uploadToRackspaceRegion() {
      Iterable<Module> modules = ImmutableSet.<Module> of(new Log4JLoggingModule());
      String provider = "swift-keystone"; //Region selection is limited to swift-keystone provider
      String identity = "username";
      String credential = "password";
      String endpoint = "https://identity.api.rackspacecloud.com/v2.0/";
      String region = "ORD";
    
      Properties overrides = new Properties();
      overrides.setProperty(LocationConstants.PROPERTY_REGION, region);
      overrides.setProperty(Constants.PROPERTY_API_VERSION, "2");
    
      BlobStoreContext context = ContextBuilder.newBuilder(provider)
            .endpoint(endpoint)
            .credentials(identity, credential)
            .modules(modules)
            .overrides(overrides)
            .buildView(BlobStoreContext.class);
      RestContext<CommonSwiftClient, CommonSwiftAsyncClient> swift = context.unwrap();
      CommonSwiftClient client = swift.getApi();
    
      SwiftObject uploadObject = client.newSwiftObject();
      uploadObject.getInfo().setName("test.txt");
      uploadObject.setPayload("This is my payload."); //input stream.
    
      String eTag = client.putObject("jclouds", uploadObject);
      System.out.println("eTag = " + eTag);
    
      SwiftObject downloadObject = client.getObject("jclouds", "test.txt");
      System.out.println("downloadObject = " + downloadObject.getPayload());
    
      context.close();
    }
    

    像使用云文件一样使用swift。请记住,如果您需要使用 Cloud Files CDN 的东西,上面的内容将不适用。另外,要知道这种做事方式最终会被弃用。

    【讨论】:

    • 我最初尝试过,这种类型的示例的一个问题是没有定义 swift 和 storage 变量。您能否评论一下如何使用 swift 获取特定容器?网站评论中也缺少这一点。
    • 好的,所以我玩得更远了。如果我使用密码凭据,而不是 API 密钥,我只能让它工作。 API 密钥生成 400。
    • 我将答案标记为已接受。 API 密钥问题仍然是一个问题,但我至少可以使用用户名/密码登录。对于那些好奇的人,另一种看待 storage 和 swift 的方式是在我的原版中。
    • 非常感谢约翰的反馈。我更新了我的示例以完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    相关资源
    最近更新 更多