Skip to content

Commit 033ed05

Browse files
authored
Merge pull request #25 from dataiku/feature/multi-cluster
Feature/multi cluster
2 parents 1626c4f + a694564 commit 033ed05

File tree

2 files changed

+143
-1
lines changed

2 files changed

+143
-1
lines changed

dataikuapi/dss/admin.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,3 +567,96 @@ def set_definition(self, definition):
567567
return self.client._perform_empty(
568568
"PUT", "/admin/globalAPIKeys/%s" % self.key,
569569
body = definition)
570+
571+
class DSSCluster(object):
572+
"""
573+
A cluster on the DSS instance
574+
"""
575+
def __init__(self, client, cluster_id):
576+
self.client = client
577+
self.cluster_id = cluster_id
578+
579+
########################################################
580+
# Cluster deletion
581+
########################################################
582+
583+
def delete(self):
584+
"""
585+
Delete the cluster (not stopping it)
586+
"""
587+
self.client._perform_empty(
588+
"DELETE", "/admin/clusters/%s" % (self.cluster_id))
589+
590+
591+
########################################################
592+
# Cluster description
593+
########################################################
594+
595+
def get_definition(self):
596+
"""
597+
Get the cluster's definition
598+
599+
Returns:
600+
the cluster definition, as a JSON object
601+
"""
602+
return self.client._perform_json(
603+
"GET", "/admin/clusters/%s" % (self.cluster_id))
604+
605+
def set_definition(self, cluster):
606+
"""
607+
Set the cluster's definition. The definition should come from a call to the get_definition()
608+
method.
609+
610+
Fields that can be updated :
611+
612+
* cluster.permissions, cluster.usableByAll, cluster.owner
613+
* cluster.params
614+
615+
:param cluster: a cluster definition
616+
617+
Returns:
618+
the updated cluster definition, as a JSON object
619+
"""
620+
return self.client._perform_json(
621+
"PUT", "/admin/clusters/%s" % (self.cluster_id), body=cluster)
622+
623+
def get_status(self):
624+
"""
625+
Get the cluster's status and usages
626+
627+
Returns:
628+
the cluster status, as a JSON object
629+
"""
630+
return self.client._perform_json(
631+
"GET", "/admin/clusters/%s/status" % (self.cluster_id))
632+
633+
634+
########################################################
635+
# Cluster actions
636+
########################################################
637+
638+
def start(self):
639+
"""
640+
Starts the cluster
641+
"""
642+
resp = self.client._perform_json(
643+
"POST", "/admin/clusters/%s/start" % (self.cluster_id))
644+
if resp is None:
645+
raise Exception('Env update returned no data')
646+
if resp.get('messages', {}).get('error', False):
647+
raise Exception('Cluster operation failed : %s' % (json.dumps(resp.get('messages', {}).get('messages', {}))))
648+
return resp
649+
650+
651+
def stop(self):
652+
"""
653+
Stops the cluster
654+
"""
655+
resp = self.client._perform_json(
656+
"POST", "/admin/clusters/%s/stop" % (self.cluster_id))
657+
if resp is None:
658+
raise Exception('Env update returned no data')
659+
if resp.get('messages', {}).get('error', False):
660+
raise Exception('Cluster operation failed : %s' % (json.dumps(resp.get('messages', {}).get('messages', {}))))
661+
return resp
662+

dataikuapi/dssclient.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from .dss.future import DSSFuture
77
from .dss.project import DSSProject
88
from .dss.plugin import DSSPlugin
9-
from .dss.admin import DSSUser, DSSGroup, DSSConnection, DSSGeneralSettings, DSSCodeEnv, DSSGlobalApiKey
9+
from .dss.admin import DSSUser, DSSGroup, DSSConnection, DSSGeneralSettings, DSSCodeEnv, DSSGlobalApiKey, DSSCluster
1010
from .dss.meaning import DSSMeaning
1111
from .dss.sqlquery import DSSSQLQuery
1212
from .dss.notebook import DSSNotebook
@@ -394,6 +394,55 @@ def create_code_env(self, env_lang, env_name, deployment_mode, params=None):
394394
raise Exception('Env creation failed : %s' % (json.dumps(resp.get('messages', {}).get('messages', {}))))
395395
return DSSCodeEnv(self, env_lang, env_name)
396396

397+
########################################################
398+
# Clusters
399+
########################################################
400+
401+
def list_clusters(self):
402+
"""
403+
List all clusters setup on the DSS instance
404+
405+
Returns:
406+
List clusters (name, type, state)
407+
"""
408+
return self._perform_json(
409+
"GET", "/admin/clusters/")
410+
411+
def get_cluster(self, cluster_id):
412+
"""
413+
Get a handle to interact with a specific cluster
414+
415+
Args:
416+
name: the name of the desired cluster
417+
418+
Returns:
419+
A :class:`dataikuapi.dss.admin.DSSCluster` cluster handle
420+
"""
421+
return DSSCluster(self, cluster_id)
422+
423+
def create_cluster(self, cluster_name, cluster_type='manual', params=None):
424+
"""
425+
Create a cluster, and return a handle to interact with it
426+
427+
:param cluster_name: the name of the new cluster
428+
:param cluster_type: the type of the new cluster
429+
:param params: the parameters of the new cluster, as a JSON object
430+
431+
:returns: A :class:`dataikuapi.dss.admin.DSSCluster` cluster handle
432+
433+
"""
434+
definition = {}
435+
definition['name'] = cluster_name
436+
definition['type'] = cluster_type
437+
definition['params'] = params if params is not None else {}
438+
resp = self._perform_json(
439+
"POST", "/admin/clusters/", body=definition)
440+
if resp is None:
441+
raise Exception('Cluster creation returned no data')
442+
if resp.get('messages', {}).get('error', False):
443+
raise Exception('Cluster creation failed : %s' % (json.dumps(resp.get('messages', {}).get('messages', {}))))
444+
return DSSCluster(self, resp['id'])
445+
397446
########################################################
398447
# Global API Keys
399448
########################################################

0 commit comments

Comments
 (0)