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.

169 lines
6.5 KiB

# Copyright (C) 2005-2025 Splunk Inc. All Rights Reserved.
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, failed_precheck_id=None):
'''
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': 'QUEUED',
'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': 0,
'precheck_to_remediate': failed_precheck_id,
'failed_precheck': {},
}
)
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', 'precheck_to_remediate', 'failed_precheck'],
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 = {'$or': [{'$and': filter_array}, {'status': 'QUEUED'}]}
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 in_progress_job.get('status', '') == 'QUEUED':
updated_other_in_progress_jobs.append(in_progress_job)
elif 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
def get_upgrade_readiness_precheck_job_status(self, transaction_id):
'''
Get the record of the upgrade readiness precheck job of the given transaction id.
@type: string
@param transaction_id
@rtype: list of dictionary
@return: objects retrieved on success, throws exceptions on errors
'''
filter_data = {
'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', 'failed_precheck', 'precheck_to_remediate'],
filter_data=filter_data)
return upgrade_readiness_precheck_job