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

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}