Skip to contentSkip to conversation

selftest/eSDK.py: Cleanup when there is an error in setUpClass

PATCH In review [email protected] 2 participants 2 messages Feb 22, 2017 – Feb 23, 2017 1 message not in the archive

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

PATCH 1/1 selftest/eSDK.py: Cleanup when there is an error in setUpClass

From: Mariano Lopez <[email protected]>

Lately autobuilders are experiencing hangs with selftest, it seems it is cause if an error happens in setUpClass method of oeSDKExtSelfTest class because HTTP server keeps running in background.

This patch will ensure tearDownClass will be run if there is an error in setUpClass.

---
 meta/lib/oeqa/selftest/eSDK.py | 46 +++++++++++++++++++++++-------------------
 1 file changed, 25 insertions(+), 21 deletions(-)
meta/lib/oeqa/selftest/eSDK.py +25 -21
index ee1ca6a..b68e997 100644
@@ -64,7 +64,7 @@ class oeSDKExtSelfTest(oeSelfTest):
         runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA))
 
         cls.env_eSDK = oeSDKExtSelfTest.get_esdk_environment('', cls.tmpdir_eSDKQA)
-       
+
         sstate_config="""
 SDK_LOCAL_CONF_WHITELIST = "SSTATE_MIRRORS"
 SSTATE_MIRRORS =  "file://.* http://%s/PATH"
@@ -73,37 +73,41 @@ CORE_IMAGE_EXTRA_INSTALL = "perl"
 
         with open(os.path.join(cls.tmpdir_eSDKQA, 'conf', 'local.conf'), 'a+') as f:
             f.write(sstate_config)
-    
 
     @classmethod
     def setUpClass(cls):
-        # Start to serve sstate dir
-        sstate_dir = get_bb_var('SSTATE_DIR')
-        cls.http_service = HTTPService(sstate_dir)
-        cls.http_service.start()
+        # If there is an exception in setUpClass it will not run tearDownClass
+        # method and it leaves HTTP server running forever, so we need to be
+        # sure tearDownClass is run.
+        try:
+            cls.tmpdir_eSDKQA = tempfile.mkdtemp(prefix='eSDKQA')
 
-        cls.http_url = "http://127.0.0.1:%d" % cls.http_service.port
- 
-        cls.image = 'core-image-minimal'
+            # Start to serve sstate dir
+            sstate_dir = get_bb_var('SSTATE_DIR')
+            cls.http_service = HTTPService(sstate_dir)
+            cls.http_url = "http://127.0.0.1:%d" % cls.http_service.port
+            cls.http_service.start()
 
-        cls.tmpdir_eSDKQA = tempfile.mkdtemp(prefix='eSDKQA')
-        oeSDKExtSelfTest.generate_eSDK(cls.image)
+            cls.image = 'core-image-minimal'
+            oeSDKExtSelfTest.generate_eSDK(cls.image)
 
-        # Install eSDK
-        cls.ext_sdk_path = oeSDKExtSelfTest.get_eSDK_toolchain(cls.image)
-        runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA))
+            # Install eSDK
+            cls.ext_sdk_path = oeSDKExtSelfTest.get_eSDK_toolchain(cls.image)
+            runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA))
 
-        cls.env_eSDK = oeSDKExtSelfTest.get_esdk_environment('', cls.tmpdir_eSDKQA)
+            cls.env_eSDK = oeSDKExtSelfTest.get_esdk_environment('', cls.tmpdir_eSDKQA)
 
-        # Configure eSDK to use sstate mirror from poky
-        sstate_config="""
+            # Configure eSDK to use sstate mirror from poky
+            sstate_config="""
 SDK_LOCAL_CONF_WHITELIST = "SSTATE_MIRRORS"
 SSTATE_MIRRORS =  "file://.* http://%s/PATH"
-        """ % cls.http_url
-        with open(os.path.join(cls.tmpdir_eSDKQA, 'conf', 'local.conf'), 'a+') as f:
-            f.write(sstate_config)
+            """ % cls.http_url
+            with open(os.path.join(cls.tmpdir_eSDKQA, 'conf', 'local.conf'), 'a+') as f:
+                f.write(sstate_config)
+        except:
+            cls.tearDownClass()
+            raise
 
-      
     @classmethod
     def tearDownClass(cls):
         shutil.rmtree(cls.tmpdir_eSDKQA)
Signature · 1 line
2.6.6
#2 lore raw

Mariano,

Quoted 6 lines · On 02/22/2017 05:12 AM, [email protected] wrote:

From: Mariano Lopez <[email protected]>

Lately autobuilders are experiencing hangs with selftest, it seems it is cause if an error happens in setUpClass method of oeSDKExtSelfTest class because HTTP server keeps running in background.

Any issue if Morty gets this?
- armin

Quoted 83 lines

This patch will ensure tearDownClass will be run if there is an error in setUpClass.

---
  meta/lib/oeqa/selftest/eSDK.py | 46 +++++++++++++++++++++++-------------------
  1 file changed, 25 insertions(+), 21 deletions(-)
meta/lib/oeqa/selftest/eSDK.py +25 -21
index ee1ca6a..b68e997 100644
@@ -64,7 +64,7 @@ class oeSDKExtSelfTest(oeSelfTest):
          runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA))
 
          cls.env_eSDK = oeSDKExtSelfTest.get_esdk_environment('', cls.tmpdir_eSDKQA)
-
+
          sstate_config="""
  SDK_LOCAL_CONF_WHITELIST = "SSTATE_MIRRORS"
  SSTATE_MIRRORS =  "file://.* http://%s/PATH"
@@ -73,37 +73,41 @@ CORE_IMAGE_EXTRA_INSTALL = "perl"
 
          with open(os.path.join(cls.tmpdir_eSDKQA, 'conf', 'local.conf'), 'a+') as f:
              f.write(sstate_config)
-
 
      @classmethod
      def setUpClass(cls):
-        # Start to serve sstate dir
-        sstate_dir = get_bb_var('SSTATE_DIR')
-        cls.http_service = HTTPService(sstate_dir)
-        cls.http_service.start()
+        # If there is an exception in setUpClass it will not run tearDownClass
+        # method and it leaves HTTP server running forever, so we need to be
+        # sure tearDownClass is run.
+        try:
+            cls.tmpdir_eSDKQA = tempfile.mkdtemp(prefix='eSDKQA')
 
-        cls.http_url = "http://127.0.0.1:%d" % cls.http_service.port
-
-        cls.image = 'core-image-minimal'
+            # Start to serve sstate dir
+            sstate_dir = get_bb_var('SSTATE_DIR')
+            cls.http_service = HTTPService(sstate_dir)
+            cls.http_url = "http://127.0.0.1:%d" % cls.http_service.port
+            cls.http_service.start()
 
-        cls.tmpdir_eSDKQA = tempfile.mkdtemp(prefix='eSDKQA')
-        oeSDKExtSelfTest.generate_eSDK(cls.image)
+            cls.image = 'core-image-minimal'
+            oeSDKExtSelfTest.generate_eSDK(cls.image)
 
-        # Install eSDK
-        cls.ext_sdk_path = oeSDKExtSelfTest.get_eSDK_toolchain(cls.image)
-        runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA))
+            # Install eSDK
+            cls.ext_sdk_path = oeSDKExtSelfTest.get_eSDK_toolchain(cls.image)
+            runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA))
 
-        cls.env_eSDK = oeSDKExtSelfTest.get_esdk_environment('', cls.tmpdir_eSDKQA)
+            cls.env_eSDK = oeSDKExtSelfTest.get_esdk_environment('', cls.tmpdir_eSDKQA)
 
-        # Configure eSDK to use sstate mirror from poky
-        sstate_config="""
+            # Configure eSDK to use sstate mirror from poky
+            sstate_config="""
  SDK_LOCAL_CONF_WHITELIST = "SSTATE_MIRRORS"
  SSTATE_MIRRORS =  "file://.* http://%s/PATH"
-        """ % cls.http_url
-        with open(os.path.join(cls.tmpdir_eSDKQA, 'conf', 'local.conf'), 'a+') as f:
-            f.write(sstate_config)
+            """ % cls.http_url
+            with open(os.path.join(cls.tmpdir_eSDKQA, 'conf', 'local.conf'), 'a+') as f:
+                f.write(sstate_config)
+        except:
+            cls.tearDownClass()
+            raise
 
-
      @classmethod
      def tearDownClass(cls):
          shutil.rmtree(cls.tmpdir_eSDKQA)