package org.ovirt.engine.core.dao; import java.util.HashMap; import java.util.List; import javax.inject.Named; import javax.inject.Singleton; import org.ovirt.engine.core.common.businessentities.AutoNumaBalanceStatus; import org.ovirt.engine.core.common.businessentities.ExternalStatus; import org.ovirt.engine.core.common.businessentities.KdumpStatus; import org.ovirt.engine.core.common.businessentities.NonOperationalReason; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.VdsDynamic; import org.ovirt.engine.core.common.businessentities.VdsTransparentHugePagesState; import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.RpmVersion; import org.ovirt.engine.core.utils.serialization.json.JsonObjectDeserializer; import org.ovirt.engine.core.utils.serialization.json.JsonObjectSerializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.SingleColumnRowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; /** * {@code VdsDaoImpl} provides an implementation of {@link VdsDao}. */ @Named @Singleton public class VdsDynamicDaoImpl extends MassOperationsGenericDao<VdsDynamic, Guid> implements VdsDynamicDao { private static final Logger log = LoggerFactory.getLogger(VdsDynamicDaoImpl.class); public VdsDynamicDaoImpl() { super("VdsDynamic"); } private static final RowMapper<VdsDynamic> vdsDynamicRowMapper = (rs, rowNum) -> { VdsDynamic entity = new VdsDynamic(); entity.setCpuCores((Integer) rs.getObject("cpu_cores")); entity.setCpuThreads((Integer) rs.getObject("cpu_threads")); entity.setCpuModel(rs.getString("cpu_model")); entity.setOnlineCpus(rs.getString("online_cpus")); entity.setCpuSpeedMh(rs.getDouble("cpu_speed_mh")); entity.setIfTotalSpeed(rs.getString("if_total_speed")); entity.setKvmEnabled((Boolean) rs.getObject("kvm_enabled")); entity.setMemCommited((Integer) rs.getObject("mem_commited")); entity.setPhysicalMemMb((Integer) rs.getObject("physical_mem_mb")); entity.setStatus(VDSStatus.forValue(rs.getInt("status"))); entity.setId(getGuidDefaultEmpty(rs, "vds_id")); entity.setVmActive((Integer) rs.getObject("vm_active")); entity.setVmCount(rs.getInt("vm_count")); entity.setVmsCoresCount(rs.getInt("vms_cores_count")); entity.setVmMigrating((Integer) rs.getObject("vm_migrating")); entity.setIncomingMigrations(rs.getInt("incoming_migrations")); entity.setOutgoingMigrations(rs.getInt("outgoing_migrations")); entity.setReservedMem((Integer) rs.getObject("reserved_mem")); entity.setGuestOverhead(rs.getInt("guest_overhead")); entity.setSoftwareVersion(rs.getString("software_version")); entity.setVersionName(rs.getString("version_name")); entity.setVersion(new RpmVersion(rs.getString("rpm_version"))); entity.setBuildName(rs.getString("build_name")); entity.setPreviousStatus(VDSStatus.forValue(rs.getInt("previous_status"))); entity.setCpuFlags(rs.getString("cpu_flags")); entity.setPendingVcpusCount((Integer) rs.getObject("pending_vcpus_count")); entity.setPendingVmemSize(rs.getInt("pending_vmem_size")); entity.setCpuSockets((Integer) rs.getObject("cpu_sockets")); entity.setNetConfigDirty((Boolean) rs.getObject("net_config_dirty")); entity.setSupportedClusterLevels(rs.getString("supported_cluster_levels")); entity.setSupportedEngines(rs.getString("supported_engines")); entity.setHostOs(rs.getString("host_os")); entity.setKvmVersion(rs.getString("kvm_version")); entity.setLibvirtVersion(new RpmVersion(rs.getString("libvirt_version"))); entity.setSpiceVersion(rs.getString("spice_version")); entity.setGlusterVersion(new RpmVersion(rs.getString("gluster_version"))); entity.setLibrbdVersion(new RpmVersion(rs.getString("librbd1_version"))); entity.setGlusterfsCliVersion(new RpmVersion(rs.getString("glusterfs_cli_version"))); entity.setKernelVersion(rs.getString("kernel_version")); entity.setIScsiInitiatorName(rs.getString("iscsi_initiator_name")); entity.setTransparentHugePagesState(VdsTransparentHugePagesState .forValue(rs.getInt("transparent_hugepages_state"))); entity.setHooksStr(rs.getString("hooks")); entity.setNonOperationalReason(NonOperationalReason.forValue(rs.getInt("non_operational_reason"))); entity.setHardwareManufacturer(rs.getString("hw_manufacturer")); entity.setHardwareProductName(rs.getString("hw_product_name")); entity.setHardwareVersion(rs.getString("hw_version")); entity.setHardwareSerialNumber(rs.getString("hw_serial_number")); entity.setHardwareUUID(rs.getString("hw_uuid")); entity.setHardwareFamily(rs.getString("hw_family")); entity.setHBAs(new JsonObjectDeserializer().deserialize(rs.getString("hbas"), HashMap.class)); entity.setPowerManagementControlledByPolicy(rs.getBoolean("controlled_by_pm_policy")); entity.setKdumpStatus(KdumpStatus.valueOfNumber(rs.getInt("kdump_status"))); entity.setSELinuxEnforceMode((Integer) rs.getObject("selinux_enforce_mode")); entity.setAutoNumaBalancing(AutoNumaBalanceStatus.forValue(rs.getInt("auto_numa_balancing"))); entity.setNumaSupport(rs.getBoolean("is_numa_supported")); entity.setSupportedEmulatedMachines(rs.getString("supported_emulated_machines")); entity.getSupportedRngSources().addAll(VmRngDevice.csvToSourcesSet(rs.getString("supported_rng_sources"))); entity.setMaintenanceReason(rs.getString("maintenance_reason")); entity.setUpdateAvailable(rs.getBoolean("is_update_available")); entity.setExternalStatus(ExternalStatus.forValue(rs.getInt("external_status"))); entity.setHostDevicePassthroughEnabled(rs.getBoolean("is_hostdev_enabled")); entity.setKernelArgs(rs.getString("kernel_args")); entity.setPrettyName(rs.getString("pretty_name")); entity.setHostedEngineConfigured(rs.getBoolean("hosted_engine_configured")); return entity; }; @Override public VdsDynamic get(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vds_id", id); return getCallsHandler().executeRead("GetVdsDynamicByVdsId", vdsDynamicRowMapper, parameterSource); } @Override public void save(VdsDynamic vds) { getCallsHandler().executeModification("InsertVdsDynamic", createFullParametersMapperForSave(vds)); } @Override public void update(VdsDynamic vds) { getCallsHandler().executeModification("UpdateVdsDynamic", createFullParametersMapper(vds)); } @Override public void remove(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vds_id", id); getCallsHandler().executeModification("DeleteVdsDynamic", parameterSource); } @Override public List<VdsDynamic> getAll() { throw new UnsupportedOperationException(); } @Override public void updateStatus(Guid id, VDSStatus status) { MapSqlParameterSource parameterSource = getStatusSqlParameterSource(id, status); getCallsHandler().executeModification("UpdateVdsDynamicStatus", parameterSource); } @Override public void updateStatusAndReasons(VdsDynamic host) { MapSqlParameterSource parameterSource = getStatusSqlParameterSource(host.getId(), host.getStatus()); parameterSource.addValue("non_operational_reason", host.getNonOperationalReason()) .addValue("maintenance_reason", host.getMaintenanceReason()); getCallsHandler().executeModification("UpdateVdsDynamicStatusAndReasons", parameterSource); } @Override public boolean checkIfExistsHostWithStatusInCluster(Guid clusterId, VDSStatus hostStatus) { final MapSqlParameterSource customMapSqlParameterSource = getCustomMapSqlParameterSource() .addValue("cluster_id", clusterId) .addValue("host_status", hostStatus); return getCallsHandler().executeRead( "CheckIfExistsHostWithStatusInCluster", SingleColumnRowMapper.newInstance(Boolean.class), customMapSqlParameterSource); } private MapSqlParameterSource getStatusSqlParameterSource(Guid id, VDSStatus status) { return getCustomMapSqlParameterSource() .addValue("vds_guid", id) .addValue("status", status); } public void updateExternalStatus(Guid id, ExternalStatus status) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vds_guid", id) .addValue("external_status", status); getCallsHandler().executeModification("UpdateHostExternalStatus", parameterSource); } @Override public void updateNetConfigDirty(Guid id, Boolean netConfigDirty) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vds_guid", id) .addValue("net_config_dirty", netConfigDirty); getCallsHandler().executeModification("UpdateVdsDynamicNetConfigDirty", parameterSource); } @Override public void updateVdsDynamicPowerManagementPolicyFlag(Guid id, boolean controlledByPmPolicy) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vds_id", id) .addValue("controlled_by_pm_policy", controlledByPmPolicy); getCallsHandler().executeModification("UpdateVdsDynamicPowerManagementPolicyFlag", parameterSource); } private MapSqlParameterSource createFullParametersMapperForSave(VdsDynamic vds) { MapSqlParameterSource parameterSource = createFullParametersMapper(vds); parameterSource.addValue("controlled_by_pm_policy", vds.isPowerManagementControlledByPolicy()); return parameterSource; } @Override protected MapSqlParameterSource createFullParametersMapper(VdsDynamic vds) { return getCustomMapSqlParameterSource() .addValue("cpu_cores", vds.getCpuCores()) .addValue("cpu_threads", vds.getCpuThreads()) .addValue("cpu_model", vds.getCpuModel()) .addValue("online_cpus", vds.getOnlineCpus()) .addValue("cpu_speed_mh", vds.getCpuSpeedMh()) .addValue("if_total_speed", vds.getIfTotalSpeed()) .addValue("kvm_enabled", vds.getKvmEnabled()) .addValue("mem_commited", vds.getMemCommited()) .addValue("physical_mem_mb", vds.getPhysicalMemMb()) .addValue("status", vds.getStatus()) .addValue("vds_id", vds.getId()) .addValue("vm_active", vds.getVmActive()) .addValue("vm_count", vds.getVmCount()) .addValue("vms_cores_count", vds.getVmsCoresCount()) .addValue("vm_migrating", vds.getVmMigrating()) .addValue("incoming_migrations", vds.getIncomingMigrations()) .addValue("outgoing_migrations", vds.getOutgoingMigrations()) .addValue("reserved_mem", vds.getReservedMem()) .addValue("guest_overhead", vds.getGuestOverhead()) .addValue("rpm_version", vds.getVersion().getRpmName()) .addValue("software_version", vds.getSoftwareVersion()) .addValue("version_name", vds.getVersionName()) .addValue("build_name", vds.getBuildName()) .addValue("previous_status", vds.getPreviousStatus()) .addValue("cpu_flags", vds.getCpuFlags()) .addValue("pending_vcpus_count", vds.getPendingVcpusCount()) .addValue("pending_vmem_size", vds.getPendingVmemSize()) .addValue("cpu_sockets", vds.getCpuSockets()) .addValue("net_config_dirty", vds.getNetConfigDirty()) .addValue("supported_cluster_levels", vds.getSupportedClusterLevels()) .addValue("supported_engines", vds.getSupportedEngines()) .addValue("host_os", vds.getHostOs()) .addValue("kvm_version", vds.getKvmVersion()) .addValue("libvirt_version", vds.getLibvirtVersion().getRpmName()) .addValue("spice_version", vds.getSpiceVersion()) .addValue("gluster_version", vds.getGlusterVersion().getRpmName()) .addValue("librbd1_version", vds.getLibrbdVersion().getRpmName()) .addValue("glusterfs_cli_version", vds.getGlusterfsCliVersion().getRpmName()) .addValue("kernel_version", vds.getKernelVersion()) .addValue("iscsi_initiator_name", vds.getIScsiInitiatorName()) .addValue("transparent_hugepages_state", vds.getTransparentHugePagesState().getValue()) .addValue("hooks", vds.getHooksStr()) .addValue("non_operational_reason", vds.getNonOperationalReason().getValue()) .addValue("hw_manufacturer", vds.getHardwareManufacturer()) .addValue("hw_product_name", vds.getHardwareProductName()) .addValue("hw_version", vds.getHardwareVersion()) .addValue("hw_serial_number", vds.getHardwareSerialNumber()) .addValue("hw_uuid", vds.getHardwareUUID()) .addValue("hw_family", vds.getHardwareFamily()) .addValue("hbas", new JsonObjectSerializer().serialize(vds.getHBAs())) .addValue("supported_emulated_machines", vds.getSupportedEmulatedMachines()) .addValue("kdump_status", vds.getKdumpStatus().getAsNumber()) .addValue("selinux_enforce_mode", (vds.getSELinuxEnforceMode() != null) ? vds.getSELinuxEnforceMode().toInt() : null) .addValue("auto_numa_balancing", vds.getAutoNumaBalancing().getValue()) .addValue("is_numa_supported", vds.isNumaSupport()) .addValue("supported_rng_sources", VmRngDevice.sourcesToCsv(vds.getSupportedRngSources())) .addValue("supported_emulated_machines", vds.getSupportedEmulatedMachines()) .addValue("maintenance_reason", vds.getMaintenanceReason()) .addValue("is_update_available", vds.isUpdateAvailable()) .addValue("kernel_args", vds.getKernelArgs()) .addValue("is_hostdev_enabled", vds.isHostDevicePassthroughEnabled()) .addValue("pretty_name", vds.getPrettyName()) .addValue("hosted_engine_configured", vds.isHostedEngineConfigured()); } @Override protected MapSqlParameterSource createIdParameterMapper(Guid id) { return getCustomMapSqlParameterSource().addValue("vds_id", id); } @Override protected RowMapper<VdsDynamic> createEntityRowMapper() { return vdsDynamicRowMapper; } @Override public void updateIfNeeded(VdsDynamic vdsDynamic) { VdsDynamic dbData = get(vdsDynamic.getId()); if (!dbData.equals(vdsDynamic)) { update(vdsDynamic); } else { log.debug("Ignored an unneeded update of VdsDynamic"); } } @Override public void updateCpuFlags(Guid id, String cpuFlags) { getCallsHandler().executeModification( "updateCpuFlags", getCustomMapSqlParameterSource() .addValue("vds_id", id) .addValue("cpu_flags", cpuFlags)); } @Override public List<Guid> getIdsOfHostsWithStatus(VDSStatus status) { return getCallsHandler().executeReadList("GetIdsOfHostsWithStatus", createGuidMapper(), getCustomMapSqlParameterSource() .addValue("status", status.getValue())); } @Override public void updateUpdateAvailable(Guid id, boolean updateAvailable) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vds_guid", id) .addValue("is_update_available", updateAvailable); getCallsHandler().executeModification("UpdateVdsDynamicIsUpdateAvailable", parameterSource); } }