Răsfoiți Sursa

HUE-8473 [cluster] Create cluster API first skeleton

Romain Rigaux 7 ani în urmă
părinte
comite
fde4cde1ca

+ 78 - 0
desktop/libs/metadata/src/metadata/analytic_db_api.py

@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import json
+
+from django.utils.translation import ugettext as _
+from django.views.decorators.http import require_POST
+
+from desktop.lib.django_util import JsonResponse
+from desktop.lib.i18n import force_unicode
+
+from notebook.connectors.altus import AnalyticDbApi
+
+
+LOG = logging.getLogger(__name__)
+
+
+def error_handler(view_fn):
+  def decorator(*args, **kwargs):
+    try:
+      return view_fn(*args, **kwargs)
+    except Exception, e:
+      LOG.exception(e)
+      response = {
+        'status': -1,
+        'message': force_unicode(e)
+      }
+    return JsonResponse(response, status=500)
+  return decorator
+
+
+@require_POST
+@error_handler
+def create_cluster(request):
+  response = {'status': -1}
+
+  cluster_name = json.loads(request.POST.get('cluster_name'))
+  cdh_version = json.loads(request.POST.get('cdh_version'))
+  public_key = json.loads(request.POST.get('public_key'))
+  instance_type = json.loads(request.POST.get('instance_type', "workers_group_size"''))
+  environment_name = json.loads(request.POST.get('environment_name'))
+  workers_group_size = json.loads(request.POST.get('workers_group_size', '3'))
+  namespace_name = json.loads(request.POST.get('namespace_name', 'null'))
+
+  api = AnalyticDbApi(request.user)
+  data = api.create_cluster(
+      cloud_provider='aws',
+      cluster_name=cluster_name,
+      cdh_version=cdh_version,
+      public_key=public_key,
+      instance_type=instance_type,
+      environment_name=environment_name,
+      namespace_name=namespace_name,
+      workers_group_size=workers_group_size
+  )
+
+  if data:
+    response['status'] = 0
+    response['data'] = data
+  else:
+    response['message'] = 'Workload Analytics: %s' % data['details']
+
+  return JsonResponse(response)

+ 7 - 1
desktop/libs/metadata/src/metadata/urls.py

@@ -16,7 +16,7 @@
 # limitations under the License.
 
 from django.conf.urls import url
-from metadata import catalog_api as metadata_catalog_api
+from metadata import catalog_api as metadata_catalog_api, analytic_db_api
 from metadata import optimizer_api as metadata_optimizer_api
 from metadata import workload_analytics_api as metadata_workload_analytics_api
 from metadata import manager_api as metadata_manager_api
@@ -80,6 +80,12 @@ urlpatterns += [
   url(r'^api/manager/hello/?$', metadata_manager_api.hello, name='hello'),
 ]
 
+
+# ADB API
+urlpatterns += [
+  url(r'^api/analytic_db/create_cluster/?$', analytic_db_api.create_cluster, name='create_cluster'),
+]
+
 # Workload Analytics API
 urlpatterns += [
   url(r'^api/workload_analytics/get_operation_execution_details/?$', metadata_workload_analytics_api.get_operation_execution_details, name='get_operation_execution_details'),

+ 18 - 0
desktop/libs/notebook/src/notebook/connectors/altus.py

@@ -163,6 +163,24 @@ class AnalyticDbApi():
 
   def __init__(self, user): pass
 
+  def create_cluster(self, cloud_provider, cluster_name, cdh_version, public_key, instance_type, environment_name, workers_group_size=3, namespace_name=None):
+    # [--cloudera-manager-username <value>]
+    # [--cloudera-manager-password <value>]
+
+    params = { # cloud_provider: AWS, Azure...
+      'clusterName': cluster_name,
+      'cdhVersion': cdh_version,
+      'publicKey': public_key,
+      'instanceType': instance_type,
+      'environmentName': environment_name,
+      'workersGroupSize': workers_group_size
+    }
+
+    if namespace_name:
+      params['namespaceName'] = namespace_name
+
+    return _exec('analyticdb', 'createAWSCluster', params)
+
   def list_clusters(self):
     """
     e.g. returns