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.
99 lines
3.1 KiB
99 lines
3.1 KiB
# Copyright (C) 2005-2024 Splunk Inc. All Rights Reserved.
|
|
from ITOA.setup_logging import getLogger
|
|
import json
|
|
import splunk.rest as rest
|
|
import http.client
|
|
from .cloud_config_suite_retriever import CloudConfigSuiteRetriever
|
|
from .splunk_config_suite_retriever import SplunkLicenseSuiteRetriever
|
|
from .suite_content import SuiteContent
|
|
|
|
|
|
class LicenseRetriever(object):
|
|
|
|
SERVER_INFO_ENDPOINT = '/services/server/info'
|
|
|
|
def __init__(self, session_key):
|
|
self.logger = getLogger(logger_name='itsi.feature_flagging.LicenseRetriever')
|
|
self.session_key = session_key
|
|
|
|
def get_features_and_suite(self):
|
|
"""
|
|
Returns features and whether they are enabled or not, and the suite based on current state object.
|
|
|
|
@type: object
|
|
@param self: the self reference
|
|
|
|
@rtype: (dict, str)
|
|
@return: (dict of this form:
|
|
{feature_name1: <boolean>, feature_name2: <boolean>,...,feature_nameN: enabled}, suite_name
|
|
)
|
|
"""
|
|
suite = self.get_suite()
|
|
features = self.get_features(suite)
|
|
return features, suite
|
|
|
|
def get_suite(self):
|
|
"""
|
|
Returns the suite type based on current state object.
|
|
|
|
@rtype: string
|
|
@return: suite
|
|
"""
|
|
return self._get_suite_retriever().get_suite()
|
|
|
|
def sync_suite_state(self):
|
|
"""
|
|
Synchronizes current suitification state
|
|
"""
|
|
self.logger.info("Synchronizing suite state... ")
|
|
self._get_suite_retriever().sync_suite_state()
|
|
self.logger.info("Synchronizing suite state completed")
|
|
|
|
def _get_suite_retriever(self):
|
|
if self._is_cloud():
|
|
self.logger.info("Detected Cloud environment")
|
|
retriever = CloudConfigSuiteRetriever(self.session_key)
|
|
else:
|
|
self.logger.info("Detected non-Cloud environment")
|
|
retriever = SplunkLicenseSuiteRetriever(self.session_key)
|
|
return retriever
|
|
|
|
def get_features(self, suite):
|
|
"""
|
|
Returns the suite features based on current state object.
|
|
|
|
@rtype: dict
|
|
@return: (dict of this form:
|
|
{feature_name1: <boolean>, feature_name2: <boolean>,...,feature_nameN: enabled}
|
|
)
|
|
"""
|
|
return SuiteContent.get_features_for_suite(suite)
|
|
|
|
def _is_cloud(self):
|
|
"""
|
|
Check if running on the Cloud stack
|
|
|
|
@type: object
|
|
@param self: the self reference
|
|
|
|
@rtype: boolean
|
|
@return: True - in the Cloud, otherwise False
|
|
"""
|
|
|
|
instance_type = self._get_server_info()['entry'][0]['content'].get('instance_type')
|
|
if instance_type is not None:
|
|
return instance_type == 'cloud'
|
|
return False
|
|
|
|
def _get_server_info(self):
|
|
response, contents = rest.simpleRequest(
|
|
path=self.SERVER_INFO_ENDPOINT,
|
|
getargs={'output_mode': 'json'},
|
|
sessionKey=self.session_key)
|
|
if response.status != http.client.OK:
|
|
e = Exception('Failed to get server information. Response={} Contents={}'.format(response, contents))
|
|
self.logger.exception(e)
|
|
raise e
|
|
|
|
return json.loads(contents)
|