package org.zstack.header.storage.backup;
import org.zstack.header.configuration.PythonClassInventory;
import org.zstack.header.image.ImageBackupStorageRefInventory;
import org.zstack.header.query.*;
import org.zstack.header.search.Inventory;
import org.zstack.header.search.TypeField;
import org.zstack.header.storage.snapshot.VolumeSnapshotBackupStorageRefInventory;
import javax.persistence.JoinColumn;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @inventory inventory for backup storage
* @example {
* "inventory": {
* "uuid": "18421b64c18c458a8f362203c73593e1",
* "name": "SimulatoryBackupStorage-0",
* "url": "nfs://simulator/backupstorage/-0",
* "totalCapacity": 107374182400,
* "availableCapacity": 107374182400,
* "type": "SimulatorBackupStorage",
* "state": "Enabled",
* "status": "Connected",
* "createDate": "May 2, 2014 12:23:20 AM",
* "lastOpDate": "May 2, 2014 12:23:20 AM",
* "attachedZoneUuids": []
* }
* }
* @since 0.1.0
*/
@Inventory(mappingVOClass = BackupStorageVO.class)
@PythonClassInventory
@ExpandedQueries({
@ExpandedQuery(expandedField = "zoneRef", inventoryClass = BackupStorageZoneRefInventory.class,
foreignKey = "uuid", expandedInventoryKey = "backupStorageUuid", hidden = true),
@ExpandedQuery(expandedField = "imageRef", inventoryClass = ImageBackupStorageRefInventory.class,
foreignKey = "uuid", expandedInventoryKey = "backupStorageUuid", hidden = true),
@ExpandedQuery(expandedField = "volumeSnapshotRef", inventoryClass = VolumeSnapshotBackupStorageRefInventory.class,
foreignKey = "uuid", expandedInventoryKey = "backupStorageUuid", hidden = true),
})
@ExpandedQueryAliases({
@ExpandedQueryAlias(alias = "zone", expandedField = "zoneRef.zone"),
@ExpandedQueryAlias(alias = "image", expandedField = "imageRef.image"),
@ExpandedQueryAlias(alias = "volumeSnapshot", expandedField = "volumeSnapshotRef.volumeSnapshot"),
})
public class BackupStorageInventory implements Serializable {
/**
* @desc backup storage uuid
*/
private String uuid;
/**
* @desc max length of 255 characters
*/
private String name;
/**
* @desc depending on backup storage type, ulr may have various meanings. For example,
* for Sftp backup storage it means path to folder on filesystem that is used to
* store images/volumes/snapshots
*/
private String url;
/**
* @desc max length of 2048 characters
* @nullable
*/
private String description;
/**
* @desc total capacity in bytes
*/
private Long totalCapacity;
/**
* @desc available capacity in bytes
*/
private Long availableCapacity;
/**
* @desc backup storage type
*/
@TypeField
private String type;
/**
* @desc - Enabled: images/volumes/snapshots can be downloaded/uploaded
* - Disabled: NO images/volumes/snapshots can be downloaded/uploaded
* @choices - Enabled
* - Disabled
*/
private String state;
/**
* @desc - Connecting: connection is being established between backup storage and zstack. NO images/volumes/snapshots can be downloaded/uploaded
* - Connected: connection is established. images/volumes/snapshots can be downloaded/uploaded
* - Disconnected: connection is broken. NO images/volumes/snapshots can be downloaded/uploaded
* <p>
* depending on backup storage type, the connection may have various meanings. For example, for Sftp backup storage connection is the http
* channel between zstack and sftp backup storage agent
*/
private String status;
/**
* @desc the time this resource gets created
*/
private Timestamp createDate;
/**
* @desc last time this resource gets operated
*/
private Timestamp lastOpDate;
/**
* @desc a list of zone uuid this backup storage has attached to. See :ref:`ZoneInventory`
*/
@Queryable(mappingClass = BackupStorageZoneRefInventory.class,
joinColumn = @JoinColumn(name = "backupStorageUuid", referencedColumnName = "zoneUuid"))
private List<String> attachedZoneUuids;
protected BackupStorageInventory(BackupStorageVO vo) {
this.setCreateDate(vo.getCreateDate());
this.setDescription(vo.getDescription());
this.setLastOpDate(vo.getLastOpDate());
this.setName(vo.getName());
this.setState(vo.getState().toString());
this.setStatus(vo.getStatus().toString());
this.setTotalCapacity(vo.getTotalCapacity());
this.setAvailableCapacity(vo.getAvailableCapacity());
this.setType(vo.getType());
this.setUrl(vo.getUrl());
this.setUuid(vo.getUuid());
this.attachedZoneUuids = new ArrayList<String>(vo.getAttachedZoneRefs().size());
for (BackupStorageZoneRefVO ref : vo.getAttachedZoneRefs()) {
if (!this.attachedZoneUuids.contains(ref.getZoneUuid())) {
this.attachedZoneUuids.add(ref.getZoneUuid());
}
}
}
public BackupStorageInventory() {
}
public static BackupStorageInventory valueOf(BackupStorageVO vo) {
BackupStorageInventory inv = new BackupStorageInventory(vo);
return inv;
}
public static List<BackupStorageInventory> valueOf(Collection<BackupStorageVO> vos) {
List<BackupStorageInventory> invs = new ArrayList<BackupStorageInventory>(vos.size());
for (BackupStorageVO vo : vos) {
invs.add(BackupStorageInventory.valueOf(vo));
}
return invs;
}
public long getAvailableCapacity() {
return availableCapacity;
}
public void setAvailableCapacity(long availableCapacity) {
this.availableCapacity = availableCapacity;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public long getTotalCapacity() {
return totalCapacity;
}
public void setTotalCapacity(long totalCapacity) {
this.totalCapacity = totalCapacity;
}
public Timestamp getCreateDate() {
return createDate;
}
public void setCreateDate(Timestamp createDate) {
this.createDate = createDate;
}
public Timestamp getLastOpDate() {
return lastOpDate;
}
public void setLastOpDate(Timestamp lastOpDate) {
this.lastOpDate = lastOpDate;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public List<String> getAttachedZoneUuids() {
return attachedZoneUuids;
}
public void setAttachedZoneUuids(List<String> attachedZoneUuids) {
this.attachedZoneUuids = attachedZoneUuids;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}