From b89d10b16440ea84705838df50b14219b99ef178 Mon Sep 17 00:00:00 2001 From: Mike Khiretskiy Date: Tue, 8 Sep 2015 10:40:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=B2=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=B7=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=20=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D0=B9?= =?UTF-8?q?=20=D1=81=D0=BE=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pym/builder/builder.py | 28 +++++++++++++++++++++++++ pym/builder/utils/cl_builder_break.py | 11 ++++++++-- pym/builder/utils/cl_builder_image.py | 13 +++++++++--- pym/builder/utils/cl_builder_profile.py | 11 ++++++++-- pym/builder/utils/cl_builder_restore.py | 11 ++++++++-- pym/builder/utils/cl_builder_update.py | 5 ++++- pym/builder/variables/action.py | 1 + pym/builder/wsdl_builder.py | 13 ++++++------ 8 files changed, 76 insertions(+), 17 deletions(-) diff --git a/pym/builder/builder.py b/pym/builder/builder.py index 13267cf..97dfa51 100644 --- a/pym/builder/builder.py +++ b/pym/builder/builder.py @@ -14,9 +14,11 @@ # See the License for the specific language governing permissions and # limitations under the License. from itertools import chain +import random import sys import time import stat +from calculate.core.server.gen_pid import search_worked_process2 from calculate.lib.datavars import DataVars from calculate.lib.utils.colortext import TextState, get_color_print, \ convert_console_to_xml @@ -41,6 +43,7 @@ import os from os import path from .datavars import BuilderError from .emerge_fetch import EmergeFetcher, EmergeFetcherError +from calculate.builder.variables.action import Actions from calculate.lib.cl_lang import (setLocalTranslate, getLazyLocalTranslate, _) setLocalTranslate('cl_builder3', sys.modules[__name__]) @@ -50,6 +53,15 @@ class Builder(Update): """Основной объект для выполнения действий связанных со сборкой системы """ + class Method: + Prepare = "builder_prepare" + Break = "builder_break" + Update = "builder_update" + Restore = "builder_restore" + Image = "builder_image" + Profile = "builder_profile" + All = (Prepare, Break, Update, Restore, Image, Profile) + def init(self): self.pretend_package_list = {} self.update_map = {} @@ -939,3 +951,19 @@ class Builder(Update): os.mknod(nodePath, mode | dmode, os.makedev(major, minor)) os.chmod(nodePath, mode) return True + + def check_build_run(self): + """ + Проверить повторный запуск + """ + build_id = self.clVars.Get('cl_builder_id') + names = self.Method.All + pid = os.getpid() + filter_func = lambda x: ('id' in x and x['id'] == build_id + and x['name'] in names + and x['os_pid'] != pid) + dv = self.clVars + if any(search_worked_process2(dv, filter_func=filter_func)): + raise BuilderError(_("Builder action for %s is already running. " + "Try to run later.")%build_id) + return True diff --git a/pym/builder/utils/cl_builder_break.py b/pym/builder/utils/cl_builder_break.py index 88e021b..84c860d 100644 --- a/pym/builder/utils/cl_builder_break.py +++ b/pym/builder/utils/cl_builder_break.py @@ -34,14 +34,21 @@ class ClBuilderBreakAction(Action): native_error = (DistributiveError, FilesError, BuilderError, GitError) successMessage = __("Assemble broken successfully") - failedMessage = __("Breaking the assemble is failed") + failedMessage = None interruptMessage = __("Breaking manually interrupted") # список задач для действия tasks = [ + {'name': 'check_build_run', + 'method': 'Builder.check_build_run()'}, {'name': 'close_build', 'message': __("Breaking {cl_builder_id} assemble"), 'method': 'Builder.close_build(cl_builder_build,cl_builder_clear_set)', 'condition': lambda Get: Get('cl_builder_build') - } + }, + {'name': 'failed', + 'error': __("Breaking the assemble is failed"), + 'depend': (Tasks.failed() & Tasks.hasnot("interrupt") & + Tasks.success_all("check_build_run")) + }, ] diff --git a/pym/builder/utils/cl_builder_image.py b/pym/builder/utils/cl_builder_image.py index cd97ddf..1ac70cb 100644 --- a/pym/builder/utils/cl_builder_image.py +++ b/pym/builder/utils/cl_builder_image.py @@ -34,11 +34,13 @@ class ClBuilderImageAction(Action): native_error = (DistributiveError, FilesError, BuilderError, GitError) successMessage = __("Image created successfully") - failedMessage = __("Creating the image is failed") + failedMessage = None interruptMessage = __("Image creating manually interrupted") # список задач для действия tasks = [ + {'name': 'check_build_run', + 'method': 'Builder.check_build_run()'}, {'name': 'clear_log', 'method': 'Builder.clear_log(cl_builder_id_path)', }, @@ -143,6 +145,11 @@ class ClBuilderImageAction(Action): 'warning': _("Restore build system resources"), 'method': 'Builder.mount_target(cl_builder_target)', 'condition': lambda Get: Get('cl_builder_build') - }] - } + },] + }, + {'name': 'failed', + 'error': __("Creating the image is failed"), + 'depend': (Tasks.failed() & Tasks.hasnot("interrupt") & + Tasks.success_all("check_build_run")) + }, ] diff --git a/pym/builder/utils/cl_builder_profile.py b/pym/builder/utils/cl_builder_profile.py index c312a31..92aaad4 100644 --- a/pym/builder/utils/cl_builder_profile.py +++ b/pym/builder/utils/cl_builder_profile.py @@ -36,11 +36,13 @@ class ClBuilderProfileAction(Action): BuilderError, GitError) successMessage = __("The profile was successfully updated") - failedMessage = __("Failed to update the profile") + failedMessage = None interruptMessage = __("Profile update manually interrupted") # список задач для действия tasks = [ + {'name': 'check_build_run', + 'method': 'Builder.check_build_run()'}, {'name': 'migrate_repository', 'method': 'Builder.migrateCacheRepository(' 'cl_builder_profile_url,cl_builder_profile_branch,' @@ -137,5 +139,10 @@ class ClBuilderProfileAction(Action): 'condition': lambda Get: Get('cl_dispatch_conf') != 'skip' }, ] - } + }, + {'name': 'failed', + 'error': __("Failed to update the profile"), + 'depend': (Tasks.failed() & Tasks.hasnot("interrupt") & + Tasks.success_all("check_build_run")) + }, ] diff --git a/pym/builder/utils/cl_builder_restore.py b/pym/builder/utils/cl_builder_restore.py index 1ba0330..0645244 100644 --- a/pym/builder/utils/cl_builder_restore.py +++ b/pym/builder/utils/cl_builder_restore.py @@ -15,7 +15,7 @@ # limitations under the License. import sys -from calculate.core.server.func import Action +from calculate.core.server.func import Action, Tasks from calculate.lib.cl_lang import setLocalTranslate, getLazyLocalTranslate from calculate.lib.utils.files import FilesError, isMount from ..datavars import BuilderError @@ -34,11 +34,13 @@ class ClBuilderRestoreAction(Action): native_error = (DistributiveError, FilesError, BuilderError, GitError) successMessage = __("Build was restored successfully") - failedMessage = __("Restoring the build is failed") + failedMessage = None interruptMessage = __("Restoring manually interrupted") # список задач для действия tasks = [ + {'name': 'check_build_run', + 'method': 'Builder.check_build_run()'}, {'name': 'restore_build', 'message': __("Restoring {cl_builder_id} assemble"), 'method': 'Builder.restore_build(cl_builder_build)', @@ -60,4 +62,9 @@ class ClBuilderRestoreAction(Action): 'message': __("Detach target"), 'method': 'Builder.detach_target(cl_builder_target)', }, + {'name': 'failed', + 'error': __("Restoring the build is failed"), + 'depend': (Tasks.failed() & Tasks.hasnot("interrupt") & + Tasks.success_all("check_build_run")) + }, ] diff --git a/pym/builder/utils/cl_builder_update.py b/pym/builder/utils/cl_builder_update.py index eb7dbb3..b13dcd5 100644 --- a/pym/builder/utils/cl_builder_update.py +++ b/pym/builder/utils/cl_builder_update.py @@ -61,6 +61,8 @@ class ClBuilderUpdateAction(Action): # список задач для действия tasks = [ + {'name': 'check_build_run', + 'method': 'Builder.check_build_run()'}, {'name': 'clear_log', 'method': 'Builder.clear_log(cl_builder_id_path)', }, @@ -299,7 +301,8 @@ class ClBuilderUpdateAction(Action): ] + [ {'name': 'failed', 'error': __("Failed to update the system"), - 'depend': (Tasks.failed() & Tasks.hasnot("interrupt")) + 'depend': (Tasks.failed() & Tasks.hasnot("interrupt") & + Tasks.success_all("check_build_run")) }, # сообщение удачного завершения при обновлении ревизии {'name': 'update_other:success_rev', diff --git a/pym/builder/variables/action.py b/pym/builder/variables/action.py index 399a584..534280b 100644 --- a/pym/builder/variables/action.py +++ b/pym/builder/variables/action.py @@ -28,6 +28,7 @@ class Actions: Restore = "restore" Update = "assemble_update" ChangeProfile = "builder_profile" + All = (Prepare, Image, Break, Restore, Update, ChangeProfile) NewAssemble = (Prepare,) WorkAssemble = (Image, Break, ChangeProfile, Update) diff --git a/pym/builder/wsdl_builder.py b/pym/builder/wsdl_builder.py index 4f8bf7f..67e9cf3 100644 --- a/pym/builder/wsdl_builder.py +++ b/pym/builder/wsdl_builder.py @@ -36,7 +36,6 @@ from calculate.lib.cl_lang import setLocalTranslate,getLazyLocalTranslate setLocalTranslate('cl_builder3',sys.modules[__name__]) __ = getLazyLocalTranslate(_) - class Wsdl(WsdlBase): methods = [ # @@ -44,7 +43,7 @@ class Wsdl(WsdlBase): # { # идентификатор метода - 'method_name': "builder_prepare", + 'method_name': Builder.Method.Prepare, # категория метода 'category': __('Builder'), # заголовок метода Подготовить новую сборку @@ -104,7 +103,7 @@ class Wsdl(WsdlBase): }, { # идентификатор метода - 'method_name': "builder_break", + 'method_name': Builder.Method.Break, # категория метода 'category': __('Builder'), # заголовок метода @@ -137,7 +136,7 @@ class Wsdl(WsdlBase): }, { # идентификатор метода - 'method_name': "builder_update", + 'method_name': Builder.Method.Update, # категория метода 'category': __('Builder'), # заголовок метода @@ -193,7 +192,7 @@ class Wsdl(WsdlBase): }, { # идентификатор метода - 'method_name': "builder_restore", + 'method_name': Builder.Method.Restore, # категория метода 'category': __('Builder'), # заголовок метода @@ -227,7 +226,7 @@ class Wsdl(WsdlBase): }, { # идентификатор метода - 'method_name': "builder_image", + 'method_name': Builder.Method.Image, # категория метода 'category': __('Builder'), # заголовок метода @@ -298,7 +297,7 @@ class Wsdl(WsdlBase): # { # идентификатор метода - 'method_name': "builder_profile", + 'method_name': Builder.Method.Profile, # категория метода 'category': __('Builder'), # заголовок метода