removed CDN support for now

This commit is contained in:
Adrian Cole 2011-12-19 18:19:20 -08:00
parent aa99223558
commit 18e43fb6f4
16 changed files with 9 additions and 626 deletions

View File

@ -1,40 +0,0 @@
/**
* 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.object.storage;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Represents a component related to HP Cloud Services Content Delivery Network.
*
* @see <a href="https://manage.hpcloud.com/pages/build/docs/object-storage/api">HP Cloud Object Storage API</a>
* @author Jeremy Daggett
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface CDNManagement {
}

View File

@ -18,36 +18,22 @@
*/ */
package org.jclouds.hpcloud.object.storage; package org.jclouds.hpcloud.object.storage;
import java.net.URI;
import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD; import javax.ws.rs.HEAD;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT; import javax.ws.rs.PUT;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.core.MediaType;
import org.jclouds.blobstore.functions.ReturnNullOnContainerNotFound; import org.jclouds.blobstore.functions.ReturnNullOnContainerNotFound;
import org.jclouds.hpcloud.object.storage.domain.ContainerCDNMetadata;
import org.jclouds.hpcloud.object.storage.functions.ParseCDNUriFromHeaders;
import org.jclouds.hpcloud.object.storage.functions.ParseContainerCDNMetadataFromHeaders;
import org.jclouds.hpcloud.object.storage.functions.ParseContainerMetadataFromHeaders; import org.jclouds.hpcloud.object.storage.functions.ParseContainerMetadataFromHeaders;
import org.jclouds.hpcloud.object.storage.options.CreateContainerOptions; import org.jclouds.hpcloud.object.storage.options.CreateContainerOptions;
import org.jclouds.hpcloud.object.storage.options.ListCDNContainerOptions;
import org.jclouds.hpcloud.object.storage.reference.HPCloudObjectStorageHeaders;
import org.jclouds.openstack.filters.AuthenticateRequest; import org.jclouds.openstack.filters.AuthenticateRequest;
import org.jclouds.openstack.swift.CommonSwiftAsyncClient; import org.jclouds.openstack.swift.CommonSwiftAsyncClient;
import org.jclouds.openstack.swift.Storage; import org.jclouds.openstack.swift.Storage;
import org.jclouds.openstack.swift.domain.ContainerMetadata; import org.jclouds.openstack.swift.domain.ContainerMetadata;
import org.jclouds.rest.annotations.Endpoint; import org.jclouds.rest.annotations.Endpoint;
import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.Headers;
import org.jclouds.rest.annotations.QueryParams;
import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser; import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.SkipEncoding; import org.jclouds.rest.annotations.SkipEncoding;
@ -71,28 +57,6 @@ import com.google.common.util.concurrent.ListenableFuture;
@Endpoint(Storage.class) @Endpoint(Storage.class)
public interface HPCloudObjectStorageAsyncClient extends CommonSwiftAsyncClient { public interface HPCloudObjectStorageAsyncClient extends CommonSwiftAsyncClient {
/**
* @see HPCloudObjectStorageClient#listCDNContainers(ListCDNContainerOptions)
*/
@Beta
@GET
@Consumes(MediaType.APPLICATION_JSON)
@QueryParams(keys = "format", values = "json")
@Path("/")
@Endpoint(CDNManagement.class)
ListenableFuture<? extends Set<ContainerCDNMetadata>> listCDNContainers(ListCDNContainerOptions... options);
/**
* @see HPCloudObjectStorageClient#getCDNMetadata(String)
*/
@Beta
@HEAD
@ResponseParser(ParseContainerCDNMetadataFromHeaders.class)
@ExceptionParser(ReturnNullOnContainerNotFound.class)
@Path("/{container}")
@Endpoint(CDNManagement.class)
ListenableFuture<ContainerCDNMetadata> getCDNMetadata(@PathParam("container") String container);
/** /**
* @see HPCloudObjectStorageClient#getCDNMetadata(String) * @see HPCloudObjectStorageClient#getCDNMetadata(String)
*/ */
@ -111,48 +75,5 @@ public interface HPCloudObjectStorageAsyncClient extends CommonSwiftAsyncClient
ListenableFuture<Boolean> createContainer(@PathParam("container") String container, ListenableFuture<Boolean> createContainer(@PathParam("container") String container,
CreateContainerOptions... options); CreateContainerOptions... options);
/**
* @see HPCloudObjectStorageClient#enableCDN(String, long)
*/
@Beta
@PUT
@Path("/{container}")
@Headers(keys = HPCloudObjectStorageHeaders.CDN_ENABLED, values = "True")
@ResponseParser(ParseCDNUriFromHeaders.class)
@Endpoint(CDNManagement.class)
ListenableFuture<URI> enableCDN(@PathParam("container") String container,
@HeaderParam(HPCloudObjectStorageHeaders.CDN_TTL) long ttl);
/**
* @see HPCloudObjectStorageClient#enableCDN(String)
*/
@Beta
@PUT
@Path("/{container}")
@Headers(keys = HPCloudObjectStorageHeaders.CDN_ENABLED, values = "True")
@ResponseParser(ParseCDNUriFromHeaders.class)
@Endpoint(CDNManagement.class)
ListenableFuture<URI> enableCDN(@PathParam("container") String container);
/**
* @see HPCloudObjectStorageClient#updateCDN(String, long)
*/
@Beta
@POST
@Path("/{container}")
@ResponseParser(ParseCDNUriFromHeaders.class)
@Endpoint(CDNManagement.class)
ListenableFuture<URI> updateCDN(@PathParam("container") String container,
@HeaderParam(HPCloudObjectStorageHeaders.CDN_TTL) long ttl);
/**
* @see HPCloudObjectStorageClient#disableCDN(String)
*/
@Beta
@PUT
@Path("/{container}")
@Headers(keys = HPCloudObjectStorageHeaders.CDN_ENABLED, values = "False")
@Endpoint(CDNManagement.class)
ListenableFuture<Boolean> disableCDN(@PathParam("container") String container);
} }

View File

@ -18,19 +18,14 @@
*/ */
package org.jclouds.hpcloud.object.storage; package org.jclouds.hpcloud.object.storage;
import java.net.URI;
import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.Timeout; import org.jclouds.concurrent.Timeout;
import org.jclouds.hpcloud.object.storage.domain.ContainerCDNMetadata;
import org.jclouds.hpcloud.object.storage.options.CreateContainerOptions; import org.jclouds.hpcloud.object.storage.options.CreateContainerOptions;
import org.jclouds.hpcloud.object.storage.options.ListCDNContainerOptions;
import org.jclouds.openstack.swift.CommonSwiftClient; import org.jclouds.openstack.swift.CommonSwiftClient;
import org.jclouds.openstack.swift.domain.ContainerMetadata; import org.jclouds.openstack.swift.domain.ContainerMetadata;
import com.google.common.annotations.Beta;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
/** /**
@ -52,22 +47,4 @@ public interface HPCloudObjectStorageClient extends CommonSwiftClient {
ContainerMetadata getContainerMetadata(String container); ContainerMetadata getContainerMetadata(String container);
@Beta
Set<ContainerCDNMetadata> listCDNContainers(ListCDNContainerOptions... options);
@Beta
ContainerCDNMetadata getCDNMetadata(String container);
@Beta
URI enableCDN(String container, long ttl);
@Beta
URI enableCDN(String container);
@Beta
URI updateCDN(String container, long ttl);
@Beta
boolean disableCDN(String container);
} }

View File

@ -21,7 +21,6 @@ package org.jclouds.hpcloud.object.storage;
import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_API_VERSION;
import static org.jclouds.Constants.PROPERTY_ENDPOINT; import static org.jclouds.Constants.PROPERTY_ENDPOINT;
import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import static org.jclouds.Constants.PROPERTY_ISO3166_CODES;
import static org.jclouds.hpcloud.object.storage.reference.HPCloudObjectStorageConstants.PROPERTY_CDN_ENDPOINT;
import java.util.Properties; import java.util.Properties;
@ -43,13 +42,6 @@ public class HPCloudObjectStoragePropertiesBuilder extends SwiftPropertiesBuilde
properties.setProperty(PROPERTY_ISO3166_CODES, "US-NV"); properties.setProperty(PROPERTY_ISO3166_CODES, "US-NV");
properties.setProperty(PROPERTY_ENDPOINT, "https://region-a.geo-1.objects.hpcloudsvc.com/auth"); properties.setProperty(PROPERTY_ENDPOINT, "https://region-a.geo-1.objects.hpcloudsvc.com/auth");
properties.setProperty(PROPERTY_API_VERSION, OpenStackAuthAsyncClient.VERSION); properties.setProperty(PROPERTY_API_VERSION, OpenStackAuthAsyncClient.VERSION);
properties.setProperty(PROPERTY_CDN_ENDPOINT, "https://region-a.geo-1.cdnmgmt.hpcloudsvc.com");
return properties; return properties;
} }
protected HPCloudObjectStoragePropertiesBuilder withCDNEndpoint(String endpoint) {
properties.setProperty(PROPERTY_CDN_ENDPOINT, endpoint);
return this;
}
} }

View File

@ -29,15 +29,12 @@ import javax.inject.Singleton;
import org.jclouds.Constants; import org.jclouds.Constants;
import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.functions.BlobToHttpGetOptions; import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
import org.jclouds.blobstore.options.CreateContainerOptions;
import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata; import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata;
import org.jclouds.blobstore.util.BlobUtils; import org.jclouds.blobstore.util.BlobUtils;
import org.jclouds.collect.Memoized; import org.jclouds.collect.Memoized;
import org.jclouds.concurrent.Futures;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.hpcloud.object.storage.HPCloudObjectStorageAsyncClient; import org.jclouds.hpcloud.object.storage.HPCloudObjectStorageAsyncClient;
import org.jclouds.hpcloud.object.storage.HPCloudObjectStorageClient; import org.jclouds.hpcloud.object.storage.HPCloudObjectStorageClient;
import org.jclouds.hpcloud.object.storage.blobstore.functions.EnableCDNAndCache;
import org.jclouds.openstack.swift.blobstore.SwiftAsyncBlobStore; import org.jclouds.openstack.swift.blobstore.SwiftAsyncBlobStore;
import org.jclouds.openstack.swift.blobstore.functions.BlobStoreListContainerOptionsToListContainerOptions; import org.jclouds.openstack.swift.blobstore.functions.BlobStoreListContainerOptionsToListContainerOptions;
import org.jclouds.openstack.swift.blobstore.functions.BlobToObject; import org.jclouds.openstack.swift.blobstore.functions.BlobToObject;
@ -46,9 +43,7 @@ import org.jclouds.openstack.swift.blobstore.functions.ContainerToResourceMetada
import org.jclouds.openstack.swift.blobstore.functions.ObjectToBlob; import org.jclouds.openstack.swift.blobstore.functions.ObjectToBlob;
import org.jclouds.openstack.swift.blobstore.functions.ObjectToBlobMetadata; import org.jclouds.openstack.swift.blobstore.functions.ObjectToBlobMetadata;
import com.google.common.base.Function;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.util.concurrent.ListenableFuture;
/** /**
* *
@ -56,7 +51,6 @@ import com.google.common.util.concurrent.ListenableFuture;
*/ */
@Singleton @Singleton
public class HPCloudObjectStorageAsyncBlobStore extends SwiftAsyncBlobStore { public class HPCloudObjectStorageAsyncBlobStore extends SwiftAsyncBlobStore {
private final EnableCDNAndCache enableCDNAndCache;
@Inject @Inject
protected HPCloudObjectStorageAsyncBlobStore(BlobStoreContext context, BlobUtils blobUtils, protected HPCloudObjectStorageAsyncBlobStore(BlobStoreContext context, BlobUtils blobUtils,
@ -66,30 +60,10 @@ public class HPCloudObjectStorageAsyncBlobStore extends SwiftAsyncBlobStore {
BlobStoreListContainerOptionsToListContainerOptions container2ContainerListOptions, BlobStoreListContainerOptionsToListContainerOptions container2ContainerListOptions,
ContainerToResourceList container2ResourceList, ObjectToBlob object2Blob, BlobToObject blob2Object, ContainerToResourceList container2ResourceList, ObjectToBlob object2Blob, BlobToObject blob2Object,
ObjectToBlobMetadata object2BlobMd, BlobToHttpGetOptions blob2ObjectGetOptions, ObjectToBlobMetadata object2BlobMd, BlobToHttpGetOptions blob2ObjectGetOptions,
Provider<FetchBlobMetadata> fetchBlobMetadataProvider, EnableCDNAndCache enableCDNAndCache) { Provider<FetchBlobMetadata> fetchBlobMetadataProvider) {
super(context, blobUtils, service, defaultLocation, locations, sync, async, container2ResourceMd, super(context, blobUtils, service, defaultLocation, locations, sync, async, container2ResourceMd,
container2ContainerListOptions, container2ResourceList, object2Blob, blob2Object, object2BlobMd, container2ContainerListOptions, container2ResourceList, object2Blob, blob2Object, object2BlobMd,
blob2ObjectGetOptions, fetchBlobMetadataProvider); blob2ObjectGetOptions, fetchBlobMetadataProvider);
this.enableCDNAndCache = enableCDNAndCache;
} }
@Override
public ListenableFuture<Boolean> createContainerInLocation(Location location, final String container,
CreateContainerOptions options) {
ListenableFuture<Boolean> returnVal = createContainerInLocation(location, container);
if (options.isPublicRead())
return Futures.compose(createContainerInLocation(location, container), new Function<Boolean, Boolean>() {
@Override
public Boolean apply(Boolean input) {
if (Boolean.TRUE.equals(input)) {
return enableCDNAndCache.apply(container) != null;
}
return false;
}
}, service);
return returnVal;
}
} }

View File

@ -26,12 +26,10 @@ import javax.inject.Singleton;
import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.functions.BlobToHttpGetOptions; import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
import org.jclouds.blobstore.options.CreateContainerOptions;
import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata; import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata;
import org.jclouds.blobstore.util.BlobUtils; import org.jclouds.blobstore.util.BlobUtils;
import org.jclouds.collect.Memoized; import org.jclouds.collect.Memoized;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.hpcloud.object.storage.blobstore.functions.EnableCDNAndCache;
import org.jclouds.openstack.swift.CommonSwiftClient; import org.jclouds.openstack.swift.CommonSwiftClient;
import org.jclouds.openstack.swift.blobstore.SwiftBlobStore; import org.jclouds.openstack.swift.blobstore.SwiftBlobStore;
import org.jclouds.openstack.swift.blobstore.functions.BlobStoreListContainerOptionsToListContainerOptions; import org.jclouds.openstack.swift.blobstore.functions.BlobStoreListContainerOptionsToListContainerOptions;
@ -50,30 +48,16 @@ import com.google.common.base.Supplier;
@Singleton @Singleton
public class HPCloudObjectStorageBlobStore extends SwiftBlobStore { public class HPCloudObjectStorageBlobStore extends SwiftBlobStore {
private EnableCDNAndCache enableCDNAndCache;
@Inject @Inject
protected HPCloudObjectStorageBlobStore(BlobStoreContext context, BlobUtils blobUtils, Supplier<Location> defaultLocation, protected HPCloudObjectStorageBlobStore(BlobStoreContext context, BlobUtils blobUtils,
@Memoized Supplier<Set<? extends Location>> locations, CommonSwiftClient sync, Supplier<Location> defaultLocation, @Memoized Supplier<Set<? extends Location>> locations,
ContainerToResourceMetadata container2ResourceMd, CommonSwiftClient sync, ContainerToResourceMetadata container2ResourceMd,
BlobStoreListContainerOptionsToListContainerOptions container2ContainerListOptions, BlobStoreListContainerOptionsToListContainerOptions container2ContainerListOptions,
ContainerToResourceList container2ResourceList, ObjectToBlob object2Blob, BlobToObject blob2Object, ContainerToResourceList container2ResourceList, ObjectToBlob object2Blob, BlobToObject blob2Object,
ObjectToBlobMetadata object2BlobMd, BlobToHttpGetOptions blob2ObjectGetOptions, ObjectToBlobMetadata object2BlobMd, BlobToHttpGetOptions blob2ObjectGetOptions,
Provider<FetchBlobMetadata> fetchBlobMetadataProvider, EnableCDNAndCache enableCDNAndCache) { Provider<FetchBlobMetadata> fetchBlobMetadataProvider) {
super(context, blobUtils, defaultLocation, locations, sync, container2ResourceMd, container2ContainerListOptions, super(context, blobUtils, defaultLocation, locations, sync, container2ResourceMd, container2ContainerListOptions,
container2ResourceList, object2Blob, blob2Object, object2BlobMd, blob2ObjectGetOptions, container2ResourceList, object2Blob, blob2Object, object2BlobMd, blob2ObjectGetOptions,
fetchBlobMetadataProvider); fetchBlobMetadataProvider);
this.enableCDNAndCache = enableCDNAndCache;
}
@Override
public boolean createContainerInLocation(Location location, String container, CreateContainerOptions options) {
try {
return createContainerInLocation(location, container);
} finally {
if (options.isPublicRead())
enableCDNAndCache.apply(container);
}
} }
} }

View File

@ -18,74 +18,20 @@
*/ */
package org.jclouds.hpcloud.object.storage.blobstore.config; package org.jclouds.hpcloud.object.storage.blobstore.config;
import java.net.URI;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.hpcloud.object.storage.HPCloudObjectStorageClient;
import org.jclouds.hpcloud.object.storage.blobstore.HPCloudObjectStorageAsyncBlobStore; import org.jclouds.hpcloud.object.storage.blobstore.HPCloudObjectStorageAsyncBlobStore;
import org.jclouds.hpcloud.object.storage.blobstore.HPCloudObjectStorageBlobStore; import org.jclouds.hpcloud.object.storage.blobstore.HPCloudObjectStorageBlobStore;
import org.jclouds.hpcloud.object.storage.blobstore.functions.HPCloudObjectStorageObjectToBlobMetadata; import org.jclouds.hpcloud.object.storage.blobstore.functions.HPCloudObjectStorageObjectToBlobMetadata;
import org.jclouds.hpcloud.object.storage.domain.ContainerCDNMetadata;
import org.jclouds.http.HttpResponseException;
import org.jclouds.logging.Logger;
import org.jclouds.openstack.swift.blobstore.SwiftAsyncBlobStore; import org.jclouds.openstack.swift.blobstore.SwiftAsyncBlobStore;
import org.jclouds.openstack.swift.blobstore.SwiftBlobStore; import org.jclouds.openstack.swift.blobstore.SwiftBlobStore;
import org.jclouds.openstack.swift.blobstore.config.SwiftBlobStoreContextModule; import org.jclouds.openstack.swift.blobstore.config.SwiftBlobStoreContextModule;
import org.jclouds.openstack.swift.blobstore.functions.ObjectToBlobMetadata; import org.jclouds.openstack.swift.blobstore.functions.ObjectToBlobMetadata;
import com.google.common.annotations.Beta;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.inject.Provides;
/** /**
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
public class HPCloudObjectStorageBlobStoreContextModule extends SwiftBlobStoreContextModule { public class HPCloudObjectStorageBlobStoreContextModule extends SwiftBlobStoreContextModule {
@Beta
@Singleton
public static final class GetCDNMetadata extends CacheLoader<String, URI> {
@Resource
protected Logger logger = Logger.NULL;
private final HPCloudObjectStorageClient client;
@Inject
public GetCDNMetadata(HPCloudObjectStorageClient client) {
this.client = client;
}
@Override
public URI load(String container) {
try {
ContainerCDNMetadata md = client.getCDNMetadata(container);
return md != null ? md.getCDNUri() : null;
} catch (HttpResponseException e) {
// TODO: this is due to beta status
logger.trace("couldn't get cdn metadata for %s: %s", container, e.getMessage());
return null;
}
}
@Override
public String toString() {
return "getCDNMetadata()";
}
}
@Provides
@Singleton
protected LoadingCache<String, URI> cdnContainer(GetCDNMetadata loader) {
return CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.SECONDS).build(loader);
}
@Override @Override
protected void configure() { protected void configure() {
super.configure(); super.configure();

View File

@ -1,53 +0,0 @@
/**
* 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.object.storage.blobstore.functions;
import java.net.URI;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.hpcloud.object.storage.HPCloudObjectStorageClient;
import com.google.common.base.Function;
import com.google.common.cache.LoadingCache;
/**
*
* @author Adrian Cole
*/
@Singleton
public class EnableCDNAndCache implements Function<String, URI> {
private final LoadingCache<String, URI> cdnContainer;
private final HPCloudObjectStorageClient sync;
@Inject
public EnableCDNAndCache(HPCloudObjectStorageClient sync, LoadingCache<String, URI> cdnContainer) {
this.sync = sync;
this.cdnContainer = cdnContainer;
}
@Override
public URI apply(String input) {
URI uri = sync.enableCDN(input);
cdnContainer.put(input, uri);
return uri;
}
}

View File

@ -31,20 +31,16 @@ import org.jclouds.openstack.swift.domain.ObjectInfo;
*/ */
@Singleton @Singleton
public class HPCloudObjectStorageObjectToBlobMetadata extends ObjectToBlobMetadata { public class HPCloudObjectStorageObjectToBlobMetadata extends ObjectToBlobMetadata {
private final PublicUriForObjectInfo publicUriForObjectInfo;
@Inject @Inject
public HPCloudObjectStorageObjectToBlobMetadata(IfDirectoryReturnNameStrategy ifDirectoryReturnName, public HPCloudObjectStorageObjectToBlobMetadata(IfDirectoryReturnNameStrategy ifDirectoryReturnName) {
PublicUriForObjectInfo publicUriForObjectInfo) {
super(ifDirectoryReturnName); super(ifDirectoryReturnName);
this.publicUriForObjectInfo = publicUriForObjectInfo;
} }
public MutableBlobMetadata apply(ObjectInfo from) { public MutableBlobMetadata apply(ObjectInfo from) {
if (from == null) if (from == null)
return null; return null;
MutableBlobMetadata to = super.apply(from); MutableBlobMetadata to = super.apply(from);
to.setPublicUri(publicUriForObjectInfo.apply(from));
return to; return to;
} }
} }

View File

@ -1,63 +0,0 @@
/**
* 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.object.storage.blobstore.functions;
import java.net.URI;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import javax.ws.rs.core.UriBuilder;
import org.jclouds.openstack.swift.domain.ObjectInfo;
import com.google.common.base.Function;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
/**
* @author Adrian Cole
*/
@Singleton
public class PublicUriForObjectInfo implements Function<ObjectInfo, URI> {
private final LoadingCache<String, URI> cdnContainer;
private final Provider<UriBuilder> uriBuilders;
@Inject
public PublicUriForObjectInfo(LoadingCache<String, URI> cdnContainer, Provider<UriBuilder> uriBuilders) {
this.cdnContainer = cdnContainer;
this.uriBuilders = uriBuilders;
}
public URI apply(ObjectInfo from) {
if (from == null)
return null;
try {
return uriBuilders.get().uri(cdnContainer.getUnchecked(from.getContainer())).path(from.getName()).replaceQuery("")
.build();
} catch (CacheLoader.InvalidCacheLoadException e) {
// nulls not permitted from cache loader
return null;
} catch (NullPointerException e) {
// nulls not permitted from cache loader
// TODO this shouldn't occur when the above exception is reliably presented
return null;
}
}
}

View File

@ -18,19 +18,11 @@
*/ */
package org.jclouds.hpcloud.object.storage.config; package org.jclouds.hpcloud.object.storage.config;
import static org.jclouds.hpcloud.object.storage.reference.HPCloudObjectStorageConstants.PROPERTY_CDN_ENDPOINT;
import java.net.URI;
import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.jclouds.hpcloud.object.storage.CDNManagement;
import org.jclouds.hpcloud.object.storage.HPCloudObjectStorageAsyncClient; import org.jclouds.hpcloud.object.storage.HPCloudObjectStorageAsyncClient;
import org.jclouds.hpcloud.object.storage.HPCloudObjectStorageClient; import org.jclouds.hpcloud.object.storage.HPCloudObjectStorageClient;
import org.jclouds.http.RequiresHttp; import org.jclouds.http.RequiresHttp;
import org.jclouds.openstack.OpenStackAuthAsyncClient.AuthenticationResponse;
import org.jclouds.openstack.reference.AuthHeaders;
import org.jclouds.openstack.swift.CommonSwiftAsyncClient; import org.jclouds.openstack.swift.CommonSwiftAsyncClient;
import org.jclouds.openstack.swift.CommonSwiftClient; import org.jclouds.openstack.swift.CommonSwiftClient;
import org.jclouds.openstack.swift.config.BaseSwiftRestClientModule; import org.jclouds.openstack.swift.config.BaseSwiftRestClientModule;
@ -44,8 +36,9 @@ import com.google.inject.Provides;
*/ */
@ConfiguresRestClient @ConfiguresRestClient
@RequiresHttp @RequiresHttp
public class HPCloudObjectStorageRestClientModule extends BaseSwiftRestClientModule<HPCloudObjectStorageClient, HPCloudObjectStorageAsyncClient> { public class HPCloudObjectStorageRestClientModule extends
BaseSwiftRestClientModule<HPCloudObjectStorageClient, HPCloudObjectStorageAsyncClient> {
public HPCloudObjectStorageRestClientModule() { public HPCloudObjectStorageRestClientModule() {
super(HPCloudObjectStorageClient.class, HPCloudObjectStorageAsyncClient.class); super(HPCloudObjectStorageClient.class, HPCloudObjectStorageAsyncClient.class);
} }
@ -62,15 +55,4 @@ public class HPCloudObjectStorageRestClientModule extends BaseSwiftRestClientMod
return in; return in;
} }
@Provides
@Singleton
@CDNManagement
protected URI provideCDNUrl(AuthenticationResponse response, @Named(PROPERTY_CDN_ENDPOINT) String cdnEndpoint) {
if (response.getServices().get(AuthHeaders.CDN_MANAGEMENT_URL) == null) {
return URI.create(cdnEndpoint + response.getServices().get(AuthHeaders.STORAGE_URL).getPath());
}
// Placeholder for when the Object Storage service returns the CDN Management URL in the headers
return response.getServices().get(AuthHeaders.CDN_MANAGEMENT_URL);
}
} }

View File

@ -1,46 +0,0 @@
/**
* 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.object.storage.functions;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import org.jclouds.hpcloud.object.storage.reference.HPCloudObjectStorageHeaders;
import org.jclouds.http.HttpResponse;
import org.jclouds.openstack.swift.domain.AccountMetadata;
import com.google.common.base.Function;
/**
* This parses {@link AccountMetadata} from HTTP headers.
*
* @author James Murty
*/
public class ParseCDNUriFromHeaders implements Function<HttpResponse, URI> {
/**
* parses the http response headers to provide the CDN URI string.
*/
public URI apply(final HttpResponse from) {
String cdnUri = checkNotNull(from.getFirstHeaderOrNull(HPCloudObjectStorageHeaders.CDN_URI),
HPCloudObjectStorageHeaders.CDN_URI);
return URI.create(cdnUri);
}
}

View File

@ -1,74 +0,0 @@
/**
* 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.object.storage.functions;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Lists.newArrayList;
import java.net.URI;
import java.util.List;
import org.jclouds.hpcloud.object.storage.domain.ContainerCDNMetadata;
import org.jclouds.hpcloud.object.storage.reference.HPCloudObjectStorageHeaders;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.jclouds.openstack.swift.domain.AccountMetadata;
import org.jclouds.rest.InvocationContext;
import com.google.common.base.Function;
import com.google.common.base.Splitter;
/**
* This parses {@link AccountMetadata} from HTTP headers.
*
* @author James Murty
*/
public class ParseContainerCDNMetadataFromHeaders implements
Function<HttpResponse, ContainerCDNMetadata>, InvocationContext<ParseContainerCDNMetadataFromHeaders> {
private HttpRequest request;
/**
* parses the http response headers to create a new {@link ContainerCDNMetadata} object.
*/
public ContainerCDNMetadata apply(final HttpResponse from) {
String cdnUri = checkNotNull(from.getFirstHeaderOrNull(HPCloudObjectStorageHeaders.CDN_URI),
HPCloudObjectStorageHeaders.CDN_URI);
String cdnTTL = checkNotNull(from.getFirstHeaderOrNull(HPCloudObjectStorageHeaders.CDN_TTL),
HPCloudObjectStorageHeaders.CDN_TTL);
String cdnEnabled = checkNotNull(from.getFirstHeaderOrNull(HPCloudObjectStorageHeaders.CDN_ENABLED),
HPCloudObjectStorageHeaders.CDN_ENABLED);
if (cdnUri == null) {
// CDN is not enabled for this container.
return null;
} else {
// just need the name from the path
List<String> parts = newArrayList(Splitter.on('/').split(request.getEndpoint().getPath()));
return new ContainerCDNMetadata(parts.get(parts.size()-1), Boolean
.parseBoolean(cdnEnabled), Long.parseLong(cdnTTL), URI.create(cdnUri));
}
}
@Override
public ParseContainerCDNMetadataFromHeaders setContext(HttpRequest request) {
this.request = request;
return this;
}
}

View File

@ -26,9 +26,4 @@ package org.jclouds.hpcloud.object.storage.reference;
*/ */
public interface HPCloudObjectStorageConstants { public interface HPCloudObjectStorageConstants {
/**
* The CDN Endpoint property
*/
public static final String PROPERTY_CDN_ENDPOINT = "jclouds.hpcloud-object-storage.cdn.endpoint";
} }

View File

@ -29,12 +29,5 @@ import org.jclouds.openstack.swift.reference.SwiftHeaders;
* *
*/ */
public interface HPCloudObjectStorageHeaders extends SwiftHeaders { public interface HPCloudObjectStorageHeaders extends SwiftHeaders {
public static final String CDN_ENABLED = "X-Cdn-Enabled";
public static final String CDN_LOG_RETENTION = "X-Log-Retention";
public static final String CDN_REFERRER_ACL = "X-Referrer-ACL";
public static final String CDN_TTL = "X-Ttl";
public static final String CDN_URI = "X-Cdn-Uri";
public static final String CDN_USER_AGENT_ACL = "X-User-Agent-ACL";
} }

View File

@ -19,13 +19,7 @@
package org.jclouds.hpcloud.object.storage; package org.jclouds.hpcloud.object.storage;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.net.URI;
import java.util.Set;
import org.jclouds.hpcloud.object.storage.domain.ContainerCDNMetadata;
import org.jclouds.hpcloud.object.storage.options.ListCDNContainerOptions;
import org.jclouds.openstack.swift.CommonSwiftClientLiveTest; import org.jclouds.openstack.swift.CommonSwiftClientLiveTest;
import org.jclouds.openstack.swift.domain.SwiftObject; import org.jclouds.openstack.swift.domain.SwiftObject;
import org.testng.annotations.Test; import org.testng.annotations.Test;
@ -47,99 +41,4 @@ public class HPCloudObjectStorageClientLiveTest extends CommonSwiftClientLiveTes
assertEquals(getBlob.getInfo().getContentType(), "application/x-www-form-urlencoded"); assertEquals(getBlob.getInfo().getContentType(), "application/x-www-form-urlencoded");
} }
// CDN service due to go live Q1 2012
@Test(enabled = false)
public void testCDNOperations() throws Exception {
final long minimumTTL = 60 * 60; // The minimum TTL is 1 hour
// Create two new containers for testing
final String containerNameWithCDN = getContainerName();
final String containerNameWithoutCDN = getContainerName();
try {
try {
getApi().disableCDN(containerNameWithCDN);
getApi().disableCDN(containerNameWithoutCDN);
} catch (Exception e) {
e.printStackTrace();
}
ContainerCDNMetadata cdnMetadata = null;
// Enable CDN with PUT for one container
final URI cdnUri = getApi().enableCDN(containerNameWithCDN);
assertTrue(cdnUri != null);
// Confirm CDN is enabled via HEAD request and has default TTL
cdnMetadata = getApi().getCDNMetadata(containerNameWithCDN);
assertTrue(cdnMetadata.isCDNEnabled());
assertEquals(cdnMetadata.getCDNUri(), cdnUri);
cdnMetadata = getApi().getCDNMetadata(containerNameWithoutCDN);
assert cdnMetadata == null || !cdnMetadata.isCDNEnabled() : containerNameWithoutCDN
+ " should not have metadata";
assert getApi().getCDNMetadata("DoesNotExist") == null;
// List CDN metadata for containers, and ensure all CDN info is
// available for enabled
// container
Set<ContainerCDNMetadata> cdnMetadataList = getApi().listCDNContainers();
assertTrue(cdnMetadataList.size() >= 1);
final long initialTTL = cdnMetadata.getTTL();
assertTrue(cdnMetadataList.contains(new ContainerCDNMetadata(containerNameWithCDN, true, initialTTL, cdnUri)));
/*
* Test listing with options FIXFIX cdnMetadataList =
* getApi().listCDNContainers(ListCDNContainerOptions.Builder.enabledOnly());
* assertTrue(Iterables.all(cdnMetadataList, new Predicate<ContainerCDNMetadata>() { public
* boolean apply(ContainerCDNMetadata cdnMetadata) { return cdnMetadata.isCDNEnabled(); }
* }));
*/
cdnMetadataList = getApi().listCDNContainers(
ListCDNContainerOptions.Builder.afterMarker(
containerNameWithCDN.substring(0, containerNameWithCDN.length() - 1)).maxResults(1));
assertEquals(cdnMetadataList.size(), 1);
// Enable CDN with PUT for the same container, this time with a custom
// TTL
long ttl = 4000;
getApi().enableCDN(containerNameWithCDN, ttl);
cdnMetadata = getApi().getCDNMetadata(containerNameWithCDN);
assertTrue(cdnMetadata.isCDNEnabled());
assertEquals(cdnMetadata.getTTL(), ttl);
// Check POST by updating TTL settings
ttl = minimumTTL;
getApi().updateCDN(containerNameWithCDN, minimumTTL);
cdnMetadata = getApi().getCDNMetadata(containerNameWithCDN);
assertTrue(cdnMetadata.isCDNEnabled());
assertEquals(cdnMetadata.getTTL(), minimumTTL);
// Confirm that minimum allowed value for TTL is 3600, lower values are
// ignored.
getApi().updateCDN(containerNameWithCDN, 3599L);
cdnMetadata = getApi().getCDNMetadata(containerNameWithCDN);
assertEquals(cdnMetadata.getTTL(), 3599L);
// Disable CDN with POST
assertTrue(getApi().disableCDN(containerNameWithCDN));
cdnMetadata = getApi().getCDNMetadata(containerNameWithCDN);
assertEquals(cdnMetadata.isCDNEnabled(), false);
} catch (Exception e) {
e.printStackTrace();
} finally {
recycleContainer(containerNameWithCDN);
recycleContainer(containerNameWithoutCDN);
}
}
} }