Skip to content

Commit d6c8398

Browse files
author
Vivek Chaudhary
committed
[cm_api] OPSAPS-22366 Python API changes for cluster template import
1 parent 78b33df commit d6c8398

File tree

7 files changed

+139
-4
lines changed

7 files changed

+139
-4
lines changed

python/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
setup(
4040
name = 'cm_api',
41-
version = '11.0.0', # Compatible with API v11 (CM 5.5)
41+
version = '12.0.0', # Compatible with API v12 (CM 5.7)
4242
packages = find_packages('src', exclude=['cm_api_tests']),
4343
package_dir = {'cm_api': 'src/cm_api',
4444
'cm_shell': 'src/cm_shell'},

python/src/cm_api/api_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
LOG = logging.getLogger(__name__)
3131

3232
API_AUTH_REALM = "Cloudera Manager"
33-
API_CURRENT_VERSION = 11
33+
API_CURRENT_VERSION = 12
3434

3535
class ApiException(RestException):
3636
"""

python/src/cm_api/endpoints/clusters.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from cm_api.endpoints.types import *
1818
from cm_api.endpoints import services, parcels, host_templates
19+
from sys import api_version
1920

2021
__docformat__ = "epytext"
2122

@@ -605,3 +606,17 @@ def configure_for_kerberos(self, datanode_transceiver_port=None,
605606
if datanode_web_port:
606607
args['datanodeWebPort'] = datanode_web_port
607608
return self._cmd('configureForKerberos', data=args, api_version=11)
609+
610+
def export(self, export_auto_config=False):
611+
"""
612+
Export the cluster template for the given cluster. ccluster must have host
613+
templates defined. It cluster does not have host templates defined it will
614+
export host templates based on roles assignment.
615+
616+
@param export_auto_config: Also export auto configured configs
617+
@return: Return cluster template
618+
@since: API v12
619+
"""
620+
621+
return self._get("export", ApiClusterTemplate, False,
622+
params=dict(exportAutoConfig=export_auto_config), api_version=12)

python/src/cm_api/endpoints/cms.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,3 +482,13 @@ def end_trial(self):
482482
@since: API v6
483483
"""
484484
self._post("trial/end", None, api_version=6)
485+
486+
def import_cluster_template(self, api_cluster_template):
487+
"""
488+
Create a cluster according to the provided template
489+
490+
@param api_cluster_template: cluster template to import
491+
@return: Command handing cluster import
492+
@since: API v12
493+
"""
494+
return self._post("importClusterTemplate", ApiCommand, False, api_cluster_template, api_version=12)

python/src/cm_api/endpoints/types.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,93 @@ class ApiTimeSeriesRequest(BaseApiObject):
11401140
def __str__(self):
11411141
return "<ApiTimeSeriesRequest>: %s" % (self.query)
11421142

1143+
class ApiProductVersion(BaseApiObject):
1144+
_ATTRIBUTES = {
1145+
'version' : None,
1146+
'product' : None,
1147+
}
1148+
1149+
class ApiClusterTemplateConfig(BaseApiObject):
1150+
_ATTRIBUTES = {
1151+
'name' : None,
1152+
'value' : None,
1153+
'ref' : None,
1154+
'variable' : None,
1155+
'autoConfig' : None,
1156+
}
1157+
1158+
class ApiClusterTemplateRoleConfigGroup(BaseApiObject):
1159+
_ATTRIBUTES = {
1160+
'refName' : None,
1161+
'roleType' : None,
1162+
'base' : None,
1163+
'displayName' : None,
1164+
'configs' : Attr(ApiClusterTemplateConfig),
1165+
}
1166+
1167+
class ApiClusterTemplateRole(BaseApiObject):
1168+
_ATTRIBUTES = {
1169+
'refName' : None,
1170+
'roleType' : None,
1171+
}
1172+
1173+
class ApiClusterTemplateHostTemplate(BaseApiObject):
1174+
_ATTRIBUTES = {
1175+
'refName' : None,
1176+
'roleConfigGroupsRefNames' : None,
1177+
}
1178+
1179+
class ApiClusterTemplateHostInfo(BaseApiObject):
1180+
_ATTRIBUTES = {
1181+
'hostName' : None,
1182+
'hostNameRange' : None,
1183+
'rackId' : None,
1184+
'hostTemplateRefName' : None,
1185+
'roleRefNames' : None,
1186+
}
1187+
1188+
class ApiClusterTemplateVariable(BaseApiObject):
1189+
_ATTRIBUTES = {
1190+
'name' : None,
1191+
'value' : None,
1192+
}
1193+
1194+
class ApiClusterTemplateRoleConfigGroupInfo(BaseApiObject):
1195+
_ATTRIBUTES = {
1196+
'rcgRefName' : None,
1197+
'name' : None,
1198+
}
1199+
1200+
class ApiClusterTemplateInstantiator(BaseApiObject):
1201+
_ATTRIBUTES = {
1202+
'clusterName' : None,
1203+
'hosts' : Attr(ApiClusterTemplateHostInfo),
1204+
'variables' : Attr(ApiClusterTemplateVariable),
1205+
'roleConfigGroups' : Attr(ApiClusterTemplateRoleConfigGroupInfo),
1206+
}
1207+
1208+
class ApiClusterTemplateService(BaseApiObject):
1209+
_ATTRIBUTES = {
1210+
'refName' : None,
1211+
'serviceType' : None,
1212+
'serviceConfigs' : Attr(ApiClusterTemplateConfig),
1213+
'roleConfigGroups' : Attr(ApiClusterTemplateRoleConfigGroup),
1214+
'displayName' : None,
1215+
'roles' : Attr(ApiClusterTemplateRole),
1216+
}
1217+
1218+
class ApiClusterTemplate(BaseApiObject):
1219+
_ATTRIBUTES = {
1220+
'cdhVersion' : None,
1221+
'displayName' : None,
1222+
'cmVersion' : None,
1223+
"repositories" : None,
1224+
'products' : Attr(ApiProductVersion),
1225+
'services' : Attr(ApiClusterTemplateService),
1226+
'hostTemplates' : Attr(ApiClusterTemplateHostTemplate),
1227+
'instantiator' : Attr(ApiClusterTemplateInstantiator),
1228+
}
1229+
11431230
def config_to_api_list(dic):
11441231
"""
11451232
Converts a python dictionary into a list containing the proper

python/src/cm_api_tests/test_clusters.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def test_update_cdh_version(self):
4242
data=data,
4343
retdata={ 'name' : 'foo'})
4444
cluster.update_cdh_version('4.2.1')
45-
45+
4646
def test_upgrade_cdh(self):
4747
resource = utils.MockResource(self)
4848
cluster = ApiCluster(resource, name="foo")
@@ -104,3 +104,13 @@ def test_configure_for_kerberos(self):
104104
data=data,
105105
retdata={ 'name' : 'foo'})
106106
cluster.configure_for_kerberos(23456, 12345)
107+
108+
def test_export_cluster_template(self):
109+
resource = utils.MockResource(self)
110+
cluster = ApiCluster(resource, name="foo")
111+
resource.expect(
112+
method="GET",
113+
reqpath="/clusters/foo/export",
114+
params=dict(exportAutoConfig=True),
115+
retdata=ApiClusterTemplate(resource).to_json_dict())
116+
cluster.export(export_auto_config=True)

python/src/cm_api_tests/test_cms.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

1717
import unittest
1818
from cm_api.endpoints.cms import ClouderaManager
19-
from cm_api.endpoints.types import config_to_json, ApiConfig, ApiCmPeer
19+
from cm_api.endpoints.types import config_to_json, ApiConfig, ApiCmPeer,\
20+
ApiCommand, ApiClusterTemplate
2021
from cm_api_tests import utils
2122

2223
try:
@@ -278,3 +279,15 @@ def test_peer_v11(self):
278279
params=params_status_aggregation,
279280
retdata=json.loads(SAMPLE_COMMAND_JSON))
280281
cms.test_peer_connectivity("peer2", peer_type="STATUS_AGGREGATION")
282+
283+
def test_import_cluster_v12(self):
284+
resource = utils.MockResource(self, version=12)
285+
cms = ClouderaManager(resource)
286+
data = ApiClusterTemplate(resource).to_json_dict()
287+
resource.expect(
288+
method="POST",
289+
reqpath="/cm/importClusterTemplate",
290+
data = data,
291+
retdata=ApiCommand(resource).to_json_dict())
292+
cms.import_cluster_template(data)
293+

0 commit comments

Comments
 (0)