Skip to content

Commit 1c37151

Browse files
Add support for CDE (#35)
* Initial CDE deployment support * cdpy changes in de implementation * add DE service failure states Signed-off-by: Curtis Howard <curtis@cloudera.com> Co-authored-by: Alan Silva <alan.silva@cloudera.com>
1 parent e2d209f commit 1c37151

File tree

3 files changed

+120
-6
lines changed

3 files changed

+120
-6
lines changed

src/cdpy/cdpy.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from cdpy.datahub import CdpyDatahub
1111
from cdpy.datalake import CdpyDatalake
1212
from cdpy.ml import CdpyMl
13+
from cdpy.de import CdpyDe
1314
from cdpy.opdb import CdpyOpdb
1415
from cdpy.dw import CdpyDw
1516
from cdpy.df import CdpyDf
@@ -24,6 +25,8 @@ def __init__(self, *args, **kwargs):
2425
self.datahub = CdpyDatahub(*args, **kwargs)
2526
self.datalake = CdpyDatalake(*args, **kwargs)
2627
self.ml = CdpyMl(*args, **kwargs)
28+
self.de = CdpyDe(*args, **kwargs)
2729
self.opdb = CdpyOpdb(*args, **kwargs)
2830
self.dw = CdpyDw(*args, **kwargs)
2931
self.df = CdpyDf(*args, **kwargs)
32+
self.de = CdpyDe(*args, **kwargs)

src/cdpy/common.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -216,16 +216,18 @@ def _warning_format(message, category, filename, lineno, line=None):
216216
'RUNNING',
217217
'installation:finished', # ML
218218
'Running', # DW
219-
'GOOD_HEALTH' # DF
219+
'GOOD_HEALTH', # DF
220+
'ClusterCreationCompleted' #DE
220221
]
221222

222223
self.STOPPED_STATES = [
223224
'EXTERNAL_DATABASE_STOP_IN_PROGRESS',
224225
'STOP_IN_PROGRESS',
225226
'STOPPED',
226227
'ENV_STOPPED',
227-
'Stopped', # DW
228-
'NOT_ENABLED' # DF
228+
'Stopped', # DW
229+
'NOT_ENABLED', # DF
230+
'ClusterDeletionCompleted' # DE
229231
]
230232

231233
self.FAILED_STATES = [
@@ -239,7 +241,18 @@ def _warning_format(message, category, filename, lineno, line=None):
239241
'installation:failed', # ML
240242
'provision:failed', # ML
241243
'deprovision:failed', # ML
242-
'BAD_HEALTH' # DF
244+
'BAD_HEALTH', # DF
245+
# DE (all possibly intermediate failure states, until CDE exposes a higher-level summary state)
246+
'ClusterChartInstallationFailed', 'ClusterDNSCreationFailed', 'ClusterDNSDeletionFailed',
247+
'ClusterIngressCreationFailed', 'ClusterProvisioningFailed', 'DBProvisioningFailed',
248+
'FSMountTargetsCreationFailed', 'FSProvisioningFailed', 'ClusterTLSCertCreationFailed',
249+
'ClusterServiceMeshProvisioningFailed', 'ClusterMonitoringConfigurationFailed',
250+
'ClusterChartDeletionFailed', 'ClusterDeletionFailed', 'ClusterNamespaceDeletionFailed',
251+
'DBDeletionFailed', 'FSMountTargetsDeletionFailed', 'FSDeletionFailed',
252+
'ClusterTLSCertDeletionFailed', 'ClusterServiceMeshDeletionFailed',
253+
'ClusterAccessGroupCreationFailed', 'ClusterAccessGroupDeletionFailed',
254+
'ClusterUserSyncCheckFailed', 'ClusterCreationFailed', 'ClusterDeleteFromDBFailed',
255+
'ClusterMaintenanceFailed', 'ClusterTLSCertRenewalFailed'
243256
]
244257

245258
self.REMOVABLE_STATES = [
@@ -248,6 +261,7 @@ def _warning_format(message, category, filename, lineno, line=None):
248261
'installation:failed', 'deprovision:failed', 'installation:finished', 'modify:finished', # ML
249262
'Error', 'Running', 'Stopped', 'Deleting', # DW
250263
'GOOD_HEALTH', 'CONCERNING_HEALTH', 'BAD_HEALTH', # DF
264+
'ClusterCreationCompleted' #DE
251265
]
252266

253267
# common regex patterns
@@ -443,9 +457,9 @@ def wait_for_state(self, describe_func, params: dict, field: Union[str, None, li
443457
current_status = self._get_path(current, field)
444458
else: # field not provided, therefore seek default status fields to check for failures
445459
default_status_fields = [
446-
['status'], # Datalake, DW, OpDB, Datahub
460+
['status'], # Datalake, DW, OpDB, Datahub, DE
447461
['instanceStatus'], # ML
448-
['status', 'state'], # DF
462+
['status', 'state'], # DF, DE
449463
]
450464
possible_status = [
451465
self._get_path(current, x) for x in default_status_fields

src/cdpy/de.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from cdpy.common import CdpSdkBase, Squelch, CdpcliWrapper
4+
5+
class CdpyDe(CdpSdkBase):
6+
def __init__(self, *args, **kwargs):
7+
super().__init__(*args, **kwargs)
8+
9+
def describe_vc(self, cluster_id, vc_id):
10+
return self.sdk.call(
11+
svc='de', func='describe_vc', ret_field='vc', squelch=[
12+
Squelch('NOT_FOUND'), Squelch('INVALID_ARGUMENT')
13+
],
14+
clusterId=cluster_id,
15+
vcId=vc_id
16+
)
17+
18+
def list_vcs(self, cluster_id):
19+
return self.sdk.call(
20+
svc='de', func='list_vcs', ret_field='vcs', squelch=[
21+
Squelch(value='NOT_FOUND', default=list()),
22+
Squelch(field='status_code', value='504', default=list(),
23+
warning="No VCS in this Cluster"),
24+
],
25+
clusterId=cluster_id
26+
)
27+
28+
def create_vc(self, name, cluster_id, cpu_requests, memory_requests,
29+
chart_value_overrides=None, runtime_spot_component=None):
30+
return self.sdk.call(
31+
svc='de', func='create_vc', ret_field='Vc',
32+
name=name,
33+
clusterId=cluster_id,
34+
cpuRequests=cpu_requests,
35+
memoryRequests=memory_requests,
36+
chartValueOverrides=chart_value_overrides,
37+
runtimeSpotComponent=runtime_spot_component
38+
)
39+
40+
def delete_vc(self, cluster_id, vc_id):
41+
return self.sdk.call(
42+
svc='de', func='delete_vc', ret_field='status', squelch=[Squelch('NOT_FOUND')],
43+
clusterId=cluster_id, vcId=vc_id
44+
)
45+
46+
def describe_service(self, cluster_id):
47+
return self.sdk.call(
48+
svc='de', func='describe_service', ret_field='service', squelch=[
49+
Squelch('NOT_FOUND'), Squelch('INVALID_ARGUMENT')
50+
],
51+
clusterId=cluster_id,
52+
)
53+
54+
def list_services(self, env=None, remove_deleted=False):
55+
services = self.sdk.call(
56+
svc='de', func='list_services', ret_field='services', squelch=[
57+
Squelch(value='NOT_FOUND', default=list())], removeDeleted=remove_deleted
58+
)
59+
return [s for s in services if env is None or s['environmentName'] == env]
60+
61+
def enable_service(self, name, env, instance_type, minimum_instances, maximum_instances,
62+
initial_instances=None, minimum_spot_instances=None, maximum_spot_instances=None,
63+
initial_spot_instances=None, chart_value_overrides=None, enable_public_endpoint=False,
64+
enable_workload_analytics=False, root_volume_size=None, skip_validation=False,
65+
tags=None, use_ssd=False, whitelist_ips=None):
66+
return self.sdk.call(
67+
svc='de', func='enable_service', ret_field='service',
68+
name=name,
69+
env=env,
70+
instanceType=instance_type,
71+
minimumInstances=minimum_instances,
72+
maximumInstances=maximum_instances,
73+
initialInstances=initial_instances,
74+
minimumSpotInstances=minimum_spot_instances,
75+
maximumSpotInstances=maximum_spot_instances,
76+
initialSpotInstances=initial_spot_instances,
77+
chartValueOverrides=chart_value_overrides,
78+
enablePublicEndpoint=enable_public_endpoint,
79+
enableWorkloadAnalytics=enable_workload_analytics,
80+
rootVolumeSize=root_volume_size,
81+
skipValidation=skip_validation,
82+
tags=tags,
83+
useSsd=use_ssd,
84+
whitelistIps=whitelist_ips
85+
)
86+
87+
def disable_service(self, cluster_id, force=False):
88+
return self.sdk.call(
89+
svc='de', func='disable_service', ret_field='status', squelch=[Squelch('NOT_FOUND')],
90+
clusterId=cluster_id, force=force
91+
)
92+
93+
def get_kubeconfig(self, cluster_id):
94+
return self.sdk.call(
95+
svc='de', func='get_kubeconfig', ret_field='kubeconfig', squelch=[Squelch('NOT_FOUND')],
96+
clusterId=cluster_id
97+
)

0 commit comments

Comments
 (0)