You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
5.4 KiB

# Copyright (C) 2005-2024 Splunk Inc. All Rights Reserved.
import itsi_py3
import os
from ITOA.itoa_object import ItoaObject
from ITOA.setup_logging import logger
from ITOA.itoa_common import get_current_utc_epoch
class ItsiUpgradeReadinessPrechecks(ItoaObject):
"""
Implements ITSI Upgrade Readiness Precheck object
"""
logger = logger
log_prefix = '[ITSI Upgrade Readiness Precheck] '
collection_name = 'itsi_upgrade_readiness_prechecks'
object_type = 'upgrade_readiness_prechecks'
def __init__(self, session_key, current_user_name):
session_key = session_key
super(ItsiUpgradeReadinessPrechecks, self).__init__(session_key,
current_user_name,
self.object_type,
collection_name=self.collection_name,
title_validation_required=True)
"""
Miscellaneous helper methods
"""
def create_upgrade_readiness_precheck_job(self, transaction_id, operation_mode):
'''
Creates a record of the upgrade readiness precheck job with the transaction id.
@rtype: ItoaObject???
@return: UpgradeReadinessPrecheck
'''
time_now = get_current_utc_epoch()
new_upgrade_readiness_prechecks = []
new_upgrade_readiness_prechecks.append(
{
'status': 'IN_PROGRESS',
'start_time': time_now,
'transaction_id': transaction_id,
'title': f'upgrade_readiness_precheck_{transaction_id}',
'operation_mode': operation_mode,
'precheck_started': False,
'remediation_started': False,
'process_id': os.getpid()
}
)
self.save_batch(
'nobody', new_upgrade_readiness_prechecks, True)
def update_upgrade_readiness_precheck_job(self, transaction_id, **kwargs):
'''
Updates the record of the upgrade readiness precheck job of the given transaction id with the new data.
@rtype: ItoaObject
@return: UpgradeReadinessPrecheck
'''
filter_data = {
'$or': [{'$and': [
{'transaction_id': transaction_id}]
}]
}
upgrade_readiness_precheck_job = self.get_bulk(
'nobody',
fields=['_key', 'start_time', 'transaction_id',
'status', 'object_type', 'title', 'operation_mode', 'precheck_started',
'precheck_start_time', 'remediation_started', 'remediation_start_time', 'process_id'],
filter_data=filter_data)
updated_upgrade_readiness_precheck_job = []
for job in upgrade_readiness_precheck_job:
for key, value in kwargs.items():
job[key] = value
updated_upgrade_readiness_precheck_job.append(job)
if updated_upgrade_readiness_precheck_job:
self.save_batch(
'nobody', updated_upgrade_readiness_precheck_job, True)
def check_process(self, process_id):
"""Check whether the process is alive or not based on process ID. Returns True if job is alive else return False.
: param process_id: process ID of existing precheck job.
"""
try:
os.kill(process_id, 0)
return True
except (OSError, TypeError):
return False
def get_in_progress_upgrade_readiness_prechecks(self, lookback_time=None, exclude_transaction_id=None, mode=None):
"""
Gets prechecks from KVStore that are in progress.
@type lookback_time: int
@param lookback_time: range of time before current_time in seconds to query for precheck jobs
@type exclude_transaction_id: string
@param exclude_transaction_id: the transaction_id to exclude in the query
@rtype: array
@return: returns array of in progress jobs
"""
filter_array = [{'status': 'IN_PROGRESS'}]
if exclude_transaction_id:
filter_array.append({'transaction_id': {'$ne': exclude_transaction_id}})
if lookback_time:
time_now = get_current_utc_epoch()
earliest_time_stamp = time_now - lookback_time
filter_array.append({'start_time': {'$gte': earliest_time_stamp}})
if mode:
filter_array.append({'operation_mode': mode})
filter_data = {'$and': filter_array}
other_in_progress_jobs = self.get_bulk(
'nobody',
filter_data=filter_data,
fields=['_key', 'start_time', 'transaction_id',
'status', 'object_type', 'title', 'operation_mode', 'process_id'],
sort_dir='desc',
sort_key='start_time')
if len(other_in_progress_jobs) > 0:
updated_other_in_progress_jobs = []
for in_progress_job in other_in_progress_jobs:
if self.check_process(in_progress_job.get('process_id', None)):
updated_other_in_progress_jobs.append(in_progress_job)
else:
self.update_upgrade_readiness_precheck_job(in_progress_job['transaction_id'], status='FAILED')
other_in_progress_jobs = updated_other_in_progress_jobs
return other_in_progress_jobs