2014-01-19 2 views
0

Я ищу, чтобы использовать платформу CloudFiles RackSpace для хранения больших объектов (текстовые документы, изображения и т. Д.). Следуя некоторым из их руководств, я нашел полезный фрагмент кода, который выглядит так, как будто он должен работать, но не в моем случае.Переопределение поведения аутентификации в jclouds

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

Проблема заключается в том, что при выполнении этого кода, он пытается войти в меня в экземпляре IAD (Вирджиния) из CloudFiles. Цель моей организации - использовать экземпляр ORD (Чикаго) как основной, который будет помещен в облако и использовать DFW в качестве резервной среды. Ответ входа в систему приводит к возврату экземпляра IAD, поэтому я предполагаю, что JClouds использует это. Просмотр вокруг, похоже, что атрибуты ZONE/REGION игнорируются для CloudFiles. Мне было интересно, есть ли способ переопределить код, который возвращается для проверки подлинности, через петлю через возвращаемых провайдеров и выбрать, к кому войти.

Update:

Принятый ответ в основном хорошие, с большим количеством некоторой информации, имеющейся в этом фрагменте:

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

ответ

2

Мы работаем на следующей версии jclouds (1.7.1), которые должны включать в себя поддержка нескольких регионов для облачных файлов Rackspace и 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, как и облако. Имейте в виду, что если вам нужно использовать файлы CDN Cloud Files, приведенное выше не будет работать для этого. Кроме того, знайте, что этот способ делать вещи в конечном итоге будет устаревшим.

+0

Я пробовал это изначально. Одна проблема с этим типом примера заключается в том, что переменные swift и storage не определены. Можете ли вы также прокомментировать, как вы бы быстро использовали конкретный контейнер? Это также отсутствовало в комментарии к веб-сайту. –

+0

Итак, я немного поиграл. Я могу заставить его работать, если я использую учетные данные для пароля, а не ключ API. Результат API составляет 400. –

+0

Я отмечаю ответ как принятый. Проблема с ключом API по-прежнему остается проблемой, но я могу хотя бы войти в систему, используя имя пользователя/пароль. Для тех, кто интересуется, другой способ взглянуть на хранилище и быстрота в моем оригинале. –

Смежные вопросы