Datastore 存储
/**
*
* 0查所有:没有选择数据中心,全部存储,
* 1数据中心:只选择数据中心,查询数据中心下存储
* 2集群名:选择数据中心和集群,查询集群下存储
* 3主机名:选择数据中心和集群、主机,查询主机下存储
*/
@Override
public List queryDataStore(ServiceInstance client, VcDataStoreGetParams record) {
if (client == null){
return new ArrayList<>();
}
Folder rootFolder = client.getRootFolder();
ManagedEntity[] datastores = null;
try {
switch (record.getType()) {
case 0:
datastores = new InventoryNavigator(rootFolder).searchManagedEntities(VcenterConstantUtils.ManagedEntityType.Datastore);
break;
case 1:
Datacenter dcenter = (Datacenter) new InventoryNavigator(rootFolder).searchManagedEntity(VcenterConstantUtils.ManagedEntityType.Datacenter, record.getDcName());
datastores = new InventoryNavigator(dcenter).searchManagedEntities(VcenterConstantUtils.ManagedEntityType.Datastore);
break;
case 2:
Datacenter dcenter2 = (Datacenter) new InventoryNavigator(rootFolder).searchManagedEntity(VcenterConstantUtils.ManagedEntityType.Datacenter, record.getDcName());
ClusterComputeResource cluster = (ClusterComputeResource) new InventoryNavigator(dcenter2).searchManagedEntity(VcenterConstantUtils.ManagedEntityType.ClusterComputeResource, record.getClusterName());
datastores = cluster.getDatastores();
break;
case 3:
Datacenter dcenter3 = (Datacenter) new InventoryNavigator(rootFolder).searchManagedEntity(VcenterConstantUtils.ManagedEntityType.Datacenter, record.getDcName());
ClusterComputeResource cluster2 = (ClusterComputeResource) new InventoryNavigator(dcenter3).searchManagedEntity(VcenterConstantUtils.ManagedEntityType.ClusterComputeResource, record.getClusterName());
HostSystem host = (HostSystem) new InventoryNavigator(cluster2).searchManagedEntity(VcenterConstantUtils.ManagedEntityType.HostSystem, record.getHostName());
datastores = host.getDatastores();
break;
default:
break;
}
List<Datastore> ds = this.forDataStore(datastores);
return forVcDataStore(client, ds);
}catch(Exception e){
log.error(TypeIdEnums.getName(TypeIdEnums.TYPE_VM.getTypeid())+"##DataStoreServiceImpl##queryDataStore", e);
throw new CloudResourcesException(CloudResourcesErrorEnum.QUERY_ERROR);
}
}
/**==============================================分割线===========================================================*/
@Override
public Result<List<VcDataStore>> listExtend(ServiceInstance client, BaseCloudParams<CloudDiskReq> baseCloudParams) {
VcDataStoreGetParams data = baseCloudParams.getData().getVc();
List<VcDataStore> res = this.queryDataStore(client, data);
if(null==res || res.size()<=0){
return ResultUtil.error(ResultTipsEnums.ERROR_QUERY.getMsg());
}
return ResultUtil.data(res);
}
public List<VcDataStore> forVcDataStore(ServiceInstance client,List<Datastore> dataStores)
{
if(null==dataStores || dataStores.size()<=0){
return null;
}
List<VcDataStore> vcds = new ArrayList<>();
for(Datastore d:dataStores){
VirtualMachine[] vms = d.getVms();//存储下虚机个数
DatastoreHostMount[] ff = d.getHost();
ManagedObjectReference host = null;
try {
List<String> hosts = new ArrayList<>();
if(ff!=null)
{
for(DatastoreHostMount f:ff){
host = f.getKey();
HostSystem h = new HostSystem(client.getServerConnection(),host);
hosts.add(h.getName());
}
}
String s = StringUtils.join(hosts.toArray(),",");
//总容量
Long capacity = d.getSummary().getCapacity();
//可用空间
Long freeSpace = d.getSummary().getFreeSpace();
//置备空间
Long uncommitted = d.getSummary().getUncommitted();
//已用空间+可用空间=总容量,已用空间 capacity-freeSpace;
//已用空间/总容量=使用率===>>>String.format("%.2f", ((capacity - freeSpace) / 100d) * 100 / capacity)
String used = "0";
//置备空间/总容量=分配率===>>>String.format("%.2f", (uncommitted / 100d)*100/capacity)
String distribution = "0";
Long zero = 0L;
if(null!=capacity && !zero.equals(capacity)){
used = String.format("%.2f", (capacity - freeSpace) * 100 / capacity/ 100d);
if(uncommitted!=null){
distribution = String.format("%.2f", uncommitted*100/capacity / 100d);
}
}
//status ==== >>>>> red(警示)、green(正常)、yellow(警告)、wgray(未知)
VcDataStore.VcDataStoreBuilder vcdsBuilder = VcDataStore.builder().host(s).name(d.getName()).uuid(d.getMOR().get_value()).status(d.getOverallStatus().name())
.type(d.getSummary().getType()).uncommitted(dealSize(uncommitted)).instanceCount(vms.length).used(used).distribution(distribution);
ManagedEntity dc=getTypeFromParentEntity(d, "Datacenter");
if(null!=dc) {
vcdsBuilder.dcName(dc.getName()).dcUuid(dc.getMOR().get_value());
}
String pod = "StoragePod".equalsIgnoreCase(d.getParent().getMOR().getType())?d.getParent().getName():"-";
vcdsBuilder.storagePod(pod).Capacity(dealSize(capacity)).usedSpace(dealSize(capacity-freeSpace)).freeSpace(dealSize(freeSpace));
vcds.add(vcdsBuilder.build());
}catch (Exception e){
log.error(TypeIdEnums.getName(TypeIdEnums.TYPE_VM.getTypeid())+"##InstanceServiceImpl##forVcDataStore", e);
}
}
return vcds;
}
//处理单位转换
private Double dealSize(Long size){
if(size==null){
return 0d;
}
return Math.round(size * 100 / 1024 / 1024 / 1024) / 100.0;
}
ManagedEntity getTypeFromParentEntity(ManagedEntity me, String targetType) {
try {
if (targetType.equals(me.getParent().getMOR().getType())) {
return me.getParent();
} else {
return getTypeFromParentEntity(me.getParent(), targetType);
}
} catch (Exception e) {
log.error( "getTypeFromParent", e);
}
return null;
}
private List<Datastore> forDataStore(ManagedEntity[] datastores){
List<Datastore> result = new ArrayList<>();
if(datastores==null){
return null;
}
for(int i=0;i<datastores.length;i++)
{
Datastore datastore = (Datastore)datastores[i];
result.add(datastore);
}
return result;
}