package org.ovirt.engine.ui.uicommon.models.vms;
import java.util.Collections;
import org.ovirt.engine.core.compat.*;
import org.ovirt.engine.ui.uicompat.*;
import org.ovirt.engine.core.common.businessentities.*;
import org.ovirt.engine.core.common.vdscommands.*;
import org.ovirt.engine.core.common.queries.*;
import org.ovirt.engine.core.common.action.*;
import org.ovirt.engine.ui.frontend.*;
import org.ovirt.engine.ui.uicommon.*;
import org.ovirt.engine.ui.uicommon.models.*;
import org.ovirt.engine.core.common.*;
import org.ovirt.engine.ui.uicommon.dataprovider.*;
import org.ovirt.engine.ui.uicommon.validation.*;
import org.ovirt.engine.ui.uicompat.*;
import org.ovirt.engine.core.common.businessentities.*;
import org.ovirt.engine.ui.uicommon.*;
import org.ovirt.engine.ui.uicommon.models.*;
@SuppressWarnings("unused")
public class NewTemplateVmModelBehavior extends IVmModelBehavior
{
private VM vm;
public NewTemplateVmModelBehavior(VM vm)
{
this.vm = vm;
}
@Override
public void Initialize(SystemTreeItemModel systemTreeSelectedItem)
{
super.Initialize(systemTreeSelectedItem);
getModel().getTemplate().setIsChangable(false);
AsyncDataProvider.GetDataCenterById(new AsyncQuery(this,
new INewAsyncCallback() {
@Override
public void OnSuccess(Object target, Object returnValue) {
NewTemplateVmModelBehavior behavior = (NewTemplateVmModelBehavior)target;
storage_pool dataCenter = (storage_pool)returnValue;
if (dataCenter == null)
{
DisableNewTemplateModel("Data Center is not accessible.");
}
else
{
behavior.getModel().getDataCenter().setItems(new java.util.ArrayList<storage_pool>(java.util.Arrays.asList(new storage_pool[] { dataCenter })));
behavior.getModel().getDataCenter().setSelectedItem(dataCenter);
behavior.getModel().getDataCenter().setIsChangable(false);
}
}
}, getModel().getHash()), vm.getstorage_pool_id());
}
@Override
public void DataCenter_SelectedItemChanged()
{
storage_pool dataCenter = (storage_pool)getModel().getDataCenter().getSelectedItem();
getModel().setIsHostAvailable(dataCenter.getstorage_pool_type() != StorageType.LOCALFS);
AsyncDataProvider.GetClusterList(new AsyncQuery(new Object[] { this, getModel() },
new INewAsyncCallback() {
@Override
public void OnSuccess(Object target, Object returnValue) {
Object[] array = (Object[])target;
NewTemplateVmModelBehavior behavior = (NewTemplateVmModelBehavior)array[0];
UnitVmModel model = (UnitVmModel)array[1];
java.util.ArrayList<VDSGroup> clusters = (java.util.ArrayList<VDSGroup>)returnValue;
model.SetClusters(model, clusters, vm.getvds_group_id().getValue());
behavior.InitTemplate();
}
}, getModel().getHash()), dataCenter.getId());
//If a VM has at least one disk, present its storage domain.
AsyncDataProvider.GetVmDiskList(new AsyncQuery(this,
new INewAsyncCallback() {
@Override
public void OnSuccess(Object target, Object returnValue) {
NewTemplateVmModelBehavior behavior = (NewTemplateVmModelBehavior)target;
java.util.ArrayList<DiskImage> disks = new java.util.ArrayList<DiskImage>();
Iterable disksEnumerable = (Iterable)returnValue;
java.util.Iterator disksIterator = disksEnumerable.iterator();
while (disksIterator.hasNext())
{
disks.add((DiskImage)disksIterator.next());
}
if (disks.isEmpty())
{
behavior.DisableNewTemplateModel("Cannot create Template. VM has no disks.");
}
else
{
behavior.InitStorageDomains(disks.get(0).getstorage_id());
}
}
}, getModel().getHash()), vm.getvm_guid());
}
@Override
public void Template_SelectedItemChanged()
{
}
@Override
public void Cluster_SelectedItemChanged()
{
}
@Override
public void DefaultHost_SelectedItemChanged()
{
}
@Override
public void Provisioning_SelectedItemChanged()
{
}
@Override
public void UpdateMinAllocatedMemory()
{
}
private void InitTemplate()
{
//Update model state according to VM properties.
getModel().getMemSize().setEntity(this.vm.getvm_mem_size_mb());
getModel().getOSType().setSelectedItem(this.vm.getvm_os());
getModel().getDomain().setSelectedItem(this.vm.getvm_domain());
getModel().getUsbPolicy().setSelectedItem(this.vm.getusb_policy());
getModel().getNumOfMonitors().setSelectedItem(this.vm.getnum_of_monitors());
getModel().setBootSequence(this.vm.getdefault_boot_sequence());
getModel().getNumOfSockets().setEntity(this.vm.getnum_of_sockets());
getModel().getTotalCPUCores().setEntity(this.vm.getnum_of_cpus());
getModel().getIsStateless().setEntity(this.vm.getis_stateless());
if (!StringHelper.isNullOrEmpty(this.vm.gettime_zone()))
{
getModel().getTimeZone().setSelectedItem(new KeyValuePairCompat<String, String>(this.vm.gettime_zone(), ""));
UpdateTimeZone();
}
else
{
UpdateDefaultTimeZone();
}
// Update domain list
UpdateDomain();
getModel().getStorageDomain().setIsChangable(true);
getModel().getProvisioning().setIsAvailable(false);
//Select display protocol.
for (Object item : getModel().getDisplayProtocol().getItems())
{
EntityModel model = (EntityModel)item;
DisplayType displayType = (DisplayType)model.getEntity();
if (displayType == this.vm.getdefault_display_type())
{
getModel().getDisplayProtocol().setSelectedItem(item);
break;
}
}
InitPriority(this.vm.getpriority());
}
public void InitStorageDomains(NGuid storageDomainId)
{
if (storageDomainId == null)
{
return;
}
AsyncDataProvider.GetStorageDomainById(new AsyncQuery(this,
new INewAsyncCallback() {
@Override
public void OnSuccess(Object target, Object returnValue) {
NewTemplateVmModelBehavior behavior = (NewTemplateVmModelBehavior)target;
storage_domains currentStorageDomain = (storage_domains)returnValue;
behavior.PostInitStorageDomains((storage_pool)behavior.getModel().getDataCenter().getSelectedItem(), currentStorageDomain);
}
}, getModel().getHash()), storageDomainId.getValue());
}
public void PostInitStorageDomains(storage_pool dataCenter, storage_domains storage)
{
AsyncDataProvider.GetStorageDomainList(new AsyncQuery(new Object[] { this, storage },
new INewAsyncCallback() {
@Override
public void OnSuccess(Object target, Object returnValue) {
Object[] array = (Object[])target;
NewTemplateVmModelBehavior behavior = (NewTemplateVmModelBehavior)array[0];
storage_domains currentStorageDomain = (storage_domains)array[1];
storage_domains vmStorageDomain = null;
java.util.ArrayList<storage_domains> activeStorageDomainList = new java.util.ArrayList<storage_domains>();
for (storage_domains storageDomain : (java.util.ArrayList<storage_domains>)returnValue)
{
if (storageDomain.getstatus() == StorageDomainStatus.Active && (storageDomain.getstorage_domain_type() == StorageDomainType.Data || storageDomain.getstorage_domain_type() == StorageDomainType.Master))
{
if (currentStorageDomain.getid().equals(storageDomain.getid()))
{
vmStorageDomain = storageDomain;
}
activeStorageDomainList.add(storageDomain);
}
}
if (activeStorageDomainList.size() > 0)
{
if (vmStorageDomain != null)
{
if (getSystemTreeSelectedItem() != null && getSystemTreeSelectedItem().getType() == SystemTreeItemType.Storage)
{
storage_domains selectStorage = (storage_domains)getSystemTreeSelectedItem().getEntity();
storage_domains s = Linq.FirstOrDefault(activeStorageDomainList, new Linq.StoragePredicate(selectStorage.getid()));
behavior.getModel().getStorageDomain().setItems(new java.util.ArrayList<storage_domains>(java.util.Arrays.asList(new storage_domains[] { s })));
behavior.getModel().getStorageDomain().setIsChangable(false);
behavior.getModel().getStorageDomain().setSelectedItem(s);
}
else
{
behavior.getModel().getStorageDomain().setItems(activeStorageDomainList);
behavior.getModel().getStorageDomain().setIsChangable(true);
behavior.getModel().getStorageDomain().setSelectedItem(vmStorageDomain);
}
}
else
{
behavior.DisableNewTemplateModel("VM's Storage Domain (" + currentStorageDomain.getstorage_name() + ") is not accessible.");
return;
}
}
}
}, getModel().getHash()), dataCenter.getId());
}
private void DisableNewTemplateModel(String errMessage)
{
getModel().setIsValid(false);
getModel().setMessage(errMessage);
getModel().getName().setIsChangable(false);
getModel().getDescription().setIsChangable(false);
getModel().getCluster().setIsChangable(false);
getModel().getStorageDomain().setIsChangable(false);
getModel().getIsTemplatePublic().setIsChangable(false);
}
@Override
public boolean Validate()
{
getModel().getStorageDomain().ValidateSelectedItem(new IValidation[] { new NotEmptyValidation() });
return super.Validate() && getModel().getStorageDomain().getIsValid();
}
}