File indexing completed on 2026-04-09 07:58:20
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 """
0013 operations related to Health.
0014 """
0015
0016 import datetime
0017 import re
0018
0019 from sqlalchemy.exc import DatabaseError, IntegrityError
0020
0021 from idds.common import exceptions
0022 from idds.common.constants import RequestGroupType, RequestGroupStatus, RequestGroupLocking
0023 from idds.orm.base import models
0024 from idds.orm.base.session import read_session, transactional_session
0025
0026
0027 @transactional_session
0028 def add_request_group(campaign=None, campaign_scope=None, campaign_group=None, campaign_tag=None, requester=None,
0029 username=None, userdn=None, priority=0, group_type=RequestGroupType.Workflow,
0030 status=RequestGroupStatus.New, locking=RequestGroupLocking.Idle, lifetime=None,
0031 new_retries=0, update_retries=0, max_new_retries=3, max_update_retries=0,
0032 new_poll_period=1, update_poll_period=10, group_metadata=None, processing_metadata=None,
0033 max_processing_requests=-1, session=None):
0034 """
0035 Add a request group.
0036
0037 :param campaign: The campaign name.
0038 :param campaign_scope: The campaign scope.
0039 :param campaign_group: The campaign group.
0040 :param campaign_tag: The campaign tag.
0041 :param requester: The requester name.
0042 :param username: The user name.
0043 :param userdn: The user dn.
0044 :param priority: The priority.
0045 :param group_type: The group type.
0046 :param status: The request status as integer.
0047 :param group_metadata: The metadata as json.
0048 :param processing_metadata: The metadata as json.
0049 :param session: The database session.
0050
0051 :returns group id.
0052 """
0053
0054 try:
0055 if lifetime:
0056 expired_at = datetime.datetime.utcnow() + datetime.timedelta(days=lifetime)
0057 else:
0058 expired_at = None
0059
0060 if new_poll_period:
0061 new_poll_period = datetime.timedelta(seconds=new_poll_period)
0062 if update_poll_period:
0063 update_poll_period = datetime.timedelta(seconds=update_poll_period)
0064
0065 new_group = models.RequestGroup(campaign=campaign, campaign_scope=campaign_scope, campaign_group=campaign_group,
0066 campaign_tag=campaign_tag, requester=requester, username=username, userdn=userdn,
0067 priority=priority, group_type=group_type, status=status, locking=locking,
0068 expired_at=expired_at, new_retries=new_retries, update_retries=update_retries,
0069 max_new_retries=max_new_retries, max_update_retries=max_update_retries,
0070 new_poll_period=new_poll_period, update_poll_period=update_poll_period,
0071 group_metadata=group_metadata, processing_metadata=processing_metadata,
0072 max_processing_requests=max_processing_requests)
0073
0074 new_group.save(session=session)
0075 group_id = new_group.group_id
0076 return group_id
0077 except IntegrityError as e:
0078 if re.match('.*ORA-00001.*', e.args[0]) or re.match('.*unique constraint.*', e.args[0]):
0079 print("unique constraintviolated: %s" % str(e))
0080 except DatabaseError as e:
0081 raise exceptions.DatabaseException('Could not persist request group info: %s' % str(e))
0082
0083
0084 @read_session
0085 def get_request_groups(campaign=None, campaign_scope=None, campaign_group=None, campaign_tag=None, group_id=None, session=None):
0086 """
0087 Retrieve request groups.
0088
0089 :param campaign: The campaign name.
0090 :param campaign_scope: The campaign scope.
0091 :param campaign_group: The campaign group.
0092 :param campaign_tag: The campaign tag.
0093 :param group_id: The group id.
0094 :param session: The database session.
0095
0096 :returns request groups: list of request groups
0097 """
0098 try:
0099 query = session.query(models.RequestGroup)
0100
0101 if group_id is not None:
0102 query = query.filter(models.RequestGroup.group_id == group_id)
0103
0104 if campaign:
0105 query = query.filter(models.RequestGroup.campaign == campaign)
0106 if campaign_scope:
0107 query = query.filter(models.RequestGroup.campaign_scope == campaign_scope)
0108 if campaign_group:
0109 query = query.filter(models.RequestGroup.campaign_group == campaign_group)
0110 if campaign_tag:
0111 query = query.filter(models.RequestGroup.campaign_tag == campaign_tag)
0112
0113 tmp = query.all()
0114 rets = []
0115 if tmp:
0116 for t in tmp:
0117 rets.append(t.to_dict())
0118 return rets
0119 except IntegrityError as e:
0120 raise exceptions.DatabaseException(e.args)