/***************************************************************************
* Copyright (c) 2012-2013 VMware, Inc. All Rights Reserved.
* 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 com.vmware.aurora.vc;
import java.util.ArrayList;
import java.util.List;
import com.vmware.aurora.global.Configuration;
import com.vmware.aurora.util.AuAssert;
import com.vmware.vim.binding.vim.Datacenter;
import com.vmware.vim.binding.vim.Datastore;
import com.vmware.vim.binding.vim.Datastore.HostMount;
import com.vmware.vim.binding.vim.Datastore.Summary.MaintenanceModeState;
import com.vmware.vim.binding.vim.StoragePod;
import com.vmware.vim.binding.vim.host.VmfsDatastoreInfo;
import com.vmware.vim.binding.vim.host.VmfsVolume;
import com.vmware.vim.binding.vmodl.ManagedObject;
import com.vmware.vim.binding.vmodl.ManagedObjectReference;
public interface VcDatastore extends VcObject {
abstract String getName();
/**
* @return name already in URL format as returned from VLSI
*/
abstract String getURLName();
/**
* @return the datacenter of this datastore
*/
abstract VcDatacenter getDatacenter();
abstract ManagedObjectReference getDatacenterMoRef();
abstract String getStorageType();
abstract long getCapacity();
abstract long getFreeSpace();
abstract String getUrl();
abstract boolean isAccessible();
abstract boolean isInNormalMode();
abstract boolean isVmfs();
abstract String getVmfsVolumeVersion();
abstract boolean isSupported();
abstract boolean isSameDatastore(String datastoreId);
abstract boolean isInStoragePod();
abstract public boolean isSupportedVmfsVersion();
abstract public boolean isLocal();
abstract List<VcHost> getHosts();
}
@SuppressWarnings("serial")
class VcDatastoreImpl extends VcObjectImpl implements VcDatastore {
private Datastore.Summary summary;
private Datastore.Info info;
private ManagedObjectReference datacenter;
private boolean inStoragePod;
private Datastore.HostMount[] hosts;
@Override
protected void update(ManagedObject mo) {
Datastore ds = (Datastore) mo;
summary = ds.getSummary();
info = ds.getInfo();
datacenter = MoUtil.getAncestorMoRef(ds.getParent(), Datacenter.class);
inStoragePod = MoUtil.isOfType(ds.getParent(), StoragePod.class);
hosts = ds.getHost();
}
protected VcDatastoreImpl(Datastore ds) throws Exception {
super(ds);
update(ds);
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#getName()
*/
@Override
public String getName() {
return MoUtil.fromURLString(summary.getName());
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#getURLName()
*/
@Override
public String getURLName() {
return summary.getName();
}
@Override
public String toString() {
return String.format("DS[%s]", getName());
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#getDatacenter()
*/
@Override
public VcDatacenter getDatacenter() {
return VcCache.get(datacenter);
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#getDatacenterMoRef()
*/
@Override
public ManagedObjectReference getDatacenterMoRef() {
return datacenter;
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#getStorageType()
*/
@Override
public String getStorageType() {
return summary.getType();
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#getCapacity()
*/
@Override
public long getCapacity() {
return summary.getCapacity();
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#getFreeSpace()
*/
@Override
public long getFreeSpace() {
return summary.getFreeSpace();
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#getUrl()
*/
@Override
public String getUrl() {
return summary.getUrl();
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#isAccessible()
*/
@Override
public boolean isAccessible() {
return summary.isAccessible();
}
@Override
public boolean isInNormalMode() {
String strMode = summary.getMaintenanceMode();
if (strMode != null) {
MaintenanceModeState mode = MaintenanceModeState.valueOf(strMode);
if (mode == MaintenanceModeState.normal) {
return true;
}
}
return false;
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#isVmfs()
*/
@Override
public boolean isVmfs() {
return "VMFS".equals(getStorageType());
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#getVmfsVolumeVersion()
*/
@Override
public String getVmfsVolumeVersion() {
AuAssert.check(isVmfs());
VmfsDatastoreInfo vmfsInfo = (VmfsDatastoreInfo) info;
VmfsVolume vmfsVolume = vmfsInfo.getVmfs();
return vmfsVolume.getVersion();
}
private int getVmfsVolumeMajorVersion() {
AuAssert.check(isVmfs());
VmfsDatastoreInfo vmfsInfo = (VmfsDatastoreInfo) info;
return vmfsInfo.getVmfs().getMajorVersion();
}
public boolean isSupportedVmfsVersion() {
AuAssert.check(isVmfs());
int majorVersion = getVmfsVolumeMajorVersion();
return majorVersion > 3
|| (majorVersion == 3 && Configuration.getBoolean(
"vc.support_vmfs3", false));
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatastore#isSupported()
*/
@Override
public boolean isSupported() {
return VcUtil.getIncompatReasonsForDatastore(this).isEmpty();
}
@Override
public boolean isSameDatastore(String datastoreId) {
return getId().equals(datastoreId);
}
@Override
public boolean isInStoragePod() {
return inStoragePod;
}
@Override
public boolean isLocal() {
return (hosts.length == 1);
}
@Override
public List<VcHost> getHosts() {
List<VcHost> hosts = new ArrayList<VcHost>();
for (HostMount host : this.hosts) {
VcHost h = VcCache.get(host.getKey());
hosts.add(h);
}
return hosts;
}
}