Создание временного URI для объекта с помощью BlobStore

Я пытаюсь реализовать создание временных URI GET для объектов, хранящихся в контейнере OpenStack Swift, с использованием функций jClouds BlobStore.

Однако я получаю эти ошибки:

java.lang.IllegalStateException: Suppliers.memoizeWithExpiration(get().getTemporaryUrlKey() using {annotationParser={caller=SwiftApi.accountApiInRegion[RegionOne]}}, 60000000000, NANOS) returned a null temporaryUrlKey!
    at com.google.common.base.Preconditions.checkState(Preconditions.java:177)
    at org.jclouds.openstack.swift.v1.TemporaryUrlSigner.hmacSHA1(TemporaryUrlSigner.java:63)
    at org.jclouds.openstack.swift.v1.TemporaryUrlSigner.sign(TemporaryUrlSigner.java:57)
    at org.jclouds.openstack.swift.v1.blobstore.RegionScopedTemporaryUrlBlobSigner.sign(RegionScopedTemporaryUrlBlobSigner.java:100)
    at org.jclouds.openstack.swift.v1.blobstore.RegionScopedTemporaryUrlBlobSigner.signGetBlob(RegionScopedTemporaryUrlBlobSigner.java:73)

Вот пример кода:

public class BlobStoreObjectSignerService implements ObjectSignerService {

    @Autowired
    private BlobRequestSigner blobRequestSigner;

    @Value("${blobStore.private.container}")
    String privateContainerName;

    /**
    * Generates signed request With GET Method to access allocated object.
    *   
    * @param objectName         name of the stored file
    * @param principalName      name of the principal (user) which is putted the file
    * @param temporary          defines if file should be available for a limited time
    * @param timeToLive         time in seconds file will be available for fetching
    */
    public HttpRequest generateGetRequestForObject( String objectName, 
                                                    String principalName, 
                                                    boolean temporary, 
                                                    long timeToLive ) {
        if (temporary) {
            return this.generateTemporaryGetRequestForObject(objectName,  principalName, timeToLive);
        } else {
            return this.generatePermanentGetRequestForObject(objectName,  principalName);
        }
    }

    public HttpRequest generatePermanentGetRequestForObject( String objectName, 
                                                             String principalName ) {
        return this.generatePermanentGetRequestForObject( privateContainerName,
                                                          String.format( "/%s/%s", principalName, objectName ) );
    }

    public HttpRequest generateTemporaryGetRequestForObject( String objectName, 
                                                             String principalName,
                                                             long timeToLive ) {
        return this.generateTemporaryGetRequestForObject( privateContainerName,
                                                          String.format( "/%s/%s", principalName, objectName ),
                                                          timeToLive );
    }

    public HttpRequest generatePermanentGetRequestForObject(String containerName, String objectName) {
        return this.blobRequestSigner.signGetBlob(containerName, objectName);
    }

    public HttpRequest generateTemporaryGetRequestForObject(String containerName, String objectName, long timeToLive) {
        return this.blobRequestSigner.signGetBlob(containerName, objectName, timeToLive);
    }

}

Что касается общедоступных контейнеров, я все еще могу получать ссылки на объекты, извлекая заголовок/метаданные, и это немного сбоку, но мне все еще нужны подписанные URI для публикации объектов, хранящихся в частных контейнерах.

Помещение файлов в контейнер с помощью BlobStore работает нормально. Все отправленные сообщения обычно отображаются в OpenStack Dashboard.

Я использую Java 7 и DevStack, настроенный для Swift, только в среде разработки. Версия jClouds — 1.7.2.


person user2116027    schedule 26.05.2014    source источник


Ответы (1)


Исходя из исключения, похоже, что у вас нет временного ключа URL, установленного для учетной записи. Вы можете обновить ключ до нового значения через AccountApi следующим образом:

SwiftApi swiftApi = ContextBuilder.newBuilder(PROVIDER)
           .credentials("{username}", "{apiKey}")
           .buildApi(SwiftApi.class);

// Access the accountApi
AccountApi accountApi = swiftApi.getAccountApiForRegion("{regionId");
accountApi.updateTemporaryUrlKey("{newKey}");

// Access the key
String tempUrlKey;
if (accountApi.getTemporaryUrlKey().isPresent()) {
   tempUrlKey = accountApi.get().getTemporaryUrlKey().get();
}

Надеюсь, это поможет!

person Jeremy Daggett    schedule 28.05.2014
comment
Сделал трюк, спасибо! Похоже, что по каким-то причинам ключ не был установлен должным образом. - person user2116027; 28.05.2014