/** * Copyright (C) 2009-2015 Dell, Inc. * See annotations for authorship information * * ==================================================================== * 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.dasein.cloud.compute; import org.dasein.cloud.Taggable; import org.dasein.cloud.network.Networkable; import org.dasein.util.uom.storage.Gigabyte; import org.dasein.util.uom.storage.Storage; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; /** * Represents a block storage volume in the cloud. * * @author George Reese (george.reese@imaginary.com) * @version 2012-07 updated to match new volume enhancements, including UoM, type, and root volume awareness * @since unknown */ public class Volume implements Networkable, Taggable { private long creationTimestamp; private VolumeState currentState; private String providerDataCenterId; private String description; private String deviceId; private VolumeFormat format; private Platform guestOperatingSystem; private int iops; private String mediaLink; private String name; private String providerProductId; private String providerVolumeId; private String providerRegionId; private String providerVirtualMachineId; private String providerVlanId; private boolean rootVolume; private Storage<Gigabyte> size; private String providerSnapshotId; private Map<String, String> tags; private VolumeType type; /** * deleteOnVirtualMachineTermination is needed for listing volumes on a virtualmachine, but set to null * for when listing volumes through VolumeSupport as some providers (AWS) don't provide this info there. */ private Boolean deleteOnVirtualMachineTermination = null; public Volume() { } public boolean equals( Object ob ) { if( ob == null ) { return false; } if( ob == this ) { return true; } if( !getClass().getName().equals(ob.getClass().getName()) ) { return false; } Volume other = ( Volume ) ob; if( !providerRegionId.equals(other.providerRegionId) ) { return false; } return providerVolumeId.equals(other.providerVolumeId); } /** * @deprecated Use {@link #getProviderSnapshotId()} */ public String getSnapshotId() { return getProviderSnapshotId(); } public String getProviderSnapshotId() { return providerSnapshotId; } /** * @deprecated use {@link #setProviderSnapshotId(String)} */ public void setSnapshotId( String snapshotId ) { this.providerSnapshotId = snapshotId; } public void setProviderSnapshotId( String snapshotId ) { this.providerSnapshotId = snapshotId; } public VolumeState getCurrentState() { return currentState; } /** * @deprecated use {@link #getProviderDataCenterId()} */ public String getDataCenterId() { return getProviderDataCenterId(); } public String getProviderDataCenterId() { return providerDataCenterId; } public String getDeviceId() { return deviceId; } public String getName() { return name; } public String getProviderVolumeId() { return providerVolumeId; } /** * @deprecated use {@link #getProviderRegionId()} */ public String getRegionId() { return getProviderRegionId(); } public String getProviderRegionId() { return providerRegionId; } /** * @deprecated use {@link #getProviderVirtualMachineId()} */ public String getServerId() { return getProviderVirtualMachineId(); } public String getProviderVirtualMachineId() { return providerVirtualMachineId; } public Storage<Gigabyte> getSize() { return size; } public void setSize( Storage<?> size ) { this.size = ( Storage<Gigabyte> ) size.convertTo(Storage.GIGABYTE); } public int getSizeInGigabytes() { return ( size == null ? 0 : size.getQuantity().intValue() ); } public void setCurrentState( VolumeState currentState ) { this.currentState = currentState; } /** * @deprecated use {@link #setProviderDataCenterId(String)} */ public void setDataCenterId( String dataCenterId ) { setProviderDataCenterId(dataCenterId); } public void setProviderDataCenterId( String dataCenterId ) { this.providerDataCenterId = dataCenterId; } public void setDeviceId( String deviceId ) { this.deviceId = deviceId; } public void setName( String name ) { this.name = name; } public void setProviderVolumeId( String providerVolumeId ) { this.providerVolumeId = providerVolumeId; } /** * @deprecated use {@link #setProviderRegionId(String)} */ public void setRegionId( String regionId ) { setProviderRegionId(regionId); } public void setProviderRegionId( String regionId ) { this.providerRegionId = regionId; } /** * @deprecated use {@link #setProviderVirtualMachineId(String)} */ public void setServerId( String serverId ) { setProviderVirtualMachineId(serverId); } public void setProviderVirtualMachineId( String serverId ) { this.providerVirtualMachineId = serverId; } public long getCreationTimestamp() { return creationTimestamp; } public void setCreationTimestamp( long creationTimestamp ) { this.creationTimestamp = creationTimestamp; } public VolumeType getType() { return type; } public void setType( VolumeType t ) { type = t; } public String toString() { return ( name + " [" + providerVolumeId + "]" ); } public String getProviderProductId() { return providerProductId; } public void setProviderProductId( String providerProductId ) { this.providerProductId = providerProductId; } public String getDescription() { return description; } public void setDescription( String description ) { this.description = description; } public boolean isRootVolume() { return rootVolume; } public void setRootVolume( boolean rootVolume ) { this.rootVolume = rootVolume; } public String getMediaLink() { return mediaLink; } public void setMediaLink( String mediaLink ) { this.mediaLink = mediaLink; } public Platform getGuestOperatingSystem() { return guestOperatingSystem; } public void setGuestOperatingSystem( Platform guestOperatingSystem ) { this.guestOperatingSystem = guestOperatingSystem; } public int getIops() { return iops; } public void setIops( int iops ) { this.iops = iops; } public boolean isAttached() { return ( providerVirtualMachineId != null ); } public @Nonnull VolumeFormat getFormat() { return ( format == null ? VolumeFormat.BLOCK : format ); } public void setFormat( @Nonnull VolumeFormat format ) { this.format = format; } public String getProviderVlanId() { return providerVlanId; } public void setProviderVlanId( String providerVlanId ) { this.providerVlanId = providerVlanId; } public synchronized void setTags( Map<String, String> properties ) { getTags().clear(); getTags().putAll(properties); } public @Nullable String getTag( @Nonnull String key ) { return getTags().get(key); } @Override public @Nonnull Map<String, String> getTags() { if( tags == null ) { tags = new HashMap<String, String>(); } return tags; } @Override public void setTag( @Nonnull String key, @Nonnull String value ) { getTags().put(key, value); } public Boolean isDeleteOnVirtualMachineTermination() { return deleteOnVirtualMachineTermination; } public void setDeleteOnVirtualMachineTermination( Boolean deleteOnVirtualMachineTermination ) { this.deleteOnVirtualMachineTermination = deleteOnVirtualMachineTermination; } }