def create_ml_configuration(self, search_template, extract_as_keys, dataset_ids):
data = {<EOL>"<STR_LIT>":<EOL>search_template,<EOL>"<STR_LIT>":<EOL>extract_as_keys<EOL>}<EOL>failure_message = "<STR_LIT>"<EOL>config_job_id = self._get_success_json(self._post_json(<EOL>'<STR_LIT>', data, failure_message=failure_message))['<STR_LIT:data>'][<EOL>'<STR_LIT:result>']['<STR_LIT>']<EOL>while True:<EOL><INDENT>config_status = self.__get_ml_configuration_status(config_job_id)<EOL>print('<STR_LIT>', config_status)<EOL>if config_status['<STR_LIT:status>'] == '<STR_LIT>':<EOL><INDENT>ml_config = self.__convert_response_to_configuration(config_status['<STR_LIT:result>'], dataset_ids)<EOL>return ml_config<EOL><DEDENT>time.sleep(<NUM_LIT:5>)<EOL><DEDENT>
This method will spawn a server job to create a default ML configuration based on a search template and
the extract as keys.
This function will submit the request to build, and wait for the configuration to finish before returning.

:param search_template: A search template defining the query (properties, datasets etc)
:param extract_as_keys: Array of extract-as keys defining the descriptors
:param dataset_ids: Array of dataset identifiers to make search template from
:return: An identifier used to request the status of the builder job (get_ml_configuration_status)