mirror of https://github.com/apache/jclouds.git
fixed hpcloud-objectstorage blob signing
This commit is contained in:
parent
b58060599b
commit
8684e59025
|
@ -0,0 +1,67 @@
|
|||
package org.jclouds.hpcloud.objectstorage.blobstore;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.blobstore.util.BlobStoreUtils.cleanRequest;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.BlobRequestSigner;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageAsyncClient;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.openstack.swift.blobstore.functions.BlobToObject;
|
||||
import org.jclouds.openstack.swift.domain.SwiftObject;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class HPCloudObjectStorageBlobRequestSigner implements BlobRequestSigner {
|
||||
private final RestAnnotationProcessor<HPCloudObjectStorageAsyncClient> processor;
|
||||
private final BlobToObject blobToObject;
|
||||
private final BlobToHttpGetOptions blob2HttpGetOptions;
|
||||
|
||||
private final Method getMethod;
|
||||
private final Method deleteMethod;
|
||||
private final Method createMethod;
|
||||
|
||||
@Inject
|
||||
public HPCloudObjectStorageBlobRequestSigner(RestAnnotationProcessor<HPCloudObjectStorageAsyncClient> processor, BlobToObject blobToObject,
|
||||
BlobToHttpGetOptions blob2HttpGetOptions) throws SecurityException, NoSuchMethodException {
|
||||
this.processor = checkNotNull(processor, "processor");
|
||||
this.blobToObject = checkNotNull(blobToObject, "blobToObject");
|
||||
this.blob2HttpGetOptions = checkNotNull(blob2HttpGetOptions, "blob2HttpGetOptions");
|
||||
this.getMethod = HPCloudObjectStorageAsyncClient.class.getMethod("getObject", String.class, String.class,
|
||||
GetOptions[].class);
|
||||
this.deleteMethod = HPCloudObjectStorageAsyncClient.class.getMethod("removeObject", String.class, String.class);
|
||||
this.createMethod = HPCloudObjectStorageAsyncClient.class.getMethod("putObject", String.class, SwiftObject.class);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest signGetBlob(String container, String name) {
|
||||
return cleanRequest(processor.createRequest(getMethod, container, name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest signPutBlob(String container, Blob blob) {
|
||||
return cleanRequest(processor.createRequest(createMethod, container, blobToObject.apply(blob)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest signRemoveBlob(String container, String name) {
|
||||
return cleanRequest(processor.createRequest(deleteMethod, container, name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest signGetBlob(String container, String name, org.jclouds.blobstore.options.GetOptions options) {
|
||||
return cleanRequest(processor.createRequest(getMethod, container, name, blob2HttpGetOptions.apply(options)));
|
||||
}
|
||||
}
|
|
@ -28,16 +28,20 @@ import javax.annotation.Resource;
|
|||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobRequestSigner;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.attr.ConsistencyModel;
|
||||
import org.jclouds.blobstore.config.BlobStoreMapModule;
|
||||
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageClient;
|
||||
import org.jclouds.hpcloud.objectstorage.blobstore.HPCloudObjectStorageAsyncBlobStore;
|
||||
import org.jclouds.hpcloud.objectstorage.blobstore.HPCloudObjectStorageBlobRequestSigner;
|
||||
import org.jclouds.hpcloud.objectstorage.blobstore.HPCloudObjectStorageBlobStore;
|
||||
import org.jclouds.hpcloud.objectstorage.blobstore.functions.HPCloudObjectStorageObjectToBlobMetadata;
|
||||
import org.jclouds.hpcloud.objectstorage.domain.ContainerCDNMetadata;
|
||||
import org.jclouds.hpcloud.objectstorage.extensions.HPCloudCDNClient;
|
||||
import org.jclouds.http.HttpResponseException;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.openstack.swift.blobstore.SwiftAsyncBlobStore;
|
||||
import org.jclouds.openstack.swift.blobstore.SwiftBlobStore;
|
||||
import org.jclouds.openstack.swift.blobstore.config.SwiftBlobStoreContextModule;
|
||||
import org.jclouds.openstack.swift.blobstore.functions.ObjectToBlobMetadata;
|
||||
|
||||
|
@ -98,9 +102,11 @@ public class HPCloudObjectStorageBlobStoreContextModule extends SwiftBlobStoreCo
|
|||
|
||||
@Override
|
||||
protected void configure() {
|
||||
super.configure();
|
||||
bind(SwiftBlobStore.class).to(HPCloudObjectStorageBlobStore.class);
|
||||
bind(SwiftAsyncBlobStore.class).to(HPCloudObjectStorageAsyncBlobStore.class);
|
||||
install(new BlobStoreMapModule());
|
||||
bind(ConsistencyModel.class).toInstance(ConsistencyModel.STRICT);
|
||||
bind(AsyncBlobStore.class).to(HPCloudObjectStorageAsyncBlobStore.class);
|
||||
bind(BlobStore.class).to(HPCloudObjectStorageBlobStore.class);
|
||||
bind(ObjectToBlobMetadata.class).to(HPCloudObjectStorageObjectToBlobMetadata.class);
|
||||
bind(BlobRequestSigner.class).to(HPCloudObjectStorageBlobRequestSigner.class);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.hpcloud.objectstorage.blobstore;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
|
||||
import org.jclouds.blobstore.BlobRequestSigner;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.hpcloud.objectstorage.internal.BaseHPCloudObjectStorageBlobStoreExpectTest;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code HPCloudObjectStorageBlobRequestSigner}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
|
||||
@Test(groups = "unit", testName = "HPCloudObjectStorageBlobRequestSignerTest")
|
||||
public class HPCloudObjectStorageBlobRequestSignerTest extends BaseHPCloudObjectStorageBlobStoreExpectTest {
|
||||
|
||||
Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder().put(
|
||||
keystoneAuthWithAccessKeyAndSecretKey, responseWithKeystoneAccess).build();
|
||||
|
||||
public void testSignGetBlob() {
|
||||
|
||||
BlobRequestSigner signGetBlob = requestsSendResponses(requestResponseMap).getContext().getSigner();
|
||||
|
||||
HttpRequest request = signGetBlob.signGetBlob("container", "name");
|
||||
|
||||
assertEquals(request.getRequestLine(),
|
||||
"GET https://objects.jclouds.org/v1.0/40806637803162/container/name HTTP/1.1");
|
||||
assertEquals(request.getHeaders(), ImmutableMultimap.of("X-Auth-Token", "Auth_4f173437e4b013bee56d1007"));
|
||||
}
|
||||
|
||||
public void testSignRemoveBlob() {
|
||||
BlobRequestSigner signRemoveBlob = requestsSendResponses(requestResponseMap).getContext().getSigner();
|
||||
|
||||
HttpRequest request = signRemoveBlob.signRemoveBlob("container", "name");
|
||||
assertEquals(request.getRequestLine(),
|
||||
"DELETE https://objects.jclouds.org/v1.0/40806637803162/container/name HTTP/1.1");
|
||||
assertEquals(request.getHeaders(), ImmutableMultimap.of("X-Auth-Token", "Auth_4f173437e4b013bee56d1007"));
|
||||
|
||||
}
|
||||
|
||||
public void testSignPutBlob() {
|
||||
BlobStore blobStore = requestsSendResponses(requestResponseMap);
|
||||
BlobRequestSigner signPutBlob = blobStore.getContext().getSigner();
|
||||
Blob blob = blobStore.blobBuilder("name").forSigning().contentLength(2l).contentMD5(new byte[] { 0, 2, 4, 8 })
|
||||
.contentType("text/plain").expires(new Date(1000)).build();
|
||||
|
||||
HttpRequest request = signPutBlob.signPutBlob("container", blob);
|
||||
|
||||
assertEquals(request.getRequestLine(),
|
||||
"PUT https://objects.jclouds.org/v1.0/40806637803162/container/name HTTP/1.1");
|
||||
assertEquals(request.getHeaders(), ImmutableMultimap.of("X-Auth-Token", "Auth_4f173437e4b013bee56d1007"));
|
||||
// TODO:
|
||||
// assertEquals(request.getPayload(), blob);
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.hpcloud.objectstorage.blobstore;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.hpcloud.objectstorage.internal.BaseHPCloudObjectStorageBlobStoreExpectTest;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
@Test(groups = "unit", testName = "HPCloudObjectStorageBlobStoreExpectTest")
|
||||
public class HPCloudObjectStorageBlobStoreExpectTest extends BaseHPCloudObjectStorageBlobStoreExpectTest {
|
||||
|
||||
|
||||
public void testListObjectsWhenResponseIs2xx() throws Exception {
|
||||
Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder().put(
|
||||
keystoneAuthWithAccessKeyAndSecretKey, responseWithKeystoneAccess).build();
|
||||
|
||||
BlobStore clientWhenLocationsExist = requestsSendResponses(requestResponseMap);
|
||||
|
||||
Set<? extends Location> locations = clientWhenLocationsExist.listAssignableLocations();
|
||||
assertNotNull(locations);
|
||||
assertEquals(locations.size(), 1);
|
||||
// TODO: does this location make sense?
|
||||
assertEquals(locations.iterator().next().getId(), "hpcloud-objectstorage");
|
||||
}
|
||||
}
|
|
@ -1,14 +1,26 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.hpcloud.objectstorage.internal;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageProviderMetadata;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
|
@ -17,11 +29,10 @@ import org.jclouds.rest.internal.BaseRestClientExpectTest;
|
|||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.inject.Module;
|
||||
|
||||
@Test(groups = "unit", testName = "HPCloudObjectStorageExpectTest")
|
||||
public class HPCloudObjectStorageExpectTest extends BaseRestClientExpectTest<BlobStore> {
|
||||
public class BaseHPCloudObjectStorageBlobStoreExpectTest extends BaseRestClientExpectTest<BlobStore> {
|
||||
|
||||
|
||||
protected HttpRequest keystoneAuthWithUsernameAndPassword;
|
||||
|
@ -29,7 +40,7 @@ public class HPCloudObjectStorageExpectTest extends BaseRestClientExpectTest<Blo
|
|||
protected String authToken;
|
||||
protected HttpResponse responseWithKeystoneAccess;
|
||||
|
||||
public HPCloudObjectStorageExpectTest() {
|
||||
public BaseHPCloudObjectStorageBlobStoreExpectTest() {
|
||||
provider = "hpcloud-objectstorage";
|
||||
keystoneAuthWithUsernameAndPassword = KeystoneFixture.INSTANCE.initialAuthWithUsernameAndPassword(identity,
|
||||
credential);
|
||||
|
@ -40,20 +51,6 @@ public class HPCloudObjectStorageExpectTest extends BaseRestClientExpectTest<Blo
|
|||
|
||||
identity = KeystoneFixture.INSTANCE.getTenantName() + ":" + identity;
|
||||
}
|
||||
|
||||
|
||||
public void testListObjectsWhenResponseIs2xx() throws Exception {
|
||||
Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder().put(
|
||||
keystoneAuthWithAccessKeyAndSecretKey, responseWithKeystoneAccess).build();
|
||||
|
||||
BlobStore clientWhenServersExist = requestsSendResponses(requestResponseMap);
|
||||
|
||||
Set<? extends Location> locations = clientWhenServersExist.listAssignableLocations();
|
||||
assertNotNull(locations);
|
||||
assertEquals(locations.size(), 1);
|
||||
// TODO: does this location make sense?
|
||||
assertEquals(locations.iterator().next().getId(), "hpcloud-objectstorage");
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlobStore createClient(Function<HttpRequest, HttpResponse> fn, Module module, Properties props) {
|
Loading…
Reference in New Issue