Shahar Havivi has uploaded a new change for review. Change subject: core: notification to the user that a new client tools are available ......................................................................
core: notification to the user that a new client tools are available Adding guest_agent_status for vm_dynamic for storing the if update of the client tools is needed. On IsoDomainListSyncronizer check for new isos (periodically or user initiative) relevant VMs are set with the status if a newer tools are present in iso domain. Change-Id: If098422eb76295517022de1c7f716db354e7853e Signed-off-by: Shahar Havivi <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/GuestAgentStatus.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmDynamic.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDynamicDAODbFacadeImpl.java M frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml M packaging/dbscripts/create_views.sql A packaging/dbscripts/upgrade/03_06_0695_add_guest_agent_status_to_vm_dynamic.sql M packaging/dbscripts/vms_sp.sql 10 files changed, 125 insertions(+), 7 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/56/36556/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java index b1a688b..b27a82a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java @@ -681,6 +681,9 @@ repoStorageDom, fileStats, ImageFileType.ISO); + if (refreshIsoSucceeded) { + VmHandler.refreshVmsToolsVersion(repoStoragePoolId, fileStats.keySet()); + } } } catch (Exception e) { refreshIsoSucceeded = false; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java index acc0497..502e2c9 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java @@ -10,6 +10,8 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -37,6 +39,7 @@ import org.ovirt.engine.core.common.businessentities.EditableOnVmStatusField; import org.ovirt.engine.core.common.businessentities.GraphicsDevice; import org.ovirt.engine.core.common.businessentities.GraphicsType; +import org.ovirt.engine.core.common.businessentities.GuestAgentStatus; import org.ovirt.engine.core.common.businessentities.NumaTuneMode; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; @@ -945,4 +948,46 @@ } return result; } + + private static final Pattern TOOLS_PATTERN = Pattern.compile(".*rhev-tools\\s+([\\d\\.]+).*"); + private static final Pattern ISO_VERSION_PATTERN = Pattern.compile(".*rhev-toolssetup_(\\d\\.\\d\\_\\d).*"); + + public static void refreshVmsToolsVersion(Guid poolId, Set<String> isoList) { + //List<VM> vms = DbFacade.getInstance().getVmDao().getAllForVmPool(poolId); + List<VDSGroup> clusters = DbFacade.getInstance().getVdsGroupDao().getAllForStoragePool(poolId); + for (VDSGroup cluster: clusters) { + List<VM> vms = DbFacade.getInstance().getVmDao().getAllForVdsGroup(cluster.getId()); + for (VM vm : vms) { + if (vm.getAppList() != null && vm.getAppList().toLowerCase().contains("rhev-tools")) { + Matcher m = TOOLS_PATTERN.matcher(vm.getAppList().toLowerCase()); + if (m.matches()) { + GuestAgentStatus oldStatus = vm.getGuestAgentStatus(); + GuestAgentStatus currStatus = getAgentStatus(m.group(1), isoList); + if (oldStatus != currStatus) { + vm.setGuestAgentStatus(currStatus); + DbFacade.getInstance().getVmDynamicDao().update(vm.getDynamicData()); + } + } + } + } + } + } + + private static GuestAgentStatus getAgentStatus(String toolsVersion, Set<String> isoList) { + GuestAgentStatus retVal = GuestAgentStatus.DoesntExists; + for (String iso: isoList) { + if (iso.toLowerCase().contains("rhev-toolssetup")) { + Matcher m = ISO_VERSION_PATTERN.matcher(iso.toLowerCase()); + if (m.matches()) { + String isoVersion = m.group(1).replace('_', '.'); + if (toolsVersion.compareTo(isoVersion) < 0) { + return GuestAgentStatus.UpdateNeeded; + } else { + retVal = GuestAgentStatus.Exists; + } + } + } + } + return retVal; + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/GuestAgentStatus.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/GuestAgentStatus.java new file mode 100644 index 0000000..588d7e9 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/GuestAgentStatus.java @@ -0,0 +1,32 @@ +package org.ovirt.engine.core.common.businessentities; + +import java.util.HashMap; +import java.util.Map; + +public enum GuestAgentStatus { + DoesntExists(0), + Exists(1), + UpdateNeeded(2); + + private static final Map<Integer, GuestAgentStatus> mappings = new HashMap<Integer, GuestAgentStatus>(); + private int value; + + static { + mappings.put(0, DoesntExists); + mappings.put(1, Exists); + mappings.put(2, UpdateNeeded); + } + + GuestAgentStatus(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static GuestAgentStatus forValue(int value) { + return mappings.get(value); + } + +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java index 6ec5de1..a7921238 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java @@ -755,6 +755,14 @@ vmDynamic.setGuestAgentNicsHash(guestAgentNicsHash); } + public GuestAgentStatus getGuestAgentStatus() { + return vmDynamic.getGuestAgentStatus(); + } + + public void setGuestAgentStatus(GuestAgentStatus status) { + vmDynamic.setGuestAgentStatus(status); + } + public Double getCpuUser() { return this.vmStatistics.getcpu_user(); } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmDynamic.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmDynamic.java index ad2c554..c3c3f62 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmDynamic.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmDynamic.java @@ -69,6 +69,8 @@ @UnchangeableByVdsm private String cpuName; @UnchangeableByVdsm + private GuestAgentStatus guestAgentStatus; + @UnchangeableByVdsm private String emulatedMachine; private String currentCd; @UnchangeableByVdsm @@ -124,6 +126,7 @@ result = prime * result + (lastWatchdogAction == null ? 0 : lastWatchdogAction.hashCode()); result = prime * result + (runOnce ? 1231 : 1237); result = prime * result + (cpuName == null ? 0 : cpuName.hashCode()); + result = prime * result + (guestAgentStatus == null ? 0 : guestAgentStatus.hashCode()); result = prime * result + (currentCd == null ? 0 : currentCd.hashCode()); result = prime * result + (stopReason == null ? 0 : stopReason.hashCode()); result = prime * result + exitReason.hashCode(); @@ -184,6 +187,7 @@ && ObjectUtils.objectsEqual(lastWatchdogAction, other.lastWatchdogAction) && runOnce == other.runOnce && ObjectUtils.objectsEqual(cpuName, other.cpuName) + && ObjectUtils.objectsEqual(guestAgentStatus, other.guestAgentStatus) && ObjectUtils.objectsEqual(currentCd, other.currentCd) && ObjectUtils.objectsEqual(stopReason, other.stopReason) && exitReason == other.exitReason @@ -252,6 +256,7 @@ bootSequence = BootSequence.C; exitReason = VmExitReason.Unknown; graphicsInfos = new HashMap<GraphicsType, GraphicsInfo>(); + guestAgentStatus = GuestAgentStatus.DoesntExists; } public String getAppList() { @@ -560,6 +565,13 @@ public void setCpuName(String cpuName) { this.cpuName = cpuName; } + public GuestAgentStatus getGuestAgentStatus() { + return guestAgentStatus; + } + + public void setGuestAgentStatus(GuestAgentStatus guestAgentStatus) { + this.guestAgentStatus = guestAgentStatus; + } public String getCurrentCd() { return currentCd; diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDynamicDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDynamicDAODbFacadeImpl.java index 42d760b..803a028 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDynamicDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDynamicDAODbFacadeImpl.java @@ -4,11 +4,13 @@ import java.sql.SQLException; import java.util.List; import java.util.Map; + import org.apache.commons.lang.NotImplementedException; import org.ovirt.engine.core.common.businessentities.BootSequence; import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.GraphicsInfo; import org.ovirt.engine.core.common.businessentities.GraphicsType; +import org.ovirt.engine.core.common.businessentities.GuestAgentStatus; import org.ovirt.engine.core.common.businessentities.SessionState; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmDynamic; @@ -126,6 +128,7 @@ .addValue("last_watchdog_action", vm.getLastWatchdogAction()) .addValue("is_run_once", vm.isRunOnce()) .addValue("cpu_name", vm.getCpuName()) + .addValue("guest_agent_status", vm.getGuestAgentStatus().getValue()) .addValue("current_cd", vm.getCurrentCd()) .addValue("reason", vm.getStopReason()) .addValue("exit_reason", vm.getExitReason().getValue()) @@ -189,6 +192,7 @@ entity.setLastWatchdogAction(rs.getString("last_watchdog_action")); entity.setRunOnce(rs.getBoolean("is_run_once")); entity.setCpuName(rs.getString("cpu_name")); + entity.setGuestAgentStatus(GuestAgentStatus.forValue(rs.getInt("guest_agent_status"))); entity.setCurrentCd(rs.getString("current_cd")); entity.setStopReason(rs.getString("reason")); VmExitReason exitReason = VmExitReason.forValue(rs.getInt("exit_reason")); diff --git a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml index 106278f..329b56d 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml +++ b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml @@ -162,6 +162,7 @@ <include name="common/businessentities/VmDeviceId.java" /> <include name="common/businessentities/VmExitReason.java" /> <include name="common/businessentities/VmExitStatus.java" /> + <include name="common/businessentities/GuestAgentStatus.java" /> <include name="common/businessentities/VmJob.java" /> <include name="common/businessentities/VmJobState.java" /> <include name="common/businessentities/VmJobType.java" /> diff --git a/packaging/dbscripts/create_views.sql b/packaging/dbscripts/create_views.sql index 0224f22..7ba5087 100644 --- a/packaging/dbscripts/create_views.sql +++ b/packaging/dbscripts/create_views.sql @@ -736,7 +736,8 @@ vm_dynamic.spice_tls_port as spice_tls_port, vm_dynamic.spice_ip as spice_ip, vm_dynamic.vnc_port as vnc_port, - vm_dynamic.vnc_ip as vnc_ip + vm_dynamic.vnc_ip as vnc_ip, + vm_dynamic.guest_agent_status as guest_agent_status FROM vm_static INNER JOIN vm_dynamic ON vm_static.vm_guid = vm_dynamic.vm_guid INNER JOIN vm_static AS vm_templates ON vm_static.vmt_guid = vm_templates.vm_guid INNER JOIN @@ -791,7 +792,8 @@ vms.spice_tls_port, vms.spice_ip, vms.vnc_port, - vms.vnc_ip + vms.vnc_ip, + vms.guest_agent_status FROM vms LEFT OUTER JOIN tags_vm_map_view ON vms.vm_guid = tags_vm_map_view.vm_id LEFT OUTER JOIN vm_device ON vm_device.vm_id = vms.vm_guid LEFT OUTER JOIN diff --git a/packaging/dbscripts/upgrade/03_06_0695_add_guest_agent_status_to_vm_dynamic.sql b/packaging/dbscripts/upgrade/03_06_0695_add_guest_agent_status_to_vm_dynamic.sql new file mode 100644 index 0000000..5212bc4 --- /dev/null +++ b/packaging/dbscripts/upgrade/03_06_0695_add_guest_agent_status_to_vm_dynamic.sql @@ -0,0 +1,6 @@ +-- add guest_agent_status field to vm_dynamic +-- values can be: +-- Exists +-- DoesntExists +-- UpdateNeeded +SELECT fn_db_add_column('vm_dynamic', 'guest_agent_status', 'int default 0'); diff --git a/packaging/dbscripts/vms_sp.sql b/packaging/dbscripts/vms_sp.sql index 74ef317..935646b 100644 --- a/packaging/dbscripts/vms_sp.sql +++ b/packaging/dbscripts/vms_sp.sql @@ -279,7 +279,8 @@ v_spice_tls_port INTEGER, v_spice_ip varchar(32), v_vnc_port INTEGER, -v_vnc_ip varchar(32) +v_vnc_ip varchar(32), +v_guest_agent_status INTEGER ) RETURNS VOID AS $procedure$ @@ -289,7 +290,8 @@ spice_tls_port, spice_ip, vnc_port, -vnc_ip +vnc_ip, +guest_agent_status ) VALUES(v_app_list, v_guest_cur_user_name, v_console_cur_user_name, v_guest_last_login_time, v_guest_last_logout_time, v_console_user_id, v_guest_os, v_migrating_to_vds, v_run_on_vds, v_status, v_vm_guid, v_vm_host, v_vm_ip, v_last_start_time, v_last_stop_time, v_vm_pid, v_display, v_acpi_enable, v_session, v_display_ip, v_display_type, v_kvm_enable, v_boot_sequence, v_display_secure_port, v_utc_diff, v_last_vds_run_on, v_client_ip, v_guest_requested_memory, v_hibernation_vol_handle, v_exit_status, v_pause_status, v_exit_message, v_guest_agent_nics_hash, v_last_watchdog_event, v_last_watchdog_action, v_is_run_once, v_vm_fqdn, v_cpu_name, v_emulated_machine, v_current_cd, v_exit_reason, v_guest_cpu_count, @@ -297,7 +299,8 @@ v_spice_tls_port, v_spice_ip, v_vnc_port, -v_vnc_ip +v_vnc_ip, +v_guest_agent_status ); END; $procedure$ LANGUAGE plpgsql; @@ -352,7 +355,8 @@ v_spice_tls_port INTEGER, v_spice_ip varchar(32), v_vnc_port INTEGER, - v_vnc_ip varchar(32) + v_vnc_ip varchar(32), + v_guest_agent_status INTEGER ) RETURNS VOID @@ -386,7 +390,8 @@ spice_tls_port = v_spice_tls_port, spice_ip = v_spice_ip, vnc_port = v_vnc_port, - vnc_ip = v_vnc_ip + vnc_ip = v_vnc_ip, + guest_agent_status = v_guest_agent_status WHERE vm_guid = v_vm_guid; END; $procedure$ LANGUAGE plpgsql; -- To view, visit http://gerrit.ovirt.org/36556 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If098422eb76295517022de1c7f716db354e7853e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Shahar Havivi <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
