/***************************************************************************
* Copyright (c) 2015 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 com.vmware.aurora.util.worker.CmsWorker;
import com.vmware.vim.binding.vim.ClusterComputeResource;
import com.vmware.vim.binding.vim.Datacenter;
import com.vmware.vim.binding.vim.Folder;
import com.vmware.vim.binding.vim.VirtualMachine;
import com.vmware.vim.binding.vmodl.ManagedObject;
import com.vmware.vim.binding.vmodl.ManagedObjectReference;
import com.vmware.vim.binding.vmodl.fault.ManagedObjectNotFound;
import java.util.EnumSet;
import java.util.List;
/**
* Created by xiaoliangl on 7/16/15.
*/
@SuppressWarnings("serial")
class VcDatacenterImpl extends VcObjectImpl implements VcDatacenter {
private String name;
private ManagedObjectReference vmFolder;
private ManagedObjectReference hostFolder;
private List<ManagedObjectReference> clusters;
/**
* Sync request to update clusters.
*/
protected static class SyncRequest extends VcInventory.SyncRequest {
SyncRequest(ManagedObjectReference moRef, CmsWorker.WorkQueue queue, boolean forceLoad,
EnumSet<VcObjectType> syncSet) {
super(moRef, queue, forceLoad, syncSet);
}
@Override
protected void syncChildObjects(VcObject obj) {
if (obj instanceof VcDatacenterImpl) {
VcDatacenterImpl datacenter = (VcDatacenterImpl)obj;
for (ManagedObjectReference cluster : datacenter.clusters) {
add(new VcClusterImpl.SyncRequest(cluster, this));
}
}
}
}
public List<ManagedObjectReference> getClusterMoRefs() {
return clusters;
}
private List<ManagedObjectReference> findClusters() throws Exception {
Folder folder = MoUtil.getManagedObject(hostFolder);
return MoUtil.getDescendantsMoRef(folder, ClusterComputeResource.class);
}
@Override
protected void update(ManagedObject mo) throws Exception {
Datacenter dc = (Datacenter)mo;
this.name = dc.getName();
this.vmFolder = dc.getVmFolder();
this.hostFolder = dc.getHostFolder();
this.clusters = findClusters();
}
protected VcDatacenterImpl(Datacenter dc) throws Exception {
super(dc);
update(dc);
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatacenter#getName()
*/
@Override
public String getName() {
return MoUtil.fromURLString(name);
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatacenter#getURLName()
*/
@Override
public String getURLName() {
return name;
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatacenter#getVmFolder()
*/
@Override
public Folder getVmFolder() throws Exception {
return MoUtil.getManagedObject(vmFolder);
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatacenter#getVmFolderMoRef()
*/
@Override
public ManagedObjectReference getVmFolderMoRef() {
return vmFolder;
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatacenter#getClusters()
*/
@Override
public List<VcCluster> getVcClusters() {
// XXX should filter out unqualified cluster: HA & DRS enabled.
return VcCache.getPartialList(clusters, getMoRef());
}
/* (non-Javadoc)
* @see com.vmware.aurora.vc.VcDatacenter#getVirtualMachine(java.lang.String)
*/
@Override
public VcVirtualMachine getVirtualMachine(String name) throws Exception {
String urlName = MoUtil.toURLString(name);
Folder folder = getVmFolder();
for (VirtualMachine vm : MoUtil.getChildEntity(folder, VirtualMachine.class)) {
try {
if (vm.getName().equals(urlName)) {
return VcCache.get(vm);
}
} catch (ManagedObjectNotFound e) {
// We don't cache VM list, so no need to refresh VcDatacenter.
logger.info("skip bad vm moref " + vm);
}
}
return null;
}
}