From fde6fb08706c1a045429b78727b50278a2c2ab88 Mon Sep 17 00:00:00 2001
From: Roque <roqueporchetto@gmail.com>
Date: Mon, 19 Mar 2018 21:18:28 +0100
Subject: [PATCH] scalability: destroy frontend instance only if software
 changes

---
 erp5/util/testnode/ScalabilityTestRunner.py | 39 +++++++++++++++++++--
 1 file changed, 37 insertions(+), 2 deletions(-)

diff --git a/erp5/util/testnode/ScalabilityTestRunner.py b/erp5/util/testnode/ScalabilityTestRunner.py
index 39db9c3fc0..607d467700 100644
--- a/erp5/util/testnode/ScalabilityTestRunner.py
+++ b/erp5/util/testnode/ScalabilityTestRunner.py
@@ -44,6 +44,7 @@ import httplib
 import Utils
 import requests
 import slapos.slap
+import cPickle as pickle
 from ProcessManager import SubprocessError, ProcessManager, CancellationError
 from subprocess import CalledProcessError
 from Updater import Updater
@@ -90,6 +91,7 @@ HTPASSWD = "/.htpasswd"
 PASSWORD_FILE = "/sr_pass"
 PASSWORD_LENGTH = 10
 HOSTFILE = "/hosts"
+SR_DICT = "frontend_software_dict"
 
 class ScalabilityTestRunner():
   def __init__(self, testnode):
@@ -367,15 +369,43 @@ Require valid-user
       software_file.write(line)
     software_file.close()
 
+  def newFrontendMasterSoftware(self, frontend_master_reference, frontend_software):
+    def getSoftwareDictionary(software_dict_file):
+      software_dict = {}
+      if os.path.isfile(software_dict_file):
+        with open(software_dict_file, 'r') as file:
+          software_dict = pickle.loads(file.read())
+      return software_dict
+    def updateSoftwareDictionary(software_dict_file, software_dict, frontend_master_reference, frontend_software):
+      software_dict[frontend_master_reference] = frontend_software
+      with open(software_dict_file, 'w') as file:
+        file.write(pickle.dumps(software_dict))
+    frontend_master_reference = frontend_master_reference.replace(";",",")
+    slappart_directory = self.testnode.config['srv_directory'].rsplit("srv", 1)[0]
+    software_dict_file = slappart_directory + "var/" + SR_DICT
+    software_dict = getSoftwareDictionary(software_dict_file)
+    if frontend_master_reference in software_dict:
+      if software_dict[frontend_master_reference] != frontend_software:
+        updateSoftwareDictionary(software_dict_file, software_dict, frontend_master_reference, frontend_software)
+        return True
+    else:
+      updateSoftwareDictionary(software_dict_file, software_dict, frontend_master_reference, frontend_software)
+      return True
+    return False
+
   def prepareFrontendMasterInstance(self, computer, frontend_software, test_suite_title):
     self.frontend_master_reference = "Scalability-Frontend-Master-"
     self.frontend_master_reference += "("+test_suite_title+")-"
     self.frontend_master_reference += str(computer).replace("'","")
-    self.frontend_master_reference += "-root"
+    restart = True
     slap, supply, order = self._initializeSlapOSConnection()
     slapos_communicator = SlapOSMasterCommunicator.SlapOSTester(
 				self.frontend_master_reference, slap, order, supply,
 				frontend_software, computer_guid=computer)
+    # Destroy old frontend instance if frontend software has changed for this testsuite
+    if self.newFrontendMasterSoftware(self.frontend_master_reference, frontend_software):
+      restart = False
+      slapos_communicator.requestInstanceDestroy(self.frontend_master_reference)
     # Ask for software installation
     start_time = time.time()
     slapos_communicator.supply(frontend_software, computer)
@@ -393,11 +423,16 @@ Require valid-user
     logger.info("Master Frontend instance started.")
     frontend_master_dict = slapos_communicator.getMasterFrontendDict()
     if not frontend_master_dict['frontend_master_ipv6']:
-      raise ValueError("ERROR with master frontend: ipv6 url not found")
+      raise ValueError("ERROR in master frontend: ipv6 url not found")
     if not frontend_master_dict['instance_guid']:
       raise ValueError("ERROR in master frontend: instance guid not found")
     parsed_url = urlparse.urlparse(frontend_master_dict['frontend_master_ipv6'])
     self.frontend_master_ipv6 = parsed_url.hostname
+    if restart:
+      slapos_communicator.requestInstanceStop(self.frontend_master_reference, master_request_kw)
+      slapos_communicator.waitInstanceStopped(self.frontend_master_reference)
+      slapos_communicator.requestInstanceStart(self.frontend_master_reference, master_request_kw)
+      slapos_communicator.waitInstanceStarted(self.frontend_master_reference)
     return frontend_master_dict['instance_guid']
 
   def prepareSlapOSForTestSuite(self, node_test_suite):
-- 
2.30.9