package org.ovirt.engine.core.bll; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.core.common.backendinterfaces.BaseHandler; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.VDSType; import org.ovirt.engine.core.common.businessentities.VdsDynamic; import org.ovirt.engine.core.common.businessentities.VdsStatic; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.ObjectIdentityChecker; public class VdsHandler extends BaseHandler { public static ObjectIdentityChecker mUpdateVdsStatic; /** * Initialize static list containers, for identity and permission check. The initialization should be executed * before calling ObjectIdentityChecker. * * @see Backend#InitHandlers */ public static void Init() { mUpdateVdsStatic = new ObjectIdentityChecker( VdsHandler.class, new java.util.ArrayList<String>(java.util.Arrays.asList(new String[] { "VDS", "VdsStatic", "VdsDynamic" })), VDSStatus.class); mUpdateVdsStatic.AddPermittedField("vds_name"); mUpdateVdsStatic.AddPermittedField("managmentIp"); mUpdateVdsStatic.AddPermittedField("pm_type"); mUpdateVdsStatic.AddPermittedField("pm_user"); mUpdateVdsStatic.AddPermittedField("pm_password"); mUpdateVdsStatic.AddPermittedField("pm_port"); mUpdateVdsStatic.AddPermittedField("pm_options"); mUpdateVdsStatic.AddPermittedField("pm_enabled"); mUpdateVdsStatic.AddPermittedField("PmOptionsMap"); mUpdateVdsStatic.AddFields( java.util.Arrays.asList(new Enum[] { VDSStatus.NonResponsive, VDSStatus.Maintenance, VDSStatus.Down, VDSStatus.Unassigned, VDSStatus.InstallFailed, VDSStatus.PendingApproval }), java.util.Arrays.asList(new String[] { "ip", "vds_unique_id", "host_name", "port", "vds_group_id", "otpValidity" })); } public VdsHandler() { mUpdateVdsStatic.setContainer(this); } public static boolean IsUpdateValid(VdsStatic source, VdsStatic distination, VDSStatus status) { return mUpdateVdsStatic.IsUpdateValid(source, distination, status); } public static boolean IsFieldsUpdated(VdsStatic source, VdsStatic distination, Iterable<String> list) { return mUpdateVdsStatic.IsFieldsUpdated(source, distination, list); } public static void HandleVdsCpuFlagsOrClusterChanged(Guid vdsId) { } public boolean isVdsWithSameNameExist(String vdsName) { return isVdsWithSameNameExistStatic(vdsName); } public boolean isVdsWithSameHostExist(String hostName) { return isVdsWithSameHostExistStatic(hostName); } public boolean isVdsWithSameIpExists(String ipAddress) { return isVdsWithSameIpExistsStatic(ipAddress); } public static boolean isVdsWithSameNameExistStatic(String vdsName) { VdsStatic vds = DbFacade.getInstance().getVdsStaticDAO().get(vdsName); return (vds != null); } public static boolean isVdsWithSameHostExistStatic(String hostName) { List<VdsStatic> vds = DbFacade.getInstance().getVdsStaticDAO().getAllForHost(hostName); return (vds.size() != 0); } public static boolean isVdsWithSameIpExistsStatic(String ipAddress) { List<VdsStatic> vds = DbFacade.getInstance().getVdsStaticDAO().getAllWithIpAddress(ipAddress); return (vds.size() != 0); } public static boolean isVdsExist(VdsStatic vdsStatic, java.util.ArrayList<String> messages) { boolean exist = false; if (isVdsWithSameNameExistStatic(vdsStatic.getvds_name())) { messages.add(VdcBllMessages.VDS_TRY_CREATE_WITH_EXISTING_PARAMS.toString()); exist = true; } else if (isVdsWithSameHostExistStatic(vdsStatic.gethost_name())) { messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VDS_WITH_SAME_HOST_EXIST.toString()); exist = true; } return exist; } /** * Verify if an existing entity of oVirt type shares same unique-id as queried host. If verification detects a * violation, e.g existing host with same name for other host or address already associated with a host differ from * the host which shares the same unique-id, adds an error message. * * @param vdsStatic * the oVirt host to query * @param messages * a list which should be updated with violations * @param oVirtId * the id which represents the existed oVirt host * @return */ public static boolean isVdsExistForPendingOvirt(VdsStatic vdsStatic, ArrayList<String> messages, Guid oVirtId) { boolean exists = false; VdsStatic existVds = DbFacade.getInstance().getVdsStaticDAO().get(vdsStatic.getvds_name()); if (existVds != null && !oVirtId.equals(existVds.getId())) { VdsDynamic vdsDynamic = DbFacade.getInstance().getVdsDynamicDAO().get(existVds.getId()); if (vdsDynamic != null && !isPendingOvirt(existVds.getvds_type(), vdsDynamic.getstatus())) { messages.add(VdcBllMessages.VDS_TRY_CREATE_WITH_EXISTING_PARAMS.toString()); exists = true; } } if (!exists) { List<VDS> vdsList = DbFacade.getInstance().getVdsDAO().getAllForHostname(vdsStatic.gethost_name()); for (VDS vds : vdsList) { if (!isPendingOvirt(vds) || (!oVirtId.equals(vds.getvds_id()))) { messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VDS_WITH_SAME_HOST_EXIST.toString()); exists = true; break; } } } return exists; } static private boolean isPendingOvirt(VDSType type, VDSStatus status) { return type == VDSType.oVirtNode && status == VDSStatus.PendingApproval; } static public boolean isPendingOvirt(VDS vds) { return isPendingOvirt(vds.getvds_type(), vds.getstatus()); } }