From b36bdef8bd68e18dabf860830f1f661af225a59c Mon Sep 17 00:00:00 2001 From: Nicolaie Marian Date: Mon, 24 Jan 2022 12:47:17 +0100 Subject: [PATCH 1/3] feature: added raz support Signed-off-by: Nicolaie Marian --- plugins/modules/datalake.py | 331 +++++++++++++++++++++++------------- 1 file changed, 214 insertions(+), 117 deletions(-) diff --git a/plugins/modules/datalake.py b/plugins/modules/datalake.py index 29b3b5dc..f3aa1568 100644 --- a/plugins/modules/datalake.py +++ b/plugins/modules/datalake.py @@ -18,11 +18,13 @@ from ansible.module_utils.basic import AnsibleModule from ansible_collections.cloudera.cloud.plugins.module_utils.cdp_common import CdpModule -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} +ANSIBLE_METADATA = { + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "community", +} -DOCUMENTATION = r''' +DOCUMENTATION = r""" --- module: datalake short_description: Manage CDP Datalakes @@ -38,7 +40,7 @@ name: description: - The name of the datalake. - - This name must be unique, must have between 5 and 100 characters, and must contain only lowercase letters, + - This name must be unique, must have between 5 and 100 characters, and must contain only lowercase letters, numbers, and hyphens. - Names are case-sensitive. type: str @@ -133,12 +135,18 @@ default: 3600 aliases: - polling_timeout + raz: + description: + - Flag indicating if Ranger RAZ should be enabled for the datalake + type: bool + required: False + default: False extends_documentation_fragment: - cloudera.cloud.cdp_sdk_options - cloudera.cloud.cdp_auth_options -''' +""" -EXAMPLES = r''' +EXAMPLES = r""" # Note: These examples do not set authentication details. # Create a datalake in AWS @@ -166,9 +174,9 @@ cloudera.cloud.datalake: name: example-datalake state: absent -''' +""" -RETURN = r''' +RETURN = r""" --- datalake: description: The information about the Datalake @@ -368,7 +376,7 @@ returned: when supported type: list elements: str -''' +""" class Datalake(CdpModule): @@ -376,24 +384,25 @@ def __init__(self, module): super(Datalake, self).__init__(module) # Set variables - self.name = self._get_param('name') - self.state = self._get_param('state').lower() - self.cloud = self._get_param('cloud') + self.name = self._get_param("name") + self.state = self._get_param("state").lower() + self.cloud = self._get_param("cloud") # ID Broker Role - self.instance_profile = self._get_param('instance_profile') + self.instance_profile = self._get_param("instance_profile") # Storage Location Base - self.storage = self._get_param('storage') + self.storage = self._get_param("storage") - self.environment = self._get_param('environment') - self.runtime = self._get_param('runtime') - self.scale = self._get_param('scale') - self.tags = self._get_param('tags') + self.environment = self._get_param("environment") + self.runtime = self._get_param("runtime") + self.scale = self._get_param("scale") + self.tags = self._get_param("tags") - self.wait = self._get_param('wait') - self.delay = self._get_param('delay') - self.timeout = self._get_param('timeout') - self.force = self._get_param('force') + self.wait = self._get_param("wait") + self.delay = self._get_param("delay") + self.timeout = self._get_param("timeout") + self.force = self._get_param("force") + self.raz = self._get_param("raz") # Initialize the return values self.datalake = dict() @@ -405,44 +414,61 @@ def __init__(self, module): def process(self): existing = self.cdpy.datalake.describe_datalake(self.name) - if self.state in ['present']: + if self.state in ["present"]: # If the datalake exists if existing is not None: self.datalake = existing # Fail if attempting to restart a failed datalake - if 'status' in existing: - if existing['status'] in self.cdpy.sdk.FAILED_STATES: - self.module.fail_json(msg='Attempting to restart a failed datalake') + if "status" in existing: + if existing["status"] in self.cdpy.sdk.FAILED_STATES: + self.module.fail_json( + msg="Attempting to restart a failed datalake" + ) # Check for Datalake actions during create or started - elif existing['status'] in self.cdpy.sdk.CREATION_STATES + self.cdpy.sdk.STARTED_STATES: + elif ( + existing["status"] + in self.cdpy.sdk.CREATION_STATES + self.cdpy.sdk.STARTED_STATES + ): # Reconcile and error if specifying invalid cloud parameters if self.environment is not None: - env = self.cdpy.environments.describe_environment(self.environment) - if env['crn'] != existing['environmentCrn']: + env = self.cdpy.environments.describe_environment( + self.environment + ) + if env["crn"] != existing["environmentCrn"]: self.module.fail_json( - msg="Datalake exists in a different Environment: %s" % existing['environmentCrn']) + msg="Datalake exists in a different Environment: %s" + % existing["environmentCrn"] + ) # Check for changes mismatch = self._reconcile_existing_state(existing) if mismatch: - msg = '' + msg = "" for m in mismatch: - msg += "Parameter '%s' found to be '%s'\n" % (m[0], m[1]) + msg += "Parameter '%s' found to be '%s'\n" % ( + m[0], + m[1], + ) self.module.fail_json( - msg='Datalake exists and differs from expected:\n' + msg, violations=mismatch) + msg="Datalake exists and differs from expected:\n" + + msg, + violations=mismatch, + ) # Wait if not self.wait: - self.module.warn('Datalake already creating or started, changes may not be possible') + self.module.warn( + "Datalake already creating or started, changes may not be possible" + ) else: # Wait for creation to complete if previously requested and still running self.datalake = self.cdpy.sdk.wait_for_state( describe_func=self.cdpy.datalake.describe_datalake, params=dict(name=self.name), - field='status', - state='RUNNING', + field="status", + state="RUNNING", delay=self.delay, - timeout=self.timeout + timeout=self.timeout, ) # Else create the datalake if not exists already else: @@ -451,64 +477,88 @@ def process(self): if env is not None: self.create_datalake(env) else: - self.module.fail_json(msg="Unable to find environment, '%s'" % self.environment) + self.module.fail_json( + msg="Unable to find environment, '%s'" % self.environment + ) else: - self.module.fail_json(msg="Datalake creation failed, required parameter 'environment' missing") + self.module.fail_json( + msg="Datalake creation failed, required parameter 'environment' missing" + ) - elif self.state == 'absent': + elif self.state == "absent": # If the datalake exists if existing is not None: # Warn if attempting to delete an already terminated/terminating datalake - if not self.wait and existing['status'] in self.cdpy.sdk.TERMINATION_STATES: - self.module.warn('Attempting to delete an datalake during the termination cycle') + if ( + not self.wait + and existing["status"] in self.cdpy.sdk.TERMINATION_STATES + ): + self.module.warn( + "Attempting to delete an datalake during the termination cycle" + ) self.datalake = existing # Otherwise, delete the datalake else: self.delete_datalake() else: - self.module.fail_json(msg='Invalid state: %s' % self.state) + self.module.fail_json(msg="Invalid state: %s" % self.state) def create_datalake(self, environment): self._validate_datalake_name() payload = self._configure_payload() - if environment['cloudPlatform'] == 'AWS': + if environment["cloudPlatform"] == "AWS": if self.instance_profile is None or self.storage is None: - self.module.fail_json(msg="One of the following are missing: instance_profile, storage") - - payload.update(cloudProviderConfiguration=dict( - instanceProfile=self.instance_profile, - storageBucketLocation=self.storage - )) - - self.datalake = self.cdpy.sdk.call('datalake', 'create_aws_datalake', **payload) - elif environment['cloudPlatform'] == 'AZURE': - payload.update(cloudProviderConfiguration=dict( - managedIdentity=self.instance_profile, - storageLocation=self.storage - )) - self.datalake = self.cdpy.sdk.call('datalake', 'create_azure_datalake', **payload) - elif environment['cloudPlatform'] == 'GCP': - payload.update(cloudProviderConfiguration=dict( - serviceAccountEmail=self.instance_profile, - storageLocation=self.storage - )) - self.datalake = self.cdpy.sdk.call('datalake', 'create_gcp_datalake', **payload) + self.module.fail_json( + msg="One of the following are missing: instance_profile, storage" + ) + + payload.update( + cloudProviderConfiguration=dict( + instanceProfile=self.instance_profile, + storageBucketLocation=self.storage, + ) + ) + + self.datalake = self.cdpy.sdk.call( + "datalake", "create_aws_datalake", **payload + ) + elif environment["cloudPlatform"] == "AZURE": + payload.update( + cloudProviderConfiguration=dict( + managedIdentity=self.instance_profile, storageLocation=self.storage + ) + ) + self.datalake = self.cdpy.sdk.call( + "datalake", "create_azure_datalake", **payload + ) + elif environment["cloudPlatform"] == "GCP": + payload.update( + cloudProviderConfiguration=dict( + serviceAccountEmail=self.instance_profile, + storageLocation=self.storage, + ) + ) + self.datalake = self.cdpy.sdk.call( + "datalake", "create_gcp_datalake", **payload + ) else: - self.module.fail_json(msg='Datalakes not yet implemented for this Environment Type') + self.module.fail_json( + msg="Datalakes not yet implemented for this Environment Type" + ) self.changed = True if self.wait and not self.module.check_mode: self.datalake = self.cdpy.sdk.wait_for_state( describe_func=self.cdpy.datalake.describe_datalake, params=dict(name=self.name), - field='status', - state='RUNNING', + field="status", + state="RUNNING", delay=self.delay, - timeout=self.timeout + timeout=self.timeout, ) def delete_datalake(self): @@ -522,14 +572,11 @@ def delete_datalake(self): params=dict(name=self.name), field=None, delay=self.delay, - timeout=self.timeout + timeout=self.timeout, ) def _configure_payload(self): - payload = dict( - datalakeName=self.name, - environmentName=self.environment, - ) + payload = dict(datalakeName=self.name, environmentName=self.environment,) if self.runtime: payload.update(runtime=self.runtime) @@ -537,75 +584,125 @@ def _configure_payload(self): if self.scale: payload.update(scale=self.scale) + if self.raz: + payload.update(enableRangerRaz=self.raz) + if self.tags is not None: - payload['tags'] = list() + payload["tags"] = list() for k in self.tags: - payload['tags'].append(dict(key=k, value=str(self.tags[k]))) + payload["tags"].append(dict(key=k, value=str(self.tags[k]))) return payload def _reconcile_existing_state(self, existing): mismatched = list() - if 'cloudPlatform' in existing and existing['cloudPlatform'] == 'AWS': - if self.instance_profile is not None and \ - self.instance_profile != existing['awsConfiguration']['instanceProfile']: - mismatched.append(['instance_profile', existing['awsConfiguration']['instanceProfile']]) + if "cloudPlatform" in existing and existing["cloudPlatform"] == "AWS": + if ( + self.instance_profile is not None + and self.instance_profile + != existing["awsConfiguration"]["instanceProfile"] + ): + mismatched.append( + [ + "instance_profile", + existing["awsConfiguration"]["instanceProfile"], + ] + ) if self.storage is not None: - self.module.warn("Updating an existing Datalake's 'storage' " - "directly is not supported at this time. If " - "you need to change the storage, explicitly " - "delete and recreate the Datalake.") + self.module.warn( + "Updating an existing Datalake's 'storage' " + "directly is not supported at this time. If " + "you need to change the storage, explicitly " + "delete and recreate the Datalake." + ) if self.runtime: - self.module.warn("Updating an existing Datalake's 'runtime' " - "directly is not supported at this time. If you " - "need to change the runtime, either use the " - "'upgrade' state or explicitly delete and " - "recreate the Datalake.") + self.module.warn( + "Updating an existing Datalake's 'runtime' " + "directly is not supported at this time. If you " + "need to change the runtime, either use the " + "'upgrade' state or explicitly delete and " + "recreate the Datalake." + ) if self.scale: - self.module.warn("Updating an existing Datalake's 'scale' " - "directly is not supported at this time. If you " - "need to change the scale, explicitly delete " - "and recreate the Datalake.") + self.module.warn( + "Updating an existing Datalake's 'scale' " + "directly is not supported at this time. If you " + "need to change the scale, explicitly delete " + "and recreate the Datalake." + ) if self.tags: - self.module.warn("Updating an existing Datalake's 'tags' " - "directly are not supported at this time. If you " - "need to change the tags, explicitly delete " - "and recreate the Datalake.") + self.module.warn( + "Updating an existing Datalake's 'tags' " + "directly are not supported at this time. If you " + "need to change the tags, explicitly delete " + "and recreate the Datalake." + ) + + if self.raz: + self.module.warn( + "Updating an existing Datalake's 'enableRangerRaz' " + "directly is not supported at this time. If you " + "need to change the enableRangerRaz, explicitly delete " + "and recreate the Datalake." + ) return mismatched def _validate_datalake_name(self): if len(self.name) < 5 or len(self.name) > 100: self.module.fail_json( - msg="Invalid datalake name, '%s'. Names must be between 5-100 characters." % self.name) - elif self.cdpy.sdk.regex_search(self.cdpy.sdk.DATALAKE_NAME_PATTERN, self.name) is not None: - self.module.fail_json(msg="Invalid datalake name, '%s'. Names must contain only lowercase " - "letters, numbers and hyphens." % self.name) + msg="Invalid datalake name, '%s'. Names must be between 5-100 characters." + % self.name + ) + elif ( + self.cdpy.sdk.regex_search(self.cdpy.sdk.DATALAKE_NAME_PATTERN, self.name) + is not None + ): + self.module.fail_json( + msg="Invalid datalake name, '%s'. Names must contain only lowercase " + "letters, numbers and hyphens." % self.name + ) def main(): module = AnsibleModule( argument_spec=CdpModule.argument_spec( - name=dict(required=True, type='str', aliases=['datalake']), - state=dict(required=False, type='str', choices=['present', 'absent'], default='present'), - instance_profile=dict(required=False, type='str', aliases=['managed_identity']), - storage=dict(required=False, type='str', aliases=['storage_location', 'storage_location_base']), - - environment=dict(required=False, type='str', aliases=['env']), - runtime=dict(required=False, type='str'), - scale=dict(required=False, type='str', choices=['LIGHT_DUTY', 'MEDIUM_DUTY_HA']), - tags=dict(required=False, type='dict', aliases=['datalake_tags']), - - force=dict(required=False, type='bool', default=False), - wait=dict(required=False, type='bool', default=True), - delay=dict(required=False, type='int', aliases=['polling_delay'], default=15), - timeout=dict(required=False, type='int', aliases=['polling_timeout'], default=3600) + name=dict(required=True, type="str", aliases=["datalake"]), + state=dict( + required=False, + type="str", + choices=["present", "absent"], + default="present", + ), + instance_profile=dict( + required=False, type="str", aliases=["managed_identity"] + ), + storage=dict( + required=False, + type="str", + aliases=["storage_location", "storage_location_base"], + ), + environment=dict(required=False, type="str", aliases=["env"]), + runtime=dict(required=False, type="str"), + scale=dict( + required=False, type="str", choices=["LIGHT_DUTY", "MEDIUM_DUTY_HA"] + ), + tags=dict(required=False, type="dict", aliases=["datalake_tags"]), + force=dict(required=False, type="bool", default=False), + wait=dict(required=False, type="bool", default=True), + delay=dict( + required=False, type="int", aliases=["polling_delay"], default=15 + ), + timeout=dict( + required=False, type="int", aliases=["polling_timeout"], default=3600 + ), + raz=dict(required=False, type="bool", default=False), ), - supports_check_mode=True + supports_check_mode=True, ) result = Datalake(module) @@ -617,5 +714,5 @@ def main(): module.exit_json(**output) -if __name__ == '__main__': +if __name__ == "__main__": main() From 1d4c3fc9f10ab77d2ae51d62aa966c9f3b2f5bd9 Mon Sep 17 00:00:00 2001 From: Nicolaie Marian Date: Mon, 24 Jan 2022 13:17:15 +0100 Subject: [PATCH 2/3] feat: raz Signed-off-by: Nicolaie Marian --- plugins/modules/datalake.py | 324 ++++++++++++++---------------------- 1 file changed, 122 insertions(+), 202 deletions(-) diff --git a/plugins/modules/datalake.py b/plugins/modules/datalake.py index f3aa1568..0b27229f 100644 --- a/plugins/modules/datalake.py +++ b/plugins/modules/datalake.py @@ -18,13 +18,11 @@ from ansible.module_utils.basic import AnsibleModule from ansible_collections.cloudera.cloud.plugins.module_utils.cdp_common import CdpModule -ANSIBLE_METADATA = { - "metadata_version": "1.1", - "status": ["preview"], - "supported_by": "community", -} +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community'} -DOCUMENTATION = r""" +DOCUMENTATION = r''' --- module: datalake short_description: Manage CDP Datalakes @@ -40,7 +38,7 @@ name: description: - The name of the datalake. - - This name must be unique, must have between 5 and 100 characters, and must contain only lowercase letters, + - This name must be unique, must have between 5 and 100 characters, and must contain only lowercase letters, numbers, and hyphens. - Names are case-sensitive. type: str @@ -144,9 +142,9 @@ extends_documentation_fragment: - cloudera.cloud.cdp_sdk_options - cloudera.cloud.cdp_auth_options -""" +''' -EXAMPLES = r""" +EXAMPLES = r''' # Note: These examples do not set authentication details. # Create a datalake in AWS @@ -174,9 +172,9 @@ cloudera.cloud.datalake: name: example-datalake state: absent -""" +''' -RETURN = r""" +RETURN = r''' --- datalake: description: The information about the Datalake @@ -376,7 +374,7 @@ returned: when supported type: list elements: str -""" +''' class Datalake(CdpModule): @@ -384,24 +382,24 @@ def __init__(self, module): super(Datalake, self).__init__(module) # Set variables - self.name = self._get_param("name") - self.state = self._get_param("state").lower() - self.cloud = self._get_param("cloud") + self.name = self._get_param('name') + self.state = self._get_param('state').lower() + self.cloud = self._get_param('cloud') # ID Broker Role - self.instance_profile = self._get_param("instance_profile") + self.instance_profile = self._get_param('instance_profile') # Storage Location Base - self.storage = self._get_param("storage") + self.storage = self._get_param('storage') - self.environment = self._get_param("environment") - self.runtime = self._get_param("runtime") - self.scale = self._get_param("scale") - self.tags = self._get_param("tags") + self.environment = self._get_param('environment') + self.runtime = self._get_param('runtime') + self.scale = self._get_param('scale') + self.tags = self._get_param('tags') - self.wait = self._get_param("wait") - self.delay = self._get_param("delay") - self.timeout = self._get_param("timeout") - self.force = self._get_param("force") + self.wait = self._get_param('wait') + self.delay = self._get_param('delay') + self.timeout = self._get_param('timeout') + self.force = self._get_param('force') self.raz = self._get_param("raz") # Initialize the return values @@ -414,61 +412,44 @@ def __init__(self, module): def process(self): existing = self.cdpy.datalake.describe_datalake(self.name) - if self.state in ["present"]: + if self.state in ['present']: # If the datalake exists if existing is not None: self.datalake = existing # Fail if attempting to restart a failed datalake - if "status" in existing: - if existing["status"] in self.cdpy.sdk.FAILED_STATES: - self.module.fail_json( - msg="Attempting to restart a failed datalake" - ) + if 'status' in existing: + if existing['status'] in self.cdpy.sdk.FAILED_STATES: + self.module.fail_json(msg='Attempting to restart a failed datalake') # Check for Datalake actions during create or started - elif ( - existing["status"] - in self.cdpy.sdk.CREATION_STATES + self.cdpy.sdk.STARTED_STATES - ): + elif existing['status'] in self.cdpy.sdk.CREATION_STATES + self.cdpy.sdk.STARTED_STATES: # Reconcile and error if specifying invalid cloud parameters if self.environment is not None: - env = self.cdpy.environments.describe_environment( - self.environment - ) - if env["crn"] != existing["environmentCrn"]: + env = self.cdpy.environments.describe_environment(self.environment) + if env['crn'] != existing['environmentCrn']: self.module.fail_json( - msg="Datalake exists in a different Environment: %s" - % existing["environmentCrn"] - ) + msg="Datalake exists in a different Environment: %s" % existing['environmentCrn']) # Check for changes mismatch = self._reconcile_existing_state(existing) if mismatch: - msg = "" + msg = '' for m in mismatch: - msg += "Parameter '%s' found to be '%s'\n" % ( - m[0], - m[1], - ) + msg += "Parameter '%s' found to be '%s'\n" % (m[0], m[1]) self.module.fail_json( - msg="Datalake exists and differs from expected:\n" - + msg, - violations=mismatch, - ) + msg='Datalake exists and differs from expected:\n' + msg, violations=mismatch) # Wait if not self.wait: - self.module.warn( - "Datalake already creating or started, changes may not be possible" - ) + self.module.warn('Datalake already creating or started, changes may not be possible') else: # Wait for creation to complete if previously requested and still running self.datalake = self.cdpy.sdk.wait_for_state( describe_func=self.cdpy.datalake.describe_datalake, params=dict(name=self.name), - field="status", - state="RUNNING", + field='status', + state='RUNNING', delay=self.delay, - timeout=self.timeout, + timeout=self.timeout ) # Else create the datalake if not exists already else: @@ -477,88 +458,64 @@ def process(self): if env is not None: self.create_datalake(env) else: - self.module.fail_json( - msg="Unable to find environment, '%s'" % self.environment - ) + self.module.fail_json(msg="Unable to find environment, '%s'" % self.environment) else: - self.module.fail_json( - msg="Datalake creation failed, required parameter 'environment' missing" - ) + self.module.fail_json(msg="Datalake creation failed, required parameter 'environment' missing") - elif self.state == "absent": + elif self.state == 'absent': # If the datalake exists if existing is not None: # Warn if attempting to delete an already terminated/terminating datalake - if ( - not self.wait - and existing["status"] in self.cdpy.sdk.TERMINATION_STATES - ): - self.module.warn( - "Attempting to delete an datalake during the termination cycle" - ) + if not self.wait and existing['status'] in self.cdpy.sdk.TERMINATION_STATES: + self.module.warn('Attempting to delete an datalake during the termination cycle') self.datalake = existing # Otherwise, delete the datalake else: self.delete_datalake() else: - self.module.fail_json(msg="Invalid state: %s" % self.state) + self.module.fail_json(msg='Invalid state: %s' % self.state) def create_datalake(self, environment): self._validate_datalake_name() payload = self._configure_payload() - if environment["cloudPlatform"] == "AWS": + if environment['cloudPlatform'] == 'AWS': if self.instance_profile is None or self.storage is None: - self.module.fail_json( - msg="One of the following are missing: instance_profile, storage" - ) - - payload.update( - cloudProviderConfiguration=dict( - instanceProfile=self.instance_profile, - storageBucketLocation=self.storage, - ) - ) - - self.datalake = self.cdpy.sdk.call( - "datalake", "create_aws_datalake", **payload - ) - elif environment["cloudPlatform"] == "AZURE": - payload.update( - cloudProviderConfiguration=dict( - managedIdentity=self.instance_profile, storageLocation=self.storage - ) - ) - self.datalake = self.cdpy.sdk.call( - "datalake", "create_azure_datalake", **payload - ) - elif environment["cloudPlatform"] == "GCP": - payload.update( - cloudProviderConfiguration=dict( - serviceAccountEmail=self.instance_profile, - storageLocation=self.storage, - ) - ) - self.datalake = self.cdpy.sdk.call( - "datalake", "create_gcp_datalake", **payload - ) + self.module.fail_json(msg="One of the following are missing: instance_profile, storage") + + payload.update(cloudProviderConfiguration=dict( + instanceProfile=self.instance_profile, + storageBucketLocation=self.storage + )) + + self.datalake = self.cdpy.sdk.call('datalake', 'create_aws_datalake', **payload) + elif environment['cloudPlatform'] == 'AZURE': + payload.update(cloudProviderConfiguration=dict( + managedIdentity=self.instance_profile, + storageLocation=self.storage + )) + self.datalake = self.cdpy.sdk.call('datalake', 'create_azure_datalake', **payload) + elif environment['cloudPlatform'] == 'GCP': + payload.update(cloudProviderConfiguration=dict( + serviceAccountEmail=self.instance_profile, + storageLocation=self.storage + )) + self.datalake = self.cdpy.sdk.call('datalake', 'create_gcp_datalake', **payload) else: - self.module.fail_json( - msg="Datalakes not yet implemented for this Environment Type" - ) + self.module.fail_json(msg='Datalakes not yet implemented for this Environment Type') self.changed = True if self.wait and not self.module.check_mode: self.datalake = self.cdpy.sdk.wait_for_state( describe_func=self.cdpy.datalake.describe_datalake, params=dict(name=self.name), - field="status", - state="RUNNING", + field='status', + state='RUNNING', delay=self.delay, - timeout=self.timeout, + timeout=self.timeout ) def delete_datalake(self): @@ -572,11 +529,14 @@ def delete_datalake(self): params=dict(name=self.name), field=None, delay=self.delay, - timeout=self.timeout, + timeout=self.timeout ) def _configure_payload(self): - payload = dict(datalakeName=self.name, environmentName=self.environment,) + payload = dict( + datalakeName=self.name, + environmentName=self.environment, + ) if self.runtime: payload.update(runtime=self.runtime) @@ -588,121 +548,81 @@ def _configure_payload(self): payload.update(enableRangerRaz=self.raz) if self.tags is not None: - payload["tags"] = list() + payload['tags'] = list() for k in self.tags: - payload["tags"].append(dict(key=k, value=str(self.tags[k]))) + payload['tags'].append(dict(key=k, value=str(self.tags[k]))) return payload def _reconcile_existing_state(self, existing): mismatched = list() - if "cloudPlatform" in existing and existing["cloudPlatform"] == "AWS": - if ( - self.instance_profile is not None - and self.instance_profile - != existing["awsConfiguration"]["instanceProfile"] - ): - mismatched.append( - [ - "instance_profile", - existing["awsConfiguration"]["instanceProfile"], - ] - ) + if 'cloudPlatform' in existing and existing['cloudPlatform'] == 'AWS': + if self.instance_profile is not None and \ + self.instance_profile != existing['awsConfiguration']['instanceProfile']: + mismatched.append(['instance_profile', existing['awsConfiguration']['instanceProfile']]) if self.storage is not None: - self.module.warn( - "Updating an existing Datalake's 'storage' " - "directly is not supported at this time. If " - "you need to change the storage, explicitly " - "delete and recreate the Datalake." - ) + self.module.warn("Updating an existing Datalake's 'storage' " + "directly is not supported at this time. If " + "you need to change the storage, explicitly " + "delete and recreate the Datalake.") if self.runtime: - self.module.warn( - "Updating an existing Datalake's 'runtime' " - "directly is not supported at this time. If you " - "need to change the runtime, either use the " - "'upgrade' state or explicitly delete and " - "recreate the Datalake." - ) + self.module.warn("Updating an existing Datalake's 'runtime' " + "directly is not supported at this time. If you " + "need to change the runtime, either use the " + "'upgrade' state or explicitly delete and " + "recreate the Datalake.") if self.scale: - self.module.warn( - "Updating an existing Datalake's 'scale' " - "directly is not supported at this time. If you " - "need to change the scale, explicitly delete " - "and recreate the Datalake." - ) + self.module.warn("Updating an existing Datalake's 'scale' " + "directly is not supported at this time. If you " + "need to change the scale, explicitly delete " + "and recreate the Datalake.") if self.tags: - self.module.warn( - "Updating an existing Datalake's 'tags' " - "directly are not supported at this time. If you " - "need to change the tags, explicitly delete " - "and recreate the Datalake." - ) + self.module.warn("Updating an existing Datalake's 'tags' " + "directly are not supported at this time. If you " + "need to change the tags, explicitly delete " + "and recreate the Datalake.") if self.raz: - self.module.warn( - "Updating an existing Datalake's 'enableRangerRaz' " - "directly is not supported at this time. If you " - "need to change the enableRangerRaz, explicitly delete " - "and recreate the Datalake." - ) + self.module.warn("Updating an existing Datalake's 'enableRangerRaz' " + "directly is not supported at this time. If you " + "need to change the enableRangerRaz, explicitly delete " + "and recreate the Datalake.") return mismatched def _validate_datalake_name(self): if len(self.name) < 5 or len(self.name) > 100: self.module.fail_json( - msg="Invalid datalake name, '%s'. Names must be between 5-100 characters." - % self.name - ) - elif ( - self.cdpy.sdk.regex_search(self.cdpy.sdk.DATALAKE_NAME_PATTERN, self.name) - is not None - ): - self.module.fail_json( - msg="Invalid datalake name, '%s'. Names must contain only lowercase " - "letters, numbers and hyphens." % self.name - ) + msg="Invalid datalake name, '%s'. Names must be between 5-100 characters." % self.name) + elif self.cdpy.sdk.regex_search(self.cdpy.sdk.DATALAKE_NAME_PATTERN, self.name) is not None: + self.module.fail_json(msg="Invalid datalake name, '%s'. Names must contain only lowercase " + "letters, numbers and hyphens." % self.name) def main(): module = AnsibleModule( argument_spec=CdpModule.argument_spec( - name=dict(required=True, type="str", aliases=["datalake"]), - state=dict( - required=False, - type="str", - choices=["present", "absent"], - default="present", - ), - instance_profile=dict( - required=False, type="str", aliases=["managed_identity"] - ), - storage=dict( - required=False, - type="str", - aliases=["storage_location", "storage_location_base"], - ), - environment=dict(required=False, type="str", aliases=["env"]), - runtime=dict(required=False, type="str"), - scale=dict( - required=False, type="str", choices=["LIGHT_DUTY", "MEDIUM_DUTY_HA"] - ), - tags=dict(required=False, type="dict", aliases=["datalake_tags"]), - force=dict(required=False, type="bool", default=False), - wait=dict(required=False, type="bool", default=True), - delay=dict( - required=False, type="int", aliases=["polling_delay"], default=15 - ), - timeout=dict( - required=False, type="int", aliases=["polling_timeout"], default=3600 - ), - raz=dict(required=False, type="bool", default=False), + name=dict(required=True, type='str', aliases=['datalake']), + state=dict(required=False, type='str', choices=['present', 'absent'], default='present'), + instance_profile=dict(required=False, type='str', aliases=['managed_identity']), + storage=dict(required=False, type='str', aliases=['storage_location', 'storage_location_base']), + + environment=dict(required=False, type='str', aliases=['env']), + runtime=dict(required=False, type='str'), + scale=dict(required=False, type='str', choices=['LIGHT_DUTY', 'MEDIUM_DUTY_HA']), + tags=dict(required=False, type='dict', aliases=['datalake_tags']), + + force=dict(required=False, type='bool', default=False), + wait=dict(required=False, type='bool', default=True), + delay=dict(required=False, type='int', aliases=['polling_delay'], default=15), + timeout=dict(required=False, type='int', aliases=['polling_timeout'], default=3600), + raz=dict(required=False, type="bool", default=False) ), - supports_check_mode=True, + supports_check_mode=True ) result = Datalake(module) @@ -714,5 +634,5 @@ def main(): module.exit_json(**output) -if __name__ == "__main__": +if __name__ == '__main__': main() From f51f128a50dd1d6bc7537fa93d46c0972c158249 Mon Sep 17 00:00:00 2001 From: Nicolaie Marian Date: Mon, 24 Jan 2022 13:22:38 +0100 Subject: [PATCH 3/3] feat: raz; Signed-off-by: Nicolaie Marian nmarian85@gmail.com Signed-off-by: Nicolaie Marian --- plugins/modules/datalake.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/modules/datalake.py b/plugins/modules/datalake.py index 0b27229f..7b473ceb 100644 --- a/plugins/modules/datalake.py +++ b/plugins/modules/datalake.py @@ -135,7 +135,7 @@ - polling_timeout raz: description: - - Flag indicating if Ranger RAZ should be enabled for the datalake + - Flag indicating if Ranger RAZ fine grained access should be enabled for the datalake type: bool required: False default: False