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.
96 lines
3.8 KiB
96 lines
3.8 KiB
# Copyright (C) 2005-2024 Splunk Inc. All Rights Reserved.
|
|
|
|
import time
|
|
import json
|
|
import sys
|
|
|
|
import splunk
|
|
import splunk.rest as rest
|
|
|
|
from splunk.clilib.bundle_paths import make_splunkhome_path
|
|
sys.path.append(make_splunkhome_path(['etc', 'apps', 'SA-ITOA', 'lib']))
|
|
sys.path.append(make_splunkhome_path(
|
|
['etc', 'apps', 'SA-ITOA', 'lib', 'SA_ITOA_app_common']))
|
|
from ITOA.version_check import VersionCheck # noqa
|
|
from ITOA.setup_logging import getLogger
|
|
|
|
logger = getLogger(logger_name='itsi.itsi_version_compare')
|
|
new_version = '4.19.1'
|
|
|
|
|
|
class ServerInfoException(Exception):
|
|
pass
|
|
|
|
|
|
class VersionComparison(object):
|
|
"""
|
|
Class to compare versions between app and kvstore
|
|
Singleton Class always returns the same instance across shared pages
|
|
"""
|
|
_instance = None
|
|
is_version_consistent = False
|
|
|
|
def __new__(cls):
|
|
if cls._instance is None:
|
|
cls._instance = super(VersionComparison, cls).__new__(cls)
|
|
return cls._instance
|
|
|
|
def should_render_migration_page(cls, session_key):
|
|
retry = 0
|
|
# There is issue, if we call this function too soon,
|
|
# we get 503 error which Service Unavailable
|
|
# this means that KV store has not initialized yet
|
|
# In the case of KVService, we get a 404 error
|
|
while retry < 8:
|
|
try:
|
|
rsp, content = rest.simpleRequest(
|
|
'/servicesNS/nobody/SA-ITOA/storage/collections/data/itsi_migration',
|
|
sessionKey=session_key,
|
|
raiseAllErrors=False,
|
|
getargs={'output_mode': 'json'}
|
|
)
|
|
if rsp.status != 503 and rsp.status != 404:
|
|
break
|
|
logger.info(
|
|
'KV store service is unavailable. Retry %d of 8.', (retry + 1))
|
|
except splunk.ResourceNotFound:
|
|
# Catching this error case is a workaround until SPL-218406 is fixed
|
|
logger.info(
|
|
'KV Service resource not found. Retry %d of 8.', (retry + 1))
|
|
time.sleep((retry + 0.5)**2)
|
|
retry += 1
|
|
# KV store or KVService is not ready
|
|
if rsp.status == 503 or rsp.status == 404:
|
|
logger.error('Got bad status code %s. KV store failed to initialize, Please retry. - Aborting. ',
|
|
rsp.status)
|
|
raise ServerInfoException(
|
|
'Got bad status code %s - Aborting.' % rsp.status)
|
|
if rsp.status == 200:
|
|
try:
|
|
json_data = json.loads(content)
|
|
# fresh install loads the page
|
|
if len(json_data) == 0:
|
|
logger.info(
|
|
'Could not find the migration stanza. It seems to be a fresh installation.')
|
|
return False
|
|
else:
|
|
json_data = sorted(
|
|
json_data, key=lambda item: item['title'])
|
|
old_version = json_data[-1]['itsi_latest_version']
|
|
if VersionCheck.compare(old_version, new_version) < 0:
|
|
return True
|
|
else:
|
|
# If the KV store version is consistent, set is_version_consistent to True, once this happens,
|
|
# no more request is needed anymore unless a restart
|
|
cls.is_version_consistent = True
|
|
return False
|
|
except Exception:
|
|
logger.exception(
|
|
'Failed to compare file system version and KV store version. Loading the page.')
|
|
return False
|
|
# any code that is other than 503 or 200 loads the page
|
|
else:
|
|
logger.error('Got bad non-200 status code %s and failed to fetch the current version. Loading the page.',
|
|
rsp.status)
|
|
return False
|