From fd01759c8ac2ce5d66c96ef3d2cc687af3b8c26a Mon Sep 17 00:00:00 2001 From: karthikarun Date: Wed, 18 Jan 2012 14:01:30 -0600 Subject: [PATCH] Added new VolumeDetached predicate for EBS support --- .../ec2/predicates/VolumeDetached.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 apis/ec2/src/main/java/org/jclouds/ec2/predicates/VolumeDetached.java diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/predicates/VolumeDetached.java b/apis/ec2/src/main/java/org/jclouds/ec2/predicates/VolumeDetached.java new file mode 100644 index 0000000000..6a9d113ecd --- /dev/null +++ b/apis/ec2/src/main/java/org/jclouds/ec2/predicates/VolumeDetached.java @@ -0,0 +1,72 @@ +package com.gravitant.cloud.adapters.provision.providers; + +/** + * 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. + */ + +import javax.annotation.Resource; +import javax.inject.Singleton; + +import org.jclouds.ec2.domain.Attachment; +import org.jclouds.ec2.domain.Volume; +import org.jclouds.ec2.services.ElasticBlockStoreClient; +import org.jclouds.logging.Logger; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; +import com.google.inject.Inject; + +/** + * + * Tests to see if a volume is detached. + * + * @author Karthik Arunachalam + */ +@Singleton +public class VolumeDetached implements Predicate { + + private final ElasticBlockStoreClient client; + @Resource + protected Logger logger = Logger.NULL; + + @Inject + public VolumeDetached(ElasticBlockStoreClient client) { + this.client = client; + } + + public boolean apply(Attachment attachment) { + logger.trace("looking for volume %s", attachment.getVolumeId()); + Volume volume = Iterables.getOnlyElement(client.describeVolumesInRegion(attachment + .getRegion(), attachment.getVolumeId())); + + /*If attachment size is 0 volume is detached for sure.*/ + if (volume.getAttachments().size() == 0) { + return true; + } + + /* But if attachment size is > 0, then the attachment could be in any state. + * So we need to check if the status is DETACHED (return true) or not (return false). + */ + Attachment lastAttachment = Sets.newTreeSet(volume.getAttachments()).last(); + logger.trace("%s: looking for status %s: currently: %s", lastAttachment, + Attachment.Status.DETACHED, lastAttachment.getStatus()); + return lastAttachment.getStatus() == Attachment.Status.DETACHED; + } +} +