Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 111 additions & 0 deletions dataikuapi/dss/admin.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .future import DSSFuture
import json

class DSSConnection(object):
"""
Expand Down Expand Up @@ -417,3 +418,113 @@ def group_regexp(self, regexp, unix_user, hadoop_user=None):
self.raw['targetUnix'] = unix_user
self.raw['targetHadoop'] = hadoop_user
return self

class DSSCodeEnv(object):
"""
A code env on the DSS instance
"""
def __init__(self, client, env_lang, env_name):
self.client = client
self.env_lang = env_lang
self.env_name = env_name

########################################################
# Env deletion
########################################################

def delete(self):
"""
Delete the connection

Note: this call requires an API key with admin rights
"""
resp = self.client._perform_json(
"DELETE", "/admin/code-envs/%s/%s" % (self.env_lang, self.env_name))
if resp is None:
raise Exception('Env deletion returned no data')
if resp.get('messages', {}).get('error', False):
raise Exception('Env deletion failed : %s' % (json.dumps(resp.get('messages', {}).get('messages', {}))))
return resp


########################################################
# Code env description
########################################################

def get_definition(self):
"""
Get the code env's definition

Note: this call requires an API key with admin rights

Returns:
the code env definition, as a JSON object
"""
return self.client._perform_json(
"GET", "/admin/code-envs/%s/%s" % (self.env_lang, self.env_name))

def set_definition(self, env):
"""
Set the code env's definition. The definition should come from a call to the get_definition()
method.

Fields that can be updated in design node:

* env.permissions, env.usableByAll, env.desc.owner
* env.specCondaEnvironment, env.specPackageList, env.externalCondaEnvName, env.desc.installCorePackages,
env.desc.installJupyterSupport, env.desc.yarnPythonBin

Fields that can be updated in automation node (where {version} is the updated version):

* env.permissions, env.usableByAll, env.owner
* env.{version}.specCondaEnvironment, env.{version}.specPackageList, env.{version}.externalCondaEnvName,
env.{version}.desc.installCorePackages, env.{version}.desc.installJupyterSupport, env.{version}.desc.yarnPythonBin



Note: this call requires an API key with admin rights

:param data: a code env definition

Returns:
the updated code env definition, as a JSON object
"""
return self.client._perform_json(
"PUT", "/admin/code-envs/%s/%s" % (self.env_lang, self.env_name), body=env)


########################################################
# Code env actions
########################################################

def set_jupyter_support(self, active):
"""
Update the code env jupyter support

Note: this call requires an API key with admin rights

:param active: True to activate jupyter support, False to deactivate
"""
resp = self.client._perform_json(
"POST", "/admin/code-envs/%s/%s/jupyter" % (self.env_lang, self.env_name),
params = {'active':active})
if resp is None:
raise Exception('Env update returned no data')
if resp.get('messages', {}).get('error', False):
raise Exception('Env update failed : %s' % (json.dumps(resp.get('messages', {}).get('messages', {}))))
return resp

def update_packages(self):
"""
Update the code env packages so that it matches its spec

Note: this call requires an API key with admin rights
"""
resp = self.client._perform_json(
"POST", "/admin/code-envs/%s/%s/packages" % (self.env_lang, self.env_name))
if resp is None:
raise Exception('Env update returned no data')
if resp.get('messages', {}).get('error', False):
raise Exception('Env update failed : %s' % (json.dumps(resp.get('messages', {}).get('messages', {}))))
return resp

56 changes: 54 additions & 2 deletions dataikuapi/dssclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from dss.future import DSSFuture
from dss.project import DSSProject
from dss.plugin import DSSPlugin
from dss.admin import DSSUser, DSSGroup, DSSConnection, DSSGeneralSettings
from dss.admin import DSSUser, DSSGroup, DSSConnection, DSSGeneralSettings, DSSCodeEnv
from dss.meaning import DSSMeaning
from dss.sqlquery import DSSSQLQuery
from dss.notebook import DSSNotebook
Expand Down Expand Up @@ -316,7 +316,7 @@ def list_connections(self):
Note: this call requires an API key with admin rights

Returns:
All connections, as a map of connection name to connection definition
All connections, as a map of connection name to connection definition
"""
return self._perform_json(
"GET", "/admin/connections/")
Expand Down Expand Up @@ -360,6 +360,58 @@ def create_connection(self, name, type=None, params=None, usable_by='ALL', allow
})
return DSSConnection(self, name)

########################################################
# Code envs
########################################################

def list_code_envs(self):
"""
List all code envs setup on the DSS instance

Note: this call requires an API key with admin rights

Returns:
List code envs (name, type, language)
"""
return self._perform_json(
"GET", "/admin/code-envs/")

def get_code_env(self, env_lang, env_name):
"""
Get a handle to interact with a specific code env

Args:
name: the name of the desired code env

Returns:
A :class:`dataikuapi.dss.admin.DSSCodeEnv` code env handle
"""
return DSSCodeEnv(self, env_lang, env_name)

def create_code_env(self, env_lang, env_name, deployment_mode, params=None):
"""
Create a code env, and return a handle to interact with it

Note: this call requires an API key with admin rights

:param env_lang: the language (Python, R) of the new code env
:param env_name: the name of the new code env
:param deployment_mode: the type of the new code env
:param params: the parameters of the new code env, as a JSON object

:returns: A :class:`dataikuapi.dss.admin.DSSCodeEnv` code env handle

"""
params = params if params is not None else {}
params['deploymentMode'] = deployment_mode
resp = self._perform_json(
"POST", "/admin/code-envs/%s/%s" % (env_lang, env_name), body=params)
if resp is None:
raise Exception('Env creation returned no data')
if resp.get('messages', {}).get('error', False):
raise Exception('Env creation failed : %s' % (json.dumps(resp.get('messages', {}).get('messages', {}))))
return DSSCodeEnv(self, env_lang, env_name)

########################################################
# Meanings
########################################################
Expand Down