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.
81 lines
2.6 KiB
81 lines
2.6 KiB
import json
|
|
|
|
import cexc
|
|
from experiment.experiment_validation import experiment_history_valid_keys, json_keys
|
|
from util.constants import EXPERIMENT_MODEL_PREFIX, EXPERMENT_DRAFT_MODEL_PREFIX
|
|
from util.rest_url_util import make_splunk_url
|
|
|
|
logger = cexc.get_logger(__name__)
|
|
|
|
|
|
def get_experiment_draft_model_name(model_name):
|
|
"""
|
|
generate a draft model name based on our format. insert a '_draft' after EXPERIMENT_MODEL_PREFIX ('_exp_' here)
|
|
Args:
|
|
model_name (str): model name
|
|
|
|
Returns:
|
|
an experiment draft version of model name
|
|
"""
|
|
draft_position = model_name.index(EXPERIMENT_MODEL_PREFIX) + len(EXPERIMENT_MODEL_PREFIX)
|
|
return (
|
|
model_name[:draft_position] + EXPERMENT_DRAFT_MODEL_PREFIX + model_name[draft_position:]
|
|
)
|
|
|
|
|
|
def expand_nested_json_strings(experiment):
|
|
"""
|
|
Bring JSON structures that are have been serialized into strings back to life.
|
|
|
|
Args:
|
|
experiment (dict): experiment object whose schema with some non-primitive nested fields
|
|
(searchStages) as strings.
|
|
|
|
Returns:
|
|
experiment (dict): the same experiment object with the non-primitive nested fields turned into their
|
|
corresponding JSON structures.
|
|
"""
|
|
for key in json_keys:
|
|
val = experiment.get(key)
|
|
if val:
|
|
experiment[key] = json.loads(val)
|
|
return experiment
|
|
|
|
|
|
def get_experiment_by_id(rest_proxy, exp_id):
|
|
"""
|
|
Fetch experiment via a REST call using the experiment ID
|
|
|
|
Args:
|
|
rest_proxy (SplunkRestProxy): SplunkRestProxy object to make the REST request with
|
|
exp_id (str): experiment ID
|
|
|
|
Returns:
|
|
experiment (dict): Fetched experiment object
|
|
|
|
Raises:
|
|
RuntimeError: if the returned REST response contains an error
|
|
"""
|
|
url = make_splunk_url(rest_proxy, 'user', extra_url_parts=['mltk', 'experiments', exp_id])
|
|
resp = rest_proxy.make_rest_call('GET', url)
|
|
if resp['success']:
|
|
return expand_nested_json_strings(json.loads(resp['content'])['entry'][0]['content'])
|
|
else:
|
|
logger.error(resp)
|
|
raise RuntimeError("Failed to retrieve experiment with ID '{}'".format(exp_id))
|
|
|
|
|
|
def get_history_fields_from_experiment(experiment):
|
|
"""
|
|
Extract experiment history fields from an experiment object
|
|
|
|
Args:
|
|
experiment (dict): an experiment object
|
|
|
|
Returns:
|
|
(dict): a new object with fields from the given experiment object that should also
|
|
be written to experiment history
|
|
"""
|
|
exp_hist_keys = experiment_history_valid_keys()
|
|
return {k: v for k, v in experiment.items() if k in exp_hist_keys}
|