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

Reply via email to