implemented nearly all drive functions for elastichosts

This commit is contained in:
Adrian Cole 2010-11-21 17:58:49 +01:00
parent f7fe6aedc9
commit 6ee0b3548d
30 changed files with 2298 additions and 43 deletions

View File

@ -22,14 +22,20 @@ package org.jclouds.elastichosts;
import java.util.Set; import java.util.Set;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST;
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 javax.ws.rs.core.MediaType;
import org.jclouds.elastichosts.handlers.NewlineDelimitedStringHandler; import org.jclouds.elastichosts.binders.BindCreateDriveRequestToPlainTextString;
import org.jclouds.elastichosts.domain.CreateDriveRequest;
import org.jclouds.elastichosts.domain.DriveInfo;
import org.jclouds.elastichosts.functions.KeyValuesDelimitedByBlankLinesToDriveInfo;
import org.jclouds.elastichosts.functions.ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet;
import org.jclouds.elastichosts.functions.SplitNewlines;
import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser; import org.jclouds.rest.annotations.ResponseParser;
@ -49,31 +55,55 @@ import com.google.common.util.concurrent.ListenableFuture;
@RequestFilters(BasicAuthentication.class) @RequestFilters(BasicAuthentication.class)
@Consumes(MediaType.TEXT_PLAIN) @Consumes(MediaType.TEXT_PLAIN)
public interface ElasticHostsAsyncClient { public interface ElasticHostsAsyncClient {
/*
* TODO: define interface methods for ElasticHosts
*/
/** /**
* @see ElasticHostsClient#listDrives() * @see ElasticHostsClient#listDrives()
*/ */
@GET @GET
@Path("/drives/list") @Path("/drives/list")
@ResponseParser(NewlineDelimitedStringHandler.class) @ResponseParser(SplitNewlines.class)
ListenableFuture<Set<String>> listDrives(); ListenableFuture<Set<String>> listDrives();
/** /**
* @see ElasticHostsClient#get(long) * @see ElasticHostsClient#listStandardDrives()
*/
@GET
@Path("/drives/standard/list")
@ResponseParser(SplitNewlines.class)
ListenableFuture<Set<String>> listStandardDrives();
/**
* @see ElasticHostsClient#listDriveInfo()
*/
@GET
@Path("/drives/info")
@ResponseParser(ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet.class)
ListenableFuture<Set<DriveInfo>> listDriveInfo();
/**
* @see ElasticHostsClient#getDriveInfo
*/ */
@GET @GET
@ExceptionParser(ReturnNullOnNotFoundOr404.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class)
@ResponseParser(KeyValuesDelimitedByBlankLinesToDriveInfo.class)
@Path("/drives/{uuid}/info") @Path("/drives/{uuid}/info")
ListenableFuture<String> getDriveInfo(@PathParam("uuid") String uuid); ListenableFuture<DriveInfo> getDriveInfo(@PathParam("uuid") String uuid);
/** /**
* @see ElasticHostsClient#delete * @see ElasticHostsClient#createDrive
*/ */
@DELETE @POST
@Path("/drives/{uuid}") @ExceptionParser(ReturnNullOnNotFoundOr404.class)
@ResponseParser(KeyValuesDelimitedByBlankLinesToDriveInfo.class)
@Path("/drives/create")
ListenableFuture<DriveInfo> createDrive(
@BinderParam(BindCreateDriveRequestToPlainTextString.class) CreateDriveRequest createDrive);
/**
* @see ElasticHostsClient#deleteDrive
*/
@POST
@Path("/drives/{uuid}/destroy")
@ExceptionParser(ReturnVoidOnNotFoundOr404.class) @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
ListenableFuture<Void> deleteDrive(@PathParam("uuid") String uuid); ListenableFuture<Void> destroyDrive(@PathParam("uuid") String uuid);
} }

View File

@ -23,6 +23,8 @@ import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.Timeout; import org.jclouds.concurrent.Timeout;
import org.jclouds.elastichosts.domain.CreateDriveRequest;
import org.jclouds.elastichosts.domain.DriveInfo;
/** /**
* Provides synchronous access to ElasticHosts. * Provides synchronous access to ElasticHosts.
@ -35,17 +37,48 @@ import org.jclouds.concurrent.Timeout;
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS) @Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
public interface ElasticHostsClient { public interface ElasticHostsClient {
/** /**
* list of drive uuids * list of drive uuids in your account
* *
* @return or empty set if no drives are found * @return or empty set if no drives are found
*/ */
Set<String> listDrives(); Set<String> listDrives();
/** /**
* list of drive uuids that are in the library
*
* @return or empty set if no drives are found
*/
Set<String> listStandardDrives();
/**
* Get all drives info
*
* @return or empty set if no drives are found
*/
Set<DriveInfo> listDriveInfo();
/**
* @param uuid
* what to get
* @return null, if not found * @return null, if not found
*/ */
String getDriveInfo(String uuid); DriveInfo getDriveInfo(String uuid);
void deleteDrive(String uuid); /**
* create a new drive
*
* @param createDrive
* required parameters: name, size
* @return newly created drive
*/
DriveInfo createDrive(CreateDriveRequest createDrive);
/**
* Destroy a drive
*
* @param uuid
* what to delete
*/
void destroyDrive(String uuid);
} }

View File

@ -0,0 +1,61 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.binders;
import static com.google.common.base.Preconditions.checkArgument;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.core.MediaType;
import org.jclouds.elastichosts.domain.CreateDriveRequest;
import org.jclouds.elastichosts.functions.CreateDriveRequestToMap;
import org.jclouds.elastichosts.functions.ListOfMapsToListOfKeyValuesDelimitedByBlankLines;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.Binder;
import com.google.common.collect.ImmutableSet;
/**
*
* @author Adrian Cole
*/
@Singleton
public class BindCreateDriveRequestToPlainTextString implements Binder {
private final CreateDriveRequestToMap createDriveRequestToMap;
private final ListOfMapsToListOfKeyValuesDelimitedByBlankLines listOfMapsToListOfKeyValuesDelimitedByBlankLines;
@Inject
public BindCreateDriveRequestToPlainTextString(CreateDriveRequestToMap createDriveRequestToMap,
ListOfMapsToListOfKeyValuesDelimitedByBlankLines listOfMapsToListOfKeyValuesDelimitedByBlankLines) {
this.createDriveRequestToMap = createDriveRequestToMap;
this.listOfMapsToListOfKeyValuesDelimitedByBlankLines = listOfMapsToListOfKeyValuesDelimitedByBlankLines;
}
public void bindToRequest(HttpRequest request, Object payload) {
checkArgument(payload instanceof CreateDriveRequest, "this binder is only valid for CreateDriveRequest!");
CreateDriveRequest create = CreateDriveRequest.class.cast(payload);
Map<String, String> map = createDriveRequestToMap.apply(create);
request.setPayload(listOfMapsToListOfKeyValuesDelimitedByBlankLines.apply(ImmutableSet.of(map)));
request.getPayload().getContentMetadata().setContentType(MediaType.TEXT_PLAIN);
}
}

View File

@ -0,0 +1,57 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.domain;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* either 'exclusive' (the default) or 'shared' to allow multiple servers to access a drive
* simultaneously
*
* @author Adrian Cole
*/
public enum ClaimType {
/**
*
*/
EXCLUSIVE,
/**
* allow multiple servers to access a drive simultaneously
*/
SHARED, UNRECOGNIZED;
public String value() {
return name().toLowerCase();
}
@Override
public String toString() {
return value();
}
public static ClaimType fromValue(String claim) {
try {
return valueOf(checkNotNull(claim, "claim").toUpperCase());
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}

View File

@ -0,0 +1,125 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
import org.jclouds.elastichosts.domain.internal.BaseDrive;
import com.google.common.collect.ImmutableSet;
/**
*
* @author Adrian Cole
*/
public class CreateDriveRequest extends BaseDrive {
public static class Builder extends BaseDrive.Builder {
private Set<String> avoid = ImmutableSet.of();
public Builder avoid(Iterable<String> avoid) {
this.avoid = ImmutableSet.copyOf(checkNotNull(avoid, "avoid"));
return this;
}
/**
* {@inheritDoc}
*/
@Override
public Builder claimType(ClaimType claimType) {
return Builder.class.cast(super.claimType(claimType));
}
/**
* {@inheritDoc}
*/
@Override
public Builder encryptionCipher(String encryptionCipher) {
return Builder.class.cast(super.encryptionCipher(encryptionCipher));
}
/**
* {@inheritDoc}
*/
@Override
public Builder name(String name) {
return Builder.class.cast(super.name(name));
}
/**
* {@inheritDoc}
*/
@Override
public Builder readers(Iterable<String> readers) {
return Builder.class.cast(super.readers(readers));
}
/**
* {@inheritDoc}
*/
@Override
public Builder size(long size) {
return Builder.class.cast(super.size(size));
}
/**
* {@inheritDoc}
*/
@Override
public Builder tags(Iterable<String> tags) {
return Builder.class.cast(super.tags(tags));
}
/**
* {@inheritDoc}
*/
@Override
public Builder userMetadata(Map<String, String> userMetadata) {
return Builder.class.cast(super.userMetadata(userMetadata));
}
public CreateDriveRequest build() {
return new CreateDriveRequest(name, size, claimType, readers, tags, userMetadata, encryptionCipher, avoid);
}
}
private final Set<String> avoid;
public CreateDriveRequest(String name, long size, @Nullable ClaimType claimType, Iterable<String> readers,
Iterable<String> tags, Map<String, String> userMetadata, @Nullable String encryptionCipher,
Iterable<String> avoid) {
super(name, size, claimType, readers, tags, userMetadata, encryptionCipher);
this.avoid = ImmutableSet.copyOf(checkNotNull(avoid, "avoid"));
}
/**
*
* @return list of existing drives to ensure this new drive is created on physical different
* hardware than those existing drives
*/
public Set<String> getAvoid() {
return avoid;
}
}

View File

@ -0,0 +1,567 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
import org.jclouds.elastichosts.domain.internal.BaseDrive;
import com.google.common.collect.ImmutableSet;
/**
*
* @author Adrian Cole
*/
public class DriveInfo extends BaseDrive {
public static class Builder extends BaseDrive.Builder {
private DriveStatus status;
private String user;
private Boolean autoexpanding;
private Integer bits;
private Set<String> claimed = ImmutableSet.of();
private String description;
private String uuid;
private Set<String> driveType = ImmutableSet.of();
private String encryptionKey;
private Boolean free;
private String imaging;
private String installNotes;
private String os;
private Long readBytes;
private Long readRequests;
private DriveType type;
private URI url;
private Set<String> use = ImmutableSet.of();
private Long writeBytes;
private Long writeRequests;
public Builder status(DriveStatus status) {
this.status = status;
return this;
}
public Builder user(String user) {
this.user = user;
return this;
}
public Builder autoexpanding(Boolean autoexpanding) {
this.autoexpanding = autoexpanding;
return this;
}
public Builder bits(Integer bits) {
this.bits = bits;
return this;
}
public Builder claimed(Iterable<String> claimed) {
this.claimed = ImmutableSet.copyOf(checkNotNull(claimed, "claimed"));
return this;
}
public Builder description(String description) {
this.description = description;
return this;
}
public Builder uuid(String uuid) {
this.uuid = uuid;
return this;
}
public Builder driveType(Iterable<String> driveType) {
this.driveType = ImmutableSet.copyOf(checkNotNull(driveType, "driveType"));
return this;
}
public Builder encryptionKey(String encryptionKey) {
this.encryptionKey = encryptionKey;
return this;
}
public Builder free(Boolean free) {
this.free = free;
return this;
}
public Builder imaging(String imaging) {
this.imaging = imaging;
return this;
}
public Builder installNotes(String installNotes) {
this.installNotes = installNotes;
return this;
}
public Builder os(String os) {
this.os = os;
return this;
}
public Builder readBytes(Long readBytes) {
this.readBytes = readBytes;
return this;
}
public Builder readRequests(Long readRequests) {
this.readRequests = readRequests;
return this;
}
public Builder type(DriveType type) {
this.type = type;
return this;
}
public Builder url(URI url) {
this.url = url;
return this;
}
public Builder use(Iterable<String> use) {
this.use = ImmutableSet.copyOf(checkNotNull(use, "use"));
return this;
}
public Builder writeBytes(Long writeBytes) {
this.writeBytes = writeBytes;
return this;
}
public Builder writeRequests(Long writeRequests) {
this.writeRequests = writeRequests;
return this;
}
/**
* {@inheritDoc}
*/
@Override
public Builder claimType(ClaimType claimType) {
return Builder.class.cast(super.claimType(claimType));
}
/**
* {@inheritDoc}
*/
@Override
public Builder encryptionCipher(String encryptionCipher) {
return Builder.class.cast(super.encryptionCipher(encryptionCipher));
}
/**
* {@inheritDoc}
*/
@Override
public Builder name(String name) {
return Builder.class.cast(super.name(name));
}
/**
* {@inheritDoc}
*/
@Override
public Builder readers(Iterable<String> readers) {
return Builder.class.cast(super.readers(readers));
}
/**
* {@inheritDoc}
*/
@Override
public Builder size(long size) {
return Builder.class.cast(super.size(size));
}
/**
* {@inheritDoc}
*/
@Override
public Builder tags(Iterable<String> tags) {
return Builder.class.cast(super.tags(tags));
}
/**
* {@inheritDoc}
*/
@Override
public Builder userMetadata(Map<String, String> userMetadata) {
return Builder.class.cast(super.userMetadata(userMetadata));
}
/**
* {@inheritDoc}
*/
@Override
public DriveInfo build() {
return new DriveInfo(status, user, autoexpanding, bits, claimed, claimType, description, uuid, driveType,
encryptionCipher, encryptionKey, free, imaging, installNotes, name, os, readers, readBytes,
readRequests, size, tags, type, url, use, userMetadata, writeBytes, writeRequests);
}
}
private final DriveStatus status;
private final String user;
@Nullable
private final Boolean autoexpanding;
@Nullable
private final Integer bits;
private final Set<String> claimed;
@Nullable
private final String description;
@Nullable
private final String uuid;
@Nullable
private final Set<String> driveType;
@Nullable
private final String encryptionKey;
@Nullable
private final Boolean free;
@Nullable
private final String imaging;
@Nullable
private final String installNotes;
@Nullable
private final String os;
@Nullable
private final Long readBytes;
@Nullable
private final Long readRequests;
@Nullable
private final DriveType type;
@Nullable
private final URI url;
@Nullable
private final Set<String> use;
@Nullable
private final Long writeBytes;
@Nullable
private final Long writeRequests;
public DriveInfo(DriveStatus status, String user, Boolean autoexpanding, Integer bits, Iterable<String> claimed,
ClaimType claimType, String description, String drive, Iterable<String> driveType, String encryptionCipher,
String encryptionKey, Boolean free, String imaging, String installNotes, String name, String os,
Iterable<String> readers, Long readBytes, Long readRequests, Long size, Iterable<String> tags, DriveType type,
URI url, Iterable<String> use, Map<String, String> userMetadata, Long writeBytes, Long writeRequests) {
super(name, size, claimType, readers, tags, userMetadata, encryptionCipher);
this.status = status;
this.user = user;
this.autoexpanding = autoexpanding;
this.bits = bits;
this.claimed = ImmutableSet.copyOf(claimed);
this.description = description;
this.uuid = drive;
this.driveType = ImmutableSet.copyOf(driveType);
this.encryptionKey = encryptionKey;
this.free = free;
this.imaging = imaging;
this.installNotes = installNotes;
this.os = os;
this.readBytes = readBytes;
this.readRequests = readRequests;
this.type = type;
this.url = url;
this.use = ImmutableSet.copyOf(use);
this.writeBytes = writeBytes;
this.writeRequests = writeRequests;
}
/**
*
* @return current status of the drive
*/
public DriveStatus getStatus() {
return status;
}
/**
*
* @return owner of the drive
*/
public String getUser() {
return user;
}
// TODO
public Boolean getAutoexpanding() {
return autoexpanding;
}
// TODO
public Integer getBits() {
return bits;
}
/**
*
* @return if drive is in use by a server, values are the server uuids
*/
public Set<String> getClaimed() {
return claimed;
}
// TODO
public String getDescription() {
return description;
}
/**
*
* @return uuid of the drive.
*/
public String getUuid() {
return uuid;
}
// TODO
public Set<String> getDriveType() {
return driveType;
}
// TODO
public String getEncryptionKey() {
return encryptionKey;
}
// TODO
public Boolean getFree() {
return free;
}
/**
*
* @return percentage completed of drive imaging if this is underway, or 'queued' if waiting for
* another imaging operation to complete first
*/
public String getImaging() {
return imaging;
}
// TODO
public String getInstallNotes() {
return installNotes;
}
// TODO
public String getOs() {
return os;
}
/**
*
* @return Cumulative i/o byte/request count for each drive
*/
public Long getReadBytes() {
return readBytes;
}
/**
*
* @return Cumulative i/o byte/request count for each drive
*/
public Long getReadRequests() {
return readRequests;
}
// TODO
public DriveType getType() {
return type;
}
// TODO
public URI getUrl() {
return url;
}
// TODO is this the same as tags?
public Set<String> getUse() {
return use;
}
/**
*
* @return Cumulative i/o byte/request count for each drive
*/
public Long getWriteBytes() {
return writeBytes;
}
/**
*
* @return Cumulative i/o byte/request count for each drive
*/
public Long getWriteRequests() {
return writeRequests;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((autoexpanding == null) ? 0 : autoexpanding.hashCode());
result = prime * result + ((bits == null) ? 0 : bits.hashCode());
result = prime * result + ((claimed == null) ? 0 : claimed.hashCode());
result = prime * result + ((description == null) ? 0 : description.hashCode());
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
result = prime * result + ((driveType == null) ? 0 : driveType.hashCode());
result = prime * result + ((encryptionKey == null) ? 0 : encryptionKey.hashCode());
result = prime * result + ((free == null) ? 0 : free.hashCode());
result = prime * result + ((imaging == null) ? 0 : imaging.hashCode());
result = prime * result + ((installNotes == null) ? 0 : installNotes.hashCode());
result = prime * result + ((os == null) ? 0 : os.hashCode());
result = prime * result + ((readBytes == null) ? 0 : readBytes.hashCode());
result = prime * result + ((readRequests == null) ? 0 : readRequests.hashCode());
result = prime * result + ((status == null) ? 0 : status.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((url == null) ? 0 : url.hashCode());
result = prime * result + ((use == null) ? 0 : use.hashCode());
result = prime * result + ((user == null) ? 0 : user.hashCode());
result = prime * result + ((writeBytes == null) ? 0 : writeBytes.hashCode());
result = prime * result + ((writeRequests == null) ? 0 : writeRequests.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
DriveInfo other = (DriveInfo) obj;
if (autoexpanding == null) {
if (other.autoexpanding != null)
return false;
} else if (!autoexpanding.equals(other.autoexpanding))
return false;
if (bits == null) {
if (other.bits != null)
return false;
} else if (!bits.equals(other.bits))
return false;
if (claimed == null) {
if (other.claimed != null)
return false;
} else if (!claimed.equals(other.claimed))
return false;
if (description == null) {
if (other.description != null)
return false;
} else if (!description.equals(other.description))
return false;
if (uuid == null) {
if (other.uuid != null)
return false;
} else if (!uuid.equals(other.uuid))
return false;
if (driveType == null) {
if (other.driveType != null)
return false;
} else if (!driveType.equals(other.driveType))
return false;
if (encryptionKey == null) {
if (other.encryptionKey != null)
return false;
} else if (!encryptionKey.equals(other.encryptionKey))
return false;
if (free == null) {
if (other.free != null)
return false;
} else if (!free.equals(other.free))
return false;
if (imaging == null) {
if (other.imaging != null)
return false;
} else if (!imaging.equals(other.imaging))
return false;
if (installNotes == null) {
if (other.installNotes != null)
return false;
} else if (!installNotes.equals(other.installNotes))
return false;
if (os == null) {
if (other.os != null)
return false;
} else if (!os.equals(other.os))
return false;
if (readBytes == null) {
if (other.readBytes != null)
return false;
} else if (!readBytes.equals(other.readBytes))
return false;
if (readRequests == null) {
if (other.readRequests != null)
return false;
} else if (!readRequests.equals(other.readRequests))
return false;
if (status != other.status)
return false;
if (type != other.type)
return false;
if (url == null) {
if (other.url != null)
return false;
} else if (!url.equals(other.url))
return false;
if (use == null) {
if (other.use != null)
return false;
} else if (!use.equals(other.use))
return false;
if (user == null) {
if (other.user != null)
return false;
} else if (!user.equals(other.user))
return false;
if (writeBytes == null) {
if (other.writeBytes != null)
return false;
} else if (!writeBytes.equals(other.writeBytes))
return false;
if (writeRequests == null) {
if (other.writeRequests != null)
return false;
} else if (!writeRequests.equals(other.writeRequests))
return false;
return true;
}
@Override
public String toString() {
return "[name=" + name + ", size=" + size + ", claimType=" + claimType + ", readers=" + readers + ", tags="
+ tags + ", userMetadata=" + userMetadata + ", encryptionCipher=" + encryptionCipher + ", status=" + status
+ ", user=" + user + ", autoexpanding=" + autoexpanding + ", bits=" + bits + ", claimed=" + claimed
+ ", description=" + description + ", drive=" + uuid + ", driveType=" + driveType + ", encryptionKey="
+ encryptionKey + ", free=" + free + ", imaging=" + imaging + ", installNotes=" + installNotes + ", os="
+ os + ", readBytes=" + readBytes + ", readRequests=" + readRequests + ", type=" + type + ", url=" + url
+ ", use=" + use + ", writeBytes=" + writeBytes + ", writeRequests=" + writeRequests + "]";
}
}

View File

@ -0,0 +1,48 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.domain;
import static com.google.common.base.Preconditions.checkNotNull;
/**
*
* @author Adrian Cole
*/
public enum DriveStatus {
ACTIVE, INACTIVE, COPYING, IMAGING, UNRECOGNIZED;
public String value() {
return name().toString();
}
@Override
public String toString() {
return value();
}
public static DriveStatus fromValue(String status) {
try {
return valueOf(checkNotNull(status, "status").toUpperCase());
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}

View File

@ -0,0 +1,48 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.domain;
import static com.google.common.base.Preconditions.checkNotNull;
/**
*
* @author Adrian Cole
*/
public enum DriveType {
DISK, CDROM, SHARED, UNRECOGNIZED;
public String value() {
return name().toString();
}
@Override
public String toString() {
return value();
}
public static DriveType fromValue(String type) {
try {
return valueOf(checkNotNull(type, "type").toUpperCase());
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}

View File

@ -0,0 +1,230 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.domain.internal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
import org.jclouds.elastichosts.domain.ClaimType;
import com.google.common.collect.ImmutableSet;
import com.google.inject.internal.util.ImmutableMap;
/**
*
* @author Adrian Cole
*/
public class BaseDrive {
public static class Builder {
protected String name;
protected long size;
protected ClaimType claimType = ClaimType.EXCLUSIVE;
protected Set<String> readers = ImmutableSet.of();
protected Set<String> tags = ImmutableSet.of();
protected Map<String, String> userMetadata = ImmutableMap.of();
@Nullable
protected String encryptionCipher;
public Builder claimType(ClaimType claimType) {
this.claimType = claimType;
return this;
}
public Builder encryptionCipher(String encryptionCipher) {
this.encryptionCipher = encryptionCipher;
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder readers(Iterable<String> readers) {
this.readers = ImmutableSet.copyOf(checkNotNull(readers, "readers"));
return this;
}
public Builder size(long size) {
this.size = size;
return this;
}
public Builder tags(Iterable<String> tags) {
this.tags = ImmutableSet.copyOf(checkNotNull(tags, "tags"));
return this;
}
public Builder userMetadata(Map<String, String> userMetadata) {
this.userMetadata = ImmutableMap.copyOf(checkNotNull(userMetadata, "userMetadata"));
return this;
}
public BaseDrive build() {
return new BaseDrive(name, size, claimType, readers, tags, userMetadata, encryptionCipher);
}
}
protected final String name;
protected final long size;
protected final ClaimType claimType;
protected final Set<String> readers;
protected final Set<String> tags;
protected final Map<String, String> userMetadata;
@Nullable
protected final String encryptionCipher;
public BaseDrive(String name, long size, @Nullable ClaimType claimType, Iterable<String> readers,
Iterable<String> tags, Map<String, String> userMetadata, @Nullable String encryptionCipher) {
this.name = checkNotNull(name, "name");
this.size = size;
this.claimType = checkNotNull(claimType, "set claimType to exclusive, not null");
this.readers = ImmutableSet.copyOf(checkNotNull(readers, "readers"));
this.tags = ImmutableSet.copyOf(checkNotNull(tags, "tags"));
this.userMetadata = ImmutableMap.copyOf(checkNotNull(userMetadata, "userMetadata"));
this.encryptionCipher = encryptionCipher;
}
/**
*
* @return either 'exclusive' (the default) or 'shared' to allow multiple servers to access a
* drive simultaneously
*/
@Nullable
public ClaimType getClaimType() {
return claimType;
}
/**
*
* @return either 'none' or 'aes-xts-plain' (the default)
*/
@Nullable
public String getEncryptionCipher() {
return encryptionCipher;
}
/**
*
* @return Drive name
*/
public String getName() {
return name;
}
/**
*
* @return list of users allowed to read from a drive or 'ffffffff-ffff-ffff-ffff-ffffffffffff'
* for all users
*/
public Set<String> getReaders() {
return readers;
}
/**
*
* @return size of drive in bytes
*/
public long getSize() {
return size;
}
/**
*
* @return list of tags
*/
public Set<String> getTags() {
return tags;
}
/**
*
* @return user-defined KEY VALUE pairs
*/
public Map<String, String> getUserMetadata() {
return userMetadata;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((claimType == null) ? 0 : claimType.hashCode());
result = prime * result + ((encryptionCipher == null) ? 0 : encryptionCipher.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((readers == null) ? 0 : readers.hashCode());
result = prime * result + (int) (size ^ (size >>> 32));
result = prime * result + ((tags == null) ? 0 : tags.hashCode());
result = prime * result + ((userMetadata == null) ? 0 : userMetadata.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
BaseDrive other = (BaseDrive) obj;
if (claimType != other.claimType)
return false;
if (encryptionCipher == null) {
if (other.encryptionCipher != null)
return false;
} else if (!encryptionCipher.equals(other.encryptionCipher))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (readers == null) {
if (other.readers != null)
return false;
} else if (!readers.equals(other.readers))
return false;
if (size != other.size)
return false;
if (tags == null) {
if (other.tags != null)
return false;
} else if (!tags.equals(other.tags))
return false;
if (userMetadata == null) {
if (other.userMetadata != null)
return false;
} else if (!userMetadata.equals(other.userMetadata))
return false;
return true;
}
@Override
public String toString() {
return "[name=" + name + ", size=" + size + ", claimType=" + claimType + ", readers=" + readers + ", tags="
+ tags + ", userMetadata=" + userMetadata + ", encryptionCipher=" + encryptionCipher + "]";
}
}

View File

@ -0,0 +1,60 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Singleton;
import org.jclouds.elastichosts.domain.ClaimType;
import org.jclouds.elastichosts.domain.internal.BaseDrive;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
/**
*
* @author Adrian Cole
*/
@Singleton
public class BaseDriveToMap implements Function<BaseDrive, Map<String, String>> {
@Override
public Map<String, String> apply(BaseDrive from) {
checkNotNull(from, "drive");
ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
builder.put("name", from.getName());
builder.put("size", from.getSize() + "");
if (from.getClaimType() != ClaimType.EXCLUSIVE)
builder.put("claim:type", from.getClaimType().toString());
if (from.getReaders().size() != 0)
builder.put("readers", Joiner.on(' ').join(from.getReaders()));
if (from.getTags().size() != 0)
builder.put("tags", Joiner.on(' ').join(from.getTags()));
for (Entry<String, String> entry : from.getUserMetadata().entrySet())
builder.put("user:" + entry.getKey(), entry.getValue());
if (from.getEncryptionCipher() != null)
builder.put("encryption:cipher", from.getEncryptionCipher());
return builder.build();
}
}

View File

@ -0,0 +1,54 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.elastichosts.domain.CreateDriveRequest;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
/**
*
* @author Adrian Cole
*/
@Singleton
public class CreateDriveRequestToMap implements Function<CreateDriveRequest, Map<String, String>> {
private final BaseDriveToMap baseDriveToMap;
@Inject
public CreateDriveRequestToMap(BaseDriveToMap baseDriveToMap) {
this.baseDriveToMap = baseDriveToMap;
}
@Override
public Map<String, String> apply(CreateDriveRequest from) {
ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
builder.putAll(baseDriveToMap.apply(from));
if (from.getAvoid().size() != 0)
builder.put("avoid", Joiner.on(' ').join(from.getAvoid()));
return builder.build();
}
}

View File

@ -0,0 +1,47 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import java.util.Set;
import javax.inject.Singleton;
import org.jclouds.elastichosts.domain.DriveInfo;
import org.jclouds.http.HttpResponse;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
/**
*
* @author Adrian Cole
*/
@Singleton
public class KeyValuesDelimitedByBlankLinesToDriveInfo implements Function<HttpResponse, DriveInfo> {
ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet setParser;
@Override
public DriveInfo apply(HttpResponse response) {
Set<DriveInfo> drives = setParser.apply(response);
if (drives.size() == 0)
return null;
return Iterables.get(drives, 0);
}
}

View File

@ -0,0 +1,60 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.elastichosts.domain.DriveInfo;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.ReturnStringIf2xx;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
/**
*
* @author Adrian Cole
*/
@Singleton
public class ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet implements Function<HttpResponse, Set<DriveInfo>> {
private final ReturnStringIf2xx returnStringIf200;
private final ListOfKeyValuesDelimitedByBlankLinesToListOfMaps mapConverter;
private final MapToDriveInfo mapToDrive;
@Inject
ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet(ReturnStringIf2xx returnStringIf200,
ListOfKeyValuesDelimitedByBlankLinesToListOfMaps mapConverter, MapToDriveInfo mapToDrive) {
this.returnStringIf200 = returnStringIf200;
this.mapConverter = mapConverter;
this.mapToDrive = mapToDrive;
}
@Override
public Set<DriveInfo> apply(HttpResponse response) {
String text = returnStringIf200.apply(response);
if (text == null || text.trim().equals(""))
return ImmutableSet.<DriveInfo> of();
return ImmutableSet.copyOf(Iterables.transform(mapConverter.apply(text), mapToDrive));
}
}

View File

@ -0,0 +1,59 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import java.util.List;
import java.util.Map;
import javax.inject.Singleton;
import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
/**
*
* @author Adrian Cole
*/
@Singleton
public class ListOfKeyValuesDelimitedByBlankLinesToListOfMaps implements Function<String, List<Map<String, String>>> {
@Override
public List<Map<String, String>> apply(String from) {
List<Map<String, String>> maps = Lists.newArrayList();
for (String listOfKeyValues : Splitter.on("\n\n").split(from)) {
if (!"".equals(listOfKeyValues)) {
Map<String, String> map = Maps.newLinkedHashMap();
for (String keyValueLine : Splitter.on('\n').split(listOfKeyValues)) {
if (!"".equals(keyValueLine)) {
int firstIndex = keyValueLine.indexOf(' ');
String key = keyValueLine.substring(0, firstIndex);
String value = keyValueLine.substring(firstIndex + 1).replace("\\n", "\n");
map.put(key, value);
}
}
if (map.size() != 0)
maps.add(map);
}
}
return maps;
}
}

View File

@ -0,0 +1,58 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import java.util.Map;
import javax.inject.Singleton;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
/**
*
* @author Adrian Cole
*/
@Singleton
public class ListOfMapsToListOfKeyValuesDelimitedByBlankLines implements
Function<Iterable<Map<String, String>>, String> {
@Override
public String apply(Iterable<Map<String, String>> from) {
return Joiner.on("\n\n").join(Iterables.transform(from, new Function<Map<String, String>, String>() {
@Override
public String apply(Map<String, String> from) {
return Joiner.on('\n').withKeyValueSeparator(" ")
.join(Maps.transformValues(from, new Function<String, String>() {
@Override
public String apply(String from) {
return from.replace("\n", "\\n");
}
}));
}
}));
}
}

View File

@ -0,0 +1,96 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import java.net.URI;
import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Singleton;
import org.jclouds.elastichosts.domain.ClaimType;
import org.jclouds.elastichosts.domain.DriveInfo;
import org.jclouds.elastichosts.domain.DriveStatus;
import org.jclouds.elastichosts.domain.DriveType;
import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.Maps;
/**
*
* @author Adrian Cole
*/
@Singleton
public class MapToDriveInfo implements Function<Map<String, String>, DriveInfo> {
@Override
public DriveInfo apply(Map<String, String> from) {
if (from.size() == 0)
return null;
DriveInfo.Builder builder = new DriveInfo.Builder();
if (from.containsKey("status"))
builder.status(DriveStatus.fromValue(from.get("status")));
if (from.containsKey("use"))
builder.use(Splitter.on(',').split(from.get("use")));
builder.name(from.get("name"));
if (from.containsKey("bits"))
builder.bits(new Integer(from.get("bits")));
if (from.containsKey("url"))
builder.url(URI.create(from.get("url")));
if (from.containsKey("read:bytes"))
builder.readBytes(new Long(from.get("read:bytes")));
if (from.containsKey("read:requests"))
builder.readRequests(new Long(from.get("read:requests")));
builder.user(from.get("user"));
builder.encryptionCipher(from.get("encryption:cipher"));
builder.encryptionKey(from.get("encryption:key"));
builder.description(from.get("description"));
builder.uuid(from.get("drive"));
builder.installNotes(from.get("install_notes"));
builder.os(from.get("os"));
if (from.containsKey("write:bytes"))
builder.writeBytes(new Long(from.get("write:bytes")));
if (from.containsKey("write:requests"))
builder.writeRequests(new Long(from.get("write:requests")));
if (from.containsKey("claim:type"))
builder.claimType(ClaimType.fromValue(from.get("claim:type")));
if (from.containsKey("claimed"))
builder.claimed(Splitter.on(' ').split(from.get("claimed")));
if (from.containsKey("drive_type"))
builder.driveType(Splitter.on(',').split(from.get("drive_type")));
if (from.containsKey("autoexpanding"))
builder.autoexpanding(new Boolean(from.get("autoexpanding")));
if (from.containsKey("readers"))
builder.readers(Splitter.on(' ').split(from.get("readers")));
if (from.containsKey("free"))
builder.free(new Boolean(from.get("free")));
if (from.containsKey("type"))
builder.type(DriveType.fromValue(from.get("type")));
if (from.containsKey("size"))
builder.size(new Long(from.get("size")));
Map<String, String> metadata = Maps.newLinkedHashMap();
for (Entry<String, String> entry : from.entrySet()) {
if (entry.getKey().startsWith("user:"))
metadata.put(entry.getKey().substring(entry.getKey().indexOf(':') + 1), entry.getValue());
}
builder.userMetadata(metadata);
return builder.build();
}
}

View File

@ -17,7 +17,7 @@
* ==================================================================== * ====================================================================
*/ */
package org.jclouds.elastichosts.handlers; package org.jclouds.elastichosts.functions;
import java.util.Set; import java.util.Set;
@ -36,11 +36,11 @@ import com.google.common.collect.Sets;
* @author Adrian Cole * @author Adrian Cole
*/ */
@Singleton @Singleton
public class NewlineDelimitedStringHandler implements Function<HttpResponse, Set<String>> { public class SplitNewlines implements Function<HttpResponse, Set<String>> {
private final ReturnStringIf2xx returnStringIf200; private final ReturnStringIf2xx returnStringIf200;
@Inject @Inject
NewlineDelimitedStringHandler(ReturnStringIf2xx returnStringIf200) { SplitNewlines(ReturnStringIf2xx returnStringIf200) {
this.returnStringIf200 = returnStringIf200; this.returnStringIf200 = returnStringIf200;
} }

View File

@ -25,11 +25,13 @@ import static org.testng.Assert.assertEquals;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import org.jclouds.elastichosts.handlers.NewlineDelimitedStringHandler; import org.jclouds.elastichosts.domain.CreateDriveRequest;
import org.jclouds.elastichosts.functions.KeyValuesDelimitedByBlankLinesToDriveInfo;
import org.jclouds.elastichosts.functions.ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet;
import org.jclouds.elastichosts.functions.SplitNewlines;
import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpRequest;
import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.http.functions.ReleasePayloadAndReturn; import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.functions.ReturnStringIf2xx;
import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestClientTest;
import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.RestContextSpec;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
@ -64,11 +66,12 @@ public class ElasticHostsAsyncClientTest extends RestClientTest<ElasticHostsAsyn
assertRequestLineEquals(httpRequest, "GET https://api.elastichosts.com/drives/list HTTP/1.1"); assertRequestLineEquals(httpRequest, "GET https://api.elastichosts.com/drives/list HTTP/1.1");
// for example, using basic authentication, we should get "only one" // for example, using basic authentication, we should get "only one"
// header // header
assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\nAuthorization: Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==\n"); assertNonPayloadHeadersEqual(httpRequest,
"Accept: text/plain\nAuthorization: Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==\n");
assertPayloadEquals(httpRequest, null, null, false); assertPayloadEquals(httpRequest, null, null, false);
// TODO: insert expected response class, which probably extends ParseJson // TODO: insert expected response class, which probably extends ParseJson
assertResponseParserClassEquals(method, httpRequest, NewlineDelimitedStringHandler.class); assertResponseParserClassEquals(method, httpRequest, SplitNewlines.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null); assertExceptionParserClassEquals(method, null);
@ -76,6 +79,36 @@ public class ElasticHostsAsyncClientTest extends RestClientTest<ElasticHostsAsyn
} }
public void testListStandardDrives() throws SecurityException, NoSuchMethodException, IOException {
Method method = ElasticHostsAsyncClient.class.getMethod("listStandardDrives");
GeneratedHttpRequest<ElasticHostsAsyncClient> httpRequest = processor.createRequest(method);
assertRequestLineEquals(httpRequest, "GET https://api.elastichosts.com/drives/standard/list HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, SplitNewlines.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(httpRequest);
}
public void testListDriveInfo() throws SecurityException, NoSuchMethodException, IOException {
Method method = ElasticHostsAsyncClient.class.getMethod("listDriveInfo");
GeneratedHttpRequest<ElasticHostsAsyncClient> httpRequest = processor.createRequest(method);
assertRequestLineEquals(httpRequest, "GET https://api.elastichosts.com/drives/info HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(httpRequest);
}
public void testGetDriveInfo() throws SecurityException, NoSuchMethodException, IOException { public void testGetDriveInfo() throws SecurityException, NoSuchMethodException, IOException {
Method method = ElasticHostsAsyncClient.class.getMethod("getDriveInfo", String.class); Method method = ElasticHostsAsyncClient.class.getMethod("getDriveInfo", String.class);
GeneratedHttpRequest<ElasticHostsAsyncClient> httpRequest = processor.createRequest(method, "uuid"); GeneratedHttpRequest<ElasticHostsAsyncClient> httpRequest = processor.createRequest(method, "uuid");
@ -84,21 +117,36 @@ public class ElasticHostsAsyncClientTest extends RestClientTest<ElasticHostsAsyn
assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n"); assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
assertPayloadEquals(httpRequest, null, null, false); assertPayloadEquals(httpRequest, null, null, false);
// TODO: insert expected response class, which probably extends ParseJson assertResponseParserClassEquals(method, httpRequest, KeyValuesDelimitedByBlankLinesToDriveInfo.class);
assertResponseParserClassEquals(method, httpRequest, ReturnStringIf2xx.class);
assertSaxResponseParserClassEquals(method, null); assertSaxResponseParserClassEquals(method, null);
// note that get methods should convert 404's to null
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
checkFilters(httpRequest); checkFilters(httpRequest);
} }
public void testDeleteDrive() throws SecurityException, NoSuchMethodException, IOException { public void testCreateDrive() throws SecurityException, NoSuchMethodException, IOException {
Method method = ElasticHostsAsyncClient.class.getMethod("deleteDrive", String.class); Method method = ElasticHostsAsyncClient.class.getMethod("createDrive", CreateDriveRequest.class);
GeneratedHttpRequest<ElasticHostsAsyncClient> httpRequest = processor.createRequest(method,
new CreateDriveRequest.Builder().name("foo").size(10000l).build());
assertRequestLineEquals(httpRequest, "POST https://api.elastichosts.com/drives/create HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
assertPayloadEquals(httpRequest, "name foo\nsize 10000", "text/plain", false);
assertResponseParserClassEquals(method, httpRequest, KeyValuesDelimitedByBlankLinesToDriveInfo.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testDestroyDrive() throws SecurityException, NoSuchMethodException, IOException {
Method method = ElasticHostsAsyncClient.class.getMethod("destroyDrive", String.class);
GeneratedHttpRequest<ElasticHostsAsyncClient> httpRequest = processor.createRequest(method, "uuid"); GeneratedHttpRequest<ElasticHostsAsyncClient> httpRequest = processor.createRequest(method, "uuid");
assertRequestLineEquals(httpRequest, "DELETE https://api.elastichosts.com/drives/uuid HTTP/1.1"); assertRequestLineEquals(httpRequest, "POST https://api.elastichosts.com/drives/uuid/destroy HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n"); assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
assertPayloadEquals(httpRequest, null, null, false); assertPayloadEquals(httpRequest, null, null, false);

View File

@ -22,19 +22,24 @@ package org.jclouds.elastichosts;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.rest.RestContextFactory.contextSpec; import static org.jclouds.rest.RestContextFactory.contextSpec;
import static org.jclouds.rest.RestContextFactory.createContext; import static org.jclouds.rest.RestContextFactory.createContext;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNotNull;
import java.util.Properties; import java.util.Properties;
import java.util.Set; import java.util.Set;
import org.jclouds.Constants; import org.jclouds.Constants;
import org.jclouds.elastichosts.domain.CreateDriveRequest;
import org.jclouds.elastichosts.domain.DriveInfo;
import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.logging.log4j.config.Log4JLoggingModule;
import org.jclouds.rest.RestContext; import org.jclouds.rest.RestContext;
import org.testng.annotations.AfterGroups; import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups; import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.inject.Module; import com.google.inject.Module;
/** /**
@ -45,7 +50,7 @@ import com.google.inject.Module;
@Test(groups = "live", testName = "elastichosts.ElasticHostsClientLiveTest") @Test(groups = "live", testName = "elastichosts.ElasticHostsClientLiveTest")
public class ElasticHostsClientLiveTest { public class ElasticHostsClientLiveTest {
private ElasticHostsClient connection; private ElasticHostsClient client;
private RestContext<ElasticHostsClient, ElasticHostsAsyncClient> context; private RestContext<ElasticHostsClient, ElasticHostsAsyncClient> context;
protected String provider = "elastichosts"; protected String provider = "elastichosts";
@ -85,7 +90,7 @@ public class ElasticHostsClientLiveTest {
(Class) ElasticHostsContextBuilder.class, ImmutableSet.<Module> of(new Log4JLoggingModule())), (Class) ElasticHostsContextBuilder.class, ImmutableSet.<Module> of(new Log4JLoggingModule())),
overrides); overrides);
connection = context.getApi(); client = context.getApi();
} }
@AfterGroups(groups = "live") @AfterGroups(groups = "live")
@ -96,15 +101,67 @@ public class ElasticHostsClientLiveTest {
@Test @Test
public void testListDrives() throws Exception { public void testListDrives() throws Exception {
Set<String> drives = connection.listDrives(); Set<String> drives = client.listDrives();
assertNotNull(drives);
}
@Test
public void testListDriveInfo() throws Exception {
Set<DriveInfo> drives = client.listDriveInfo();
assertNotNull(drives);
}
@Test
public void testListStandardDrives() throws Exception {
Set<String> drives = client.listStandardDrives();
assertNotNull(drives); assertNotNull(drives);
} }
@Test @Test
public void testGetDrive() throws Exception { public void testGetDrive() throws Exception {
Set<String> drives = connection.listDrives(); for (String driveUUID : client.listDrives()) {
for (String driveUUID : drives) { assertNotNull(client.getDriveInfo(driveUUID));
assertNotNull(connection.getDriveInfo(driveUUID)); }
for (String driveUUID : client.listStandardDrives()) {
assertNotNull(client.getDriveInfo(driveUUID));
} }
} }
private String prefix = System.getProperty("user.name") + ".test";
@Test
public void testCreateDestroy() throws Exception {
try {
findAndDestroyDrive();
} catch (Exception e) {
}
String uuid = null;
try {
DriveInfo info = client.createDrive(new CreateDriveRequest.Builder().name(prefix).size(1024 * 1024l).build());
assertNotNull(uuid = info.getUuid());
assertEquals(info.getName(), prefix);
assertEquals(info.getSize(), 1024 * 1024l);
assertEquals(info, client.getDriveInfo(info.getUuid()));
} finally {
findAndDestroyDrive();
}
if (uuid != null)
assertEquals(client.getDriveInfo(uuid), null);
}
protected void findAndDestroyDrive() {
DriveInfo drive = Iterables.find(client.listDriveInfo(), new Predicate<DriveInfo>() {
@Override
public boolean apply(DriveInfo input) {
return input.getName().equals(prefix);
}
});
client.destroyDrive(drive.getUuid());
}
} }

View File

@ -0,0 +1,75 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.binders;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
import java.net.URI;
import javax.ws.rs.core.MediaType;
import org.jclouds.elastichosts.domain.ClaimType;
import org.jclouds.elastichosts.domain.CreateDriveRequest;
import org.jclouds.http.HttpRequest;
import org.jclouds.util.Utils;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Guice;
/**
*
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class BindCreateDriveRequestToPlainTextStringTest {
private static final BindCreateDriveRequestToPlainTextString FN = Guice.createInjector().getInstance(
BindCreateDriveRequestToPlainTextString.class);
public void testSimple() {
HttpRequest request = new HttpRequest("POST", URI.create("https://host/drives/create"));
FN.bindToRequest(request, new CreateDriveRequest.Builder().name("foo").size(100l).build());
assertEquals(request.getPayload().getContentMetadata().getContentType(), MediaType.TEXT_PLAIN);
assertEquals(request.getPayload().getRawContent(), "name foo\nsize 100");
}
public void testComplete() throws IOException {
CreateDriveRequest input = new CreateDriveRequest.Builder()
.name("Ubuntu 10.10 Server Edition Linux 64bit Preinstalled System")
//
.size(8589934592l)//
.claimType(ClaimType.SHARED)//
.readers(ImmutableSet.of("ffffffff-ffff-ffff-ffff-ffffffffffff"))//
.tags(ImmutableSet.of("tag1", "tag2")).userMetadata(ImmutableMap.of("foo", "bar", "baz", "raz"))//
.encryptionCipher("aes-xts-plain").avoid(ImmutableSet.of("avoid1")).build();
HttpRequest request = new HttpRequest("POST", URI.create("https://host/drives/create"));
FN.bindToRequest(request, input);
assertEquals(request.getPayload().getContentMetadata().getContentType(), MediaType.TEXT_PLAIN);
assertEquals(request.getPayload().getRawContent(),
Utils.toStringAndClose(BindCreateDriveRequestToPlainTextStringTest.class
.getResourceAsStream("/create_drive.txt")));
}
}

View File

@ -0,0 +1,65 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
import org.jclouds.elastichosts.domain.ClaimType;
import org.jclouds.elastichosts.domain.internal.BaseDrive;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
/**
*
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class BaseDriveToMapTest {
private static final BaseDriveToMap BASEDRIVE_TO_MAP = new BaseDriveToMap();
public void testBasics() {
assertEquals(BASEDRIVE_TO_MAP.apply(new BaseDrive.Builder().name("foo").size(100l).build()),
ImmutableMap.of("name", "foo", "size", "100"));
}
public void testComplete() throws IOException {
BaseDrive one = new BaseDrive.Builder().name("Ubuntu 10.10 Server Edition Linux 64bit Preinstalled System")
//
.size(8589934592l)//
.claimType(ClaimType.SHARED)//
.readers(ImmutableSet.of("ffffffff-ffff-ffff-ffff-ffffffffffff"))//
.tags(ImmutableSet.of("tag1", "tag2")).userMetadata(ImmutableMap.of("foo", "bar", "baz", "raz"))//
.encryptionCipher("aes-xts-plain").build();
assertEquals(
BASEDRIVE_TO_MAP.apply(one),
ImmutableMap.builder().put("name", "Ubuntu 10.10 Server Edition Linux 64bit Preinstalled System")
.put("size", "8589934592").put("claim:type", "shared")
.put("readers", "ffffffff-ffff-ffff-ffff-ffffffffffff").put("tags", "tag1 tag2")
.put("user:foo", "bar").put("user:baz", "raz").put("encryption:cipher", "aes-xts-plain").build()
);
}
}

View File

@ -0,0 +1,69 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
import org.jclouds.elastichosts.domain.ClaimType;
import org.jclouds.elastichosts.domain.CreateDriveRequest;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Guice;
/**
*
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class CreateDriveRequestToMapTest {
private static final CreateDriveRequestToMap BASEDRIVE_TO_MAP = Guice.createInjector().getInstance(
CreateDriveRequestToMap.class);
public void testBasics() {
assertEquals(BASEDRIVE_TO_MAP.apply(new CreateDriveRequest.Builder().name("foo").size(100l).build()),
ImmutableMap.of("name", "foo", "size", "100"));
}
public void testComplete() throws IOException {
CreateDriveRequest one = new CreateDriveRequest.Builder()
.name("Ubuntu 10.10 Server Edition Linux 64bit Preinstalled System")
//
.size(8589934592l)//
.claimType(ClaimType.SHARED)//
.readers(ImmutableSet.of("ffffffff-ffff-ffff-ffff-ffffffffffff"))//
.tags(ImmutableSet.of("tag1", "tag2")).userMetadata(ImmutableMap.of("foo", "bar", "baz", "raz"))//
.encryptionCipher("aes-xts-plain").avoid(ImmutableSet.of("avoid1")).build();
assertEquals(
BASEDRIVE_TO_MAP.apply(one),
ImmutableMap.builder().put("name", "Ubuntu 10.10 Server Edition Linux 64bit Preinstalled System")
.put("size", "8589934592").put("claim:type", "shared")
.put("readers", "ffffffff-ffff-ffff-ffff-ffffffffffff").put("tags", "tag1 tag2")
.put("user:foo", "bar").put("user:baz", "raz").put("encryption:cipher", "aes-xts-plain")
.put("avoid", "avoid1").build()
);
}
}

View File

@ -0,0 +1,52 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import static org.testng.Assert.assertEquals;
import org.jclouds.elastichosts.domain.DriveInfo;
import org.jclouds.http.HttpResponse;
import org.jclouds.io.Payloads;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Guice;
/**
*
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSetTest {
private static final ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet FN = Guice.createInjector().getInstance(
ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet.class);
public void testNone() {
assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newStringPayload(""))), ImmutableSet.<DriveInfo> of());
assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newStringPayload("\n\n"))), ImmutableSet.<DriveInfo> of());
assertEquals(FN.apply(new HttpResponse(200, "", null)), ImmutableSet.<DriveInfo> of());
}
public void testOne() {
assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newInputStreamPayload(MapToDriveInfoTest.class
.getResourceAsStream("/drive.txt")))), ImmutableSet.<DriveInfo> of(MapToDriveInfoTest.ONE));
}
}

View File

@ -0,0 +1,66 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
/**
*
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class ListOfKeyValuesDelimitedByBlankLinesToListOfMapsTest {
private static final ListOfKeyValuesDelimitedByBlankLinesToListOfMaps FN = new ListOfKeyValuesDelimitedByBlankLinesToListOfMaps();
public void testNone() {
assertEquals(FN.apply(""), Lists.newArrayList());
assertEquals(FN.apply("\n\n\n"), Lists.newArrayList());
}
public void testOneMap() {
assertEquals(FN.apply("key1 value1\nkey2 value2"),
ImmutableList.of(ImmutableMap.of("key1", "value1", "key2", "value2")));
assertEquals(FN.apply("key1 value1\nkey2 value2\n\n"),
ImmutableList.of(ImmutableMap.of("key1", "value1", "key2", "value2")));
}
public void testValueEncodesNewlines() {
assertEquals(FN.apply("key1 value1\\n\nkey2 value2"),
ImmutableList.of(ImmutableMap.of("key1", "value1\n", "key2", "value2")));
}
public void testTwoMaps() {
assertEquals(
FN.apply("key1 value1\nkey2 value2\n\nkey1 v1\nkey2 v2"),
ImmutableList.of(ImmutableMap.of("key1", "value1", "key2", "value2"),
ImmutableMap.of("key1", "v1", "key2", "v2")));
assertEquals(
FN.apply("key1 value1\nkey2 value2\n\nkey1 v1\nkey2 v2\n\n"),
ImmutableList.of(ImmutableMap.of("key1", "value1", "key2", "value2"),
ImmutableMap.of("key1", "v1", "key2", "v2")));
}
}

View File

@ -0,0 +1,60 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import static org.testng.Assert.assertEquals;
import java.util.Map;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
/**
*
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class ListOfMapsToListOfKeyValuesDelimitedByBlankLinesTest {
private static final ListOfMapsToListOfKeyValuesDelimitedByBlankLines FN = new ListOfMapsToListOfKeyValuesDelimitedByBlankLines();
public void testNone() {
assertEquals(FN.apply(ImmutableList.<Map<String, String>> of()), "");
}
public void testOneMap() {
assertEquals(
FN.apply(ImmutableList.<Map<String, String>> of(ImmutableMap.of("key1", "value1", "key2", "value2"))),
"key1 value1\nkey2 value2");
}
public void testValueEncodesNewlines() {
assertEquals(
FN.apply(ImmutableList.<Map<String, String>> of(ImmutableMap.of("key1", "value1\n", "key2", "value2"))),
"key1 value1\\n\nkey2 value2");
}
public void testTwoMaps() {
assertEquals(FN.apply(ImmutableList.<Map<String, String>> of(ImmutableMap.of("key1", "value1", "key2", "value2"),
ImmutableMap.of("key1", "v1", "key2", "v2"))), "key1 value1\nkey2 value2\n\nkey1 v1\nkey2 v2");
}
}

View File

@ -0,0 +1,95 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.elastichosts.functions;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
import java.net.URI;
import java.util.Map;
import org.jclouds.elastichosts.domain.ClaimType;
import org.jclouds.elastichosts.domain.DriveInfo;
import org.jclouds.elastichosts.domain.DriveStatus;
import org.jclouds.elastichosts.domain.DriveType;
import org.jclouds.util.Utils;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
/**
*
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class MapToDriveInfoTest {
public static DriveInfo ONE = new DriveInfo.Builder()
.status(DriveStatus.ACTIVE)
.use(ImmutableSet.of("networking", "security", "gateway"))
.name("Ubuntu 10.10 Server Edition Linux 64bit Preinstalled System")
.bits(64)
.url(URI.create("http://www.ubuntu.com"))
.readBytes(4096l)
.user("58ca3c1f-7629-4771-9b71-863f40153ba4")
.encryptionCipher("aes-xts-plain")
.encryptionKey("ba6c2a4897072e9f25920ed73bd522e9c10d89f30a215158cccf8d0f654ac643")
.description("The Ubuntu Linux distribution brings the spirit of Ubuntu to the software world.")
.uuid("b8171d28-755a-4271-b891-7998871a160e")
.installNotes("first line\n\n")
.os("linux")
.writeBytes(8589938688l)
.claimType(ClaimType.SHARED)
.claimed(
ImmutableSet.of(
"00109617-2c6b-424b-9cfa-5b572c17bafe:guest:692cd1c7-a863-4a22-8170-fc6e6feb68af:ide:0:0",
"00031836-a624-4b22-bc7d-41ff8977087b:guest:a1414360-7c24-4730-8c97-180bf7775a71:ide:0:0",
"0002c6df-a1d2-4d1d-96f0-f95405a28183:guest:386f1cc7-affc-49c1-82a5-2f8e412170e4:ide:0:0",
"00031836-a624-4b22-bc7d-41ff8977087b:guest:17b076be-430d-4a76-9df3-b9896fec82a5:ide:0:0",
"000663ee-9fb6-4461-90f6-01327a4aff07:guest:f83b519f-feab-42cf-859c-f61495681ada:ide:0:1"))//
.driveType(ImmutableSet.of("installcd", "livecd"))//
.autoexpanding(false).readers(ImmutableSet.of("ffffffff-ffff-ffff-ffff-ffffffffffff"))//
.readRequests(1l)//
.free(true)//
.type(DriveType.DISK)//
.writeRequests(2097153l)//
.size(8589934592l)//
.userMetadata(ImmutableMap.of("foo", "bar", "baz", "raz")).build();
private static final MapToDriveInfo MAP_TO_DRIVE = new MapToDriveInfo();
public void testEmptyMapReturnsNull() {
assertEquals(MAP_TO_DRIVE.apply(ImmutableMap.<String, String> of()), null);
}
public void testBasics() {
DriveInfo expects = new DriveInfo.Builder().name("foo").size(100l).build();
assertEquals(MAP_TO_DRIVE.apply(ImmutableMap.of("name", "foo", "size", "100")), expects);
}
public void testComplete() throws IOException {
Map<String, String> input = new ListOfKeyValuesDelimitedByBlankLinesToListOfMaps().apply(
Utils.toStringAndClose(MapToDriveInfoTest.class.getResourceAsStream("/drive.txt"))).get(0);
assertEquals(MAP_TO_DRIVE.apply(input), ONE);
}
}

View File

@ -17,14 +17,14 @@
* ==================================================================== * ====================================================================
*/ */
package org.jclouds.elastichosts; package org.jclouds.elastichosts.functions;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import java.io.InputStream; import java.io.InputStream;
import java.util.Set; import java.util.Set;
import org.jclouds.elastichosts.handlers.NewlineDelimitedStringHandler; import org.jclouds.elastichosts.functions.SplitNewlines;
import org.jclouds.http.HttpResponse; import org.jclouds.http.HttpResponse;
import org.jclouds.io.Payloads; import org.jclouds.io.Payloads;
import org.testng.annotations.Test; import org.testng.annotations.Test;
@ -39,14 +39,14 @@ import com.google.inject.Guice;
* @author Adrian Cole * @author Adrian Cole
*/ */
@Test(groups = "unit") @Test(groups = "unit")
public class NewlineDelimitedStringHandlerTest { public class SplitNewlinesTest {
static Function<HttpResponse, Set<String>> createParser() { static Function<HttpResponse, Set<String>> createParser() {
return Guice.createInjector().getInstance(NewlineDelimitedStringHandler.class); return Guice.createInjector().getInstance(SplitNewlines.class);
} }
public void test() { public void test() {
InputStream is = NewlineDelimitedStringHandlerTest.class.getResourceAsStream("/uuids.txt"); InputStream is = SplitNewlinesTest.class.getResourceAsStream("/uuids.txt");
Set<String> list = createParser().apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is))); Set<String> list = createParser().apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is)));
assertEquals(list, ImmutableSortedSet.of("7e8ab721-81c9-4cb9-a651-4cafbfe1501c", assertEquals(list, ImmutableSortedSet.of("7e8ab721-81c9-4cb9-a651-4cafbfe1501c",
"ea6a8fdb-dab3-4d06-86c2-41a5835e6ed9", "74744450-d338-4087-b3b8-59b505110a57")); "ea6a8fdb-dab3-4d06-86c2-41a5835e6ed9", "74744450-d338-4087-b3b8-59b505110a57"));

View File

@ -0,0 +1,9 @@
name Ubuntu 10.10 Server Edition Linux 64bit Preinstalled System
size 8589934592
claim:type shared
readers ffffffff-ffff-ffff-ffff-ffffffffffff
tags tag1 tag2
user:foo bar
user:baz raz
encryption:cipher aes-xts-plain
avoid avoid1

View File

@ -0,0 +1,26 @@
status active
use networking,security,gateway
name Ubuntu 10.10 Server Edition Linux 64bit Preinstalled System
bits 64
url http://www.ubuntu.com
read:bytes 4096
user 58ca3c1f-7629-4771-9b71-863f40153ba4
encryption:cipher aes-xts-plain
encryption:key ba6c2a4897072e9f25920ed73bd522e9c10d89f30a215158cccf8d0f654ac643
description The Ubuntu Linux distribution brings the spirit of Ubuntu to the software world.
drive b8171d28-755a-4271-b891-7998871a160e
install_notes first line\n\n
os linux
write:bytes 8589938688
claim:type shared
claimed 00109617-2c6b-424b-9cfa-5b572c17bafe:guest:692cd1c7-a863-4a22-8170-fc6e6feb68af:ide:0:0 00031836-a624-4b22-bc7d-41ff8977087b:guest:a1414360-7c24-4730-8c97-180bf7775a71:ide:0:0 0002c6df-a1d2-4d1d-96f0-f95405a28183:guest:386f1cc7-affc-49c1-82a5-2f8e412170e4:ide:0:0 00031836-a624-4b22-bc7d-41ff8977087b:guest:17b076be-430d-4a76-9df3-b9896fec82a5:ide:0:0 000663ee-9fb6-4461-90f6-01327a4aff07:guest:f83b519f-feab-42cf-859c-f61495681ada:ide:0:1
drive_type installcd,livecd
autoexpanding false
readers ffffffff-ffff-ffff-ffff-ffffffffffff
read:requests 1
free true
type disk
write:requests 2097153
size 8589934592
user:foo bar
user:baz raz

View File

@ -92,14 +92,14 @@
<category name="jclouds.headers"> <category name="jclouds.headers">
<priority value="DEBUG" /> <priority value="DEBUG" />
<appender-ref ref="ASYNCWIRE" /> <appender-ref ref="ASYNCWIRE" />
</category><!-- </category>
<category name="jclouds.wire"> <category name="jclouds.wire">
<priority value="DEBUG" /> <priority value="DEBUG" />
<appender-ref ref="ASYNCWIRE" /> <appender-ref ref="ASYNCWIRE" />
</category> </category>
--><!-- ======================= --> <!-- ======================= -->
<!-- Setup the Root category --> <!-- Setup the Root category -->
<!-- ======================= --> <!-- ======================= -->