Добавлена проверка на одновременный запуск действий со сборкой

Mike Khiretskiy 9 years ago
parent 90975d333b
commit b89d10b164

@ -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

@ -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"))
},
]

@ -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"))
},
]

@ -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"))
},
]

@ -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"))
},
]

@ -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',

@ -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)

@ -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'),
# заголовок метода

Loading…
Cancel
Save