package com.eucalyptus.blockstorage.ceph;
import java.util.List;
import org.apache.log4j.Logger;
import com.eucalyptus.blockstorage.ceph.entities.CephRbdInfo;
import com.google.common.base.Strings;
public class CanonicalRbdObject {
private static final Logger LOG = Logger.getLogger(CanonicalRbdObject.class);
private String pool;
private String image;
private String snapshot;
public String getPool() {
return pool;
}
public void setPool(String pool) {
this.pool = pool;
}
public CanonicalRbdObject withPool(String pool) {
this.pool = pool;
return this;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public CanonicalRbdObject withImage(String image) {
this.image = image;
return this;
}
public String getSnapshot() {
return snapshot;
}
public void setSnapshot(String snapshot) {
this.snapshot = snapshot;
}
public CanonicalRbdObject withSnapshot(String snapshot) {
this.snapshot = snapshot;
return this;
}
public CanonicalRbdObject() {}
@Override
public String toString() {
return "CanonicalRbdObject [pool=" + pool + ", image=" + image + ", snapshot=" + snapshot + "]";
}
public String toCanonicalString() {
String canonicalId = new String();
if (!Strings.isNullOrEmpty(this.pool))
canonicalId = this.pool;
if (!Strings.isNullOrEmpty(this.image))
canonicalId += "/" + this.image;
if (!Strings.isNullOrEmpty(this.snapshot))
canonicalId += "@" + this.snapshot;
return canonicalId;
}
public static CanonicalRbdObject parse(String canonicalId) {
try {
if (!Strings.isNullOrEmpty(canonicalId)) {
// iqn may be of the form pool/image,pool/image if the snapshot was uploaded pre 4.4. It is always of the form pool/image in 4.4
String newCanonicalId = canonicalId.contains(",") ? canonicalId.substring(0, canonicalId.indexOf(',')) : canonicalId;
List<String> poolSplit = CephRbdInfo.POOL_IMAGE_SPLITTER.splitToList(newCanonicalId);
if (poolSplit != null && poolSplit.size() == 2) {
CanonicalRbdObject resource = new CanonicalRbdObject().withPool(poolSplit.get(0));
if (poolSplit.get(1).contains(CephRbdInfo.IMAGE_SNAPSHOT_DELIMITER)) {
List<String> imageSnapshotSplit = CephRbdInfo.IMAGE_SNAPSHOT_SPLITTER.splitToList(poolSplit.get(1));
if (imageSnapshotSplit != null && imageSnapshotSplit.size() == 2) {
return resource.withImage(imageSnapshotSplit.get(0)).withSnapshot(imageSnapshotSplit.get(1));
} else {
LOG.warn("Expected single occurence of @ in canonical ID " + newCanonicalId);
return null;
}
} else {
return resource.withImage(poolSplit.get(1));
}
} else {
LOG.warn("Expected single occurence of / in canonical ID " + newCanonicalId);
return null;
}
} else {
// Caller may pass in a null ID which may be OK.
// If not, errors will be handled at a higher level.
LOG.debug("Invalid canonical ID " + canonicalId);
return null;
}
} catch (Exception e) {
LOG.warn("Failed to parse " + canonicalId, e);
return null;
}
}
}