package org.ovirt.engine.core.common; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmTemplateStatus; import org.ovirt.engine.core.common.businessentities.storage_domains; import org.ovirt.engine.core.compat.NotImplementedException; public final class VdcActionUtils { private static java.util.Map<java.lang.Class<?>, java.util.Map<Enum<?>, java.util.HashSet<VdcActionType>>> _matrix = new java.util.HashMap<java.lang.Class<?>, java.util.Map<Enum<?>, java.util.HashSet<VdcActionType>>>(); static { // this matrix contains the actions that CANNOT run per status // ("black list") java.util.HashMap<Enum<?>, java.util.HashSet<VdcActionType>> vdsMatrix = new java.util.HashMap<Enum<?>, java.util.HashSet<VdcActionType>>(); vdsMatrix.put( VDSStatus.Maintenance, new HashSet<VdcActionType>(Arrays .asList(VdcActionType.MaintananceVds, VdcActionType.ClearNonResponsiveVdsVms, VdcActionType.ApproveVds))); vdsMatrix.put( VDSStatus.Up, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.ActivateVds, VdcActionType.RemoveVds, VdcActionType.ClearNonResponsiveVdsVms, VdcActionType.ApproveVds, VdcActionType.StartVds, VdcActionType.StopVds))); vdsMatrix.put( VDSStatus.Error, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RemoveVds, VdcActionType.ClearNonResponsiveVdsVms, VdcActionType.ApproveVds))); vdsMatrix.put( VDSStatus.Installing, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RemoveVds, VdcActionType.ActivateVds, VdcActionType.ClearNonResponsiveVdsVms, VdcActionType.ApproveVds, VdcActionType.MaintananceVds, VdcActionType.StartVds, VdcActionType.StopVds))); vdsMatrix.put( VDSStatus.NonResponsive, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RemoveVds, VdcActionType.ActivateVds, VdcActionType.ApproveVds))); vdsMatrix.put( VDSStatus.PreparingForMaintenance, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RemoveVds, VdcActionType.MaintananceVds, VdcActionType.ClearNonResponsiveVdsVms, VdcActionType.ApproveVds))); vdsMatrix.put( VDSStatus.Reboot, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.ActivateVds, VdcActionType.RemoveVds, VdcActionType.ClearNonResponsiveVdsVms, VdcActionType.ApproveVds, VdcActionType.MaintananceVds))); vdsMatrix.put( VDSStatus.Unassigned, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.ActivateVds, VdcActionType .RemoveVds, VdcActionType.MaintananceVds, VdcActionType.ClearNonResponsiveVdsVms, VdcActionType.ApproveVds))); vdsMatrix.put( VDSStatus.Initializing, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.ActivateVds, VdcActionType.RemoveVds, VdcActionType.ClearNonResponsiveVdsVms, VdcActionType.ApproveVds, VdcActionType.MaintananceVds))); vdsMatrix.put( VDSStatus.NonOperational, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RemoveVds, VdcActionType.ApproveVds))); vdsMatrix.put( VDSStatus.PendingApproval, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.UpdateVds, VdcActionType.ActivateVds, VdcActionType.MaintananceVds, VdcActionType.AttachVdsToTag, VdcActionType.ClearNonResponsiveVdsVms))); vdsMatrix.put( VDSStatus.InstallFailed, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.ApproveVds))); vdsMatrix.put( VDSStatus.Problematic, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.MaintananceVds, VdcActionType.RemoveVds, VdcActionType.ActivateVds, VdcActionType.ApproveVds))); vdsMatrix.put( VDSStatus.Down, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.ActivateVds, VdcActionType .ApproveVds))); _matrix.put(VDS.class, vdsMatrix); HashMap<Enum<?>, HashSet<VdcActionType>> vmMatrix = new HashMap<Enum<?>, HashSet<VdcActionType>>(); vmMatrix.put( VMStatus.WaitForLaunch, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.HibernateVm, VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.AddVmTemplate, VdcActionType.RemoveVm, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.Up, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.AddVmTemplate, VdcActionType.RemoveVm, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.PoweringDown, new HashSet<VdcActionType>(Arrays .asList(VdcActionType.HibernateVm, VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.AddVmTemplate, VdcActionType.RemoveVm, VdcActionType.MigrateVm, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.PoweringUp, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.HibernateVm, VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.AddVmTemplate, VdcActionType.RemoveVm, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.RebootInProgress, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.HibernateVm, VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.AddVmTemplate, VdcActionType.RemoveVm, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.MigratingFrom, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.AddVmTemplate, VdcActionType.RemoveVm, VdcActionType.HibernateVm, VdcActionType.MigrateVm, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.PoweredDown, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.HibernateVm, VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.AddVmTemplate, VdcActionType.RemoveVm, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.Suspended, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.HibernateVm, VdcActionType.AddVmTemplate, VdcActionType.RunVmOnce, VdcActionType.MigrateVm, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.RemoveVm, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.Paused, new HashSet<VdcActionType>(Arrays .asList(VdcActionType.RemoveVm, VdcActionType.HibernateVm, VdcActionType.AddVmTemplate, VdcActionType.RunVmOnce, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.SavingState, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.StopVm, VdcActionType.ShutdownVm, VdcActionType.HibernateVm, VdcActionType.MigrateVm, VdcActionType.RemoveVm, VdcActionType.AddVmTemplate, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.RestoringState, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.StopVm, VdcActionType.ShutdownVm, VdcActionType.HibernateVm, VdcActionType.MigrateVm, VdcActionType.RemoveVm, VdcActionType.AddVmTemplate, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.Down, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.StopVm, VdcActionType.ShutdownVm, VdcActionType.HibernateVm, VdcActionType.MigrateVm, VdcActionType.ChangeDisk))); vmMatrix.put( VMStatus.ImageIllegal, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.StopVm, VdcActionType.ShutdownVm, VdcActionType.HibernateVm, VdcActionType.MigrateVm, VdcActionType.AddVmTemplate, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.ImageLocked, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.StopVm, VdcActionType.ShutdownVm, VdcActionType.HibernateVm, VdcActionType.MigrateVm, VdcActionType.RemoveVm, VdcActionType.AddVmTemplate, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.NotResponding, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.HibernateVm, VdcActionType.MigrateVm, VdcActionType.RemoveVm, VdcActionType.AddVmTemplate, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.Unassigned, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.StopVm, VdcActionType.ShutdownVm, VdcActionType.HibernateVm, VdcActionType.MigrateVm, VdcActionType.RemoveVm, VdcActionType.AddVmTemplate, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); vmMatrix.put( VMStatus.Unknown, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RunVm, VdcActionType.RunVmOnce, VdcActionType.StopVm, VdcActionType.ShutdownVm, VdcActionType.HibernateVm, VdcActionType.MigrateVm, VdcActionType.RemoveVm, VdcActionType.AddVmTemplate, VdcActionType.ExportVm, VdcActionType.MoveVm, VdcActionType.ImportVm, VdcActionType.ChangeDisk, VdcActionType.AddVmInterface, VdcActionType.UpdateVmInterface, VdcActionType.RemoveVmInterface))); _matrix.put(VM.class, vmMatrix); HashMap<Enum<?>, HashSet<VdcActionType>> vmTemplateMatrix = new HashMap<Enum<?>, HashSet<VdcActionType>>(); vmTemplateMatrix.put( VmTemplateStatus.Locked, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.RemoveVmTemplate, VdcActionType.ExportVmTemplate, VdcActionType.MoveOrCopyTemplate, VdcActionType.ImportVmTemplate))); vmTemplateMatrix.put( VmTemplateStatus.Illegal, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.ExportVmTemplate, VdcActionType.MoveOrCopyTemplate, VdcActionType.ImportVmTemplate))); _matrix.put(VmTemplate.class, vmTemplateMatrix); HashMap<Enum<?>, HashSet<VdcActionType>> storageDomainMatrix = new HashMap<Enum<?>, HashSet<VdcActionType>>(); storageDomainMatrix.put( StorageDomainStatus.Active, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.DetachStorageDomainFromPool, VdcActionType.ActivateStorageDomain))); storageDomainMatrix.put( StorageDomainStatus.InActive, new HashSet<VdcActionType>(Arrays .asList(VdcActionType.DeactivateStorageDomain))); storageDomainMatrix.put( StorageDomainStatus.Locked, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.DetachStorageDomainFromPool, VdcActionType.DeactivateStorageDomain, VdcActionType.ActivateStorageDomain))); storageDomainMatrix.put( StorageDomainStatus.Unattached, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.DetachStorageDomainFromPool, VdcActionType.DeactivateStorageDomain, VdcActionType.ActivateStorageDomain))); storageDomainMatrix.put( StorageDomainStatus.Uninitialized, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.DetachStorageDomainFromPool, VdcActionType.DeactivateStorageDomain, VdcActionType.ActivateStorageDomain))); storageDomainMatrix.put( StorageDomainStatus.Unknown, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.DetachStorageDomainFromPool, VdcActionType.DeactivateStorageDomain))); storageDomainMatrix.put( StorageDomainStatus.Maintenance, new HashSet<VdcActionType>(Arrays.asList(VdcActionType.DeactivateStorageDomain))); _matrix.put(storage_domains.class, storageDomainMatrix); } public static boolean CanExecute(List<?> entities, Class<?> type, VdcActionType action) { if (_matrix.containsKey(type)) { for (Object a : entities) { if (a.getClass() == type && _matrix.get(type).containsKey(GetStatusProperty(a)) && _matrix.get(type).get(GetStatusProperty(a)).contains(action)) { return false; } } } return true; } private static Enum<?> GetStatusProperty(Object entity) { if (entity == null) { return null; } if (entity.getClass().getName().endsWith("VDS")) { return (entity instanceof VDS ? ((VDS) entity).getstatus() : null); } else if (entity.getClass().getName().endsWith("VM")) { return (entity instanceof VM ? ((VM) entity).getstatus() : null); } else if (entity.getClass().getName().endsWith("VmTemplate")) { return (entity instanceof VmTemplate ? ((VmTemplate) entity).getstatus() : null); } else if (entity instanceof storage_domains) { StorageDomainStatus status = ((storage_domains) entity).getstatus(); return status != null ? status : StorageDomainStatus.Uninitialized; } throw new NotImplementedException(); } }