from enum import Enum
import logging
import attr
from .. import entities, exceptions, repositories
from ..services.api_client import ApiClient
logger = logging.getLogger(name='dtlpy')
[docs]class IntegrationType(str, Enum):
""" The type of the Integration.
.. list-table::
:widths: 15 150
:header-rows: 1
* - State
- Description
* - S3
- S3 Integration - for S3 drivers
* - AWS_CROSS_ACCOUNT
- AWS CROSS ACCOUNT Integration - for S3 drivers
* - AWS_STS
- AWS STS Integration - for S3 drivers
* - GCS
- GCS Integration - for GCS drivers
* - GCP_CROSS_PROJECT
- GCP CROSS PROJECT Integration - for GCP drivers
* - AZUREBLOB
- AZURE BLOB Integration - for S3 AZUREBLOB and AZURE_DATALAKE_GEN2 drivers
* - KEY_VALUE
- KEY VALUE Integration - for save secrets in the platform
* - GCP_WORKLOAD_IDENTITY_FEDERATION
- GCP Workload Identity Federation Integration - for GCP drivers
"""
S3 = "s3"
AWS_CROSS_ACCOUNT = 'aws-cross'
AWS_STS = 'aws-sts'
GCS = "gcs"
GCS_CROSS = "gcp-cross"
AZUREBLOB = "azureblob"
KEY_VALUE = "key_value"
GCP_WORKLOAD_IDENTITY_FEDERATION = "gcp-workload-identity-federation"
[docs]@attr.s
class Integration(entities.BaseEntity):
"""
Integration object
"""
id = attr.ib()
name = attr.ib()
type = attr.ib()
org = attr.ib()
created_at = attr.ib()
creator = attr.ib()
update_at = attr.ib()
url = attr.ib()
_client_api = attr.ib(type=ApiClient, repr=False)
metadata = attr.ib(default=None, repr=False)
_project = attr.ib(default=None, repr=False)
[docs] @classmethod
def from_json(cls,
_json: dict,
client_api: ApiClient,
is_fetched=True):
"""
Build a Integration entity object from a json
:param _json: _json response from host
:param client_api: ApiClient entity
:param is_fetched: is Entity fetched from Platform
:return: Integration object
"""
inst = cls(id=_json.get('id', None),
name=_json.get('name', None),
creator=_json.get('creator', None),
created_at=_json.get('createdAt', None),
update_at=_json.get('updatedAt', None),
type=_json.get('type', None),
org=_json.get('org', None),
client_api=client_api,
metadata=_json.get('metadata', None),
url=_json.get('url', None))
inst.is_fetched = is_fetched
return inst
[docs] def to_json(self):
"""
Returns platform _json format of object
:return: platform json format of object
:rtype: dict
"""
_json = attr.asdict(self, filter=attr.filters.exclude(attr.fields(Integration)._client_api,
attr.fields(Integration)._project))
return _json
@property
def project(self):
return self._project
@project.setter
def project(self, project):
if not isinstance(project, entities.Project):
raise ValueError('Must input a valid Project entity')
self._project = project
[docs] def update(self,
new_name: str = None,
new_options: dict = None):
"""
Update the integration's name.
**Prerequisites**: You must be an *owner* in the organization.
:param str new_name: new name
:param dict new_options: new value
:return: Integration object
:rtype: dtlpy.entities.integration.Integration
**Examples for options include**:
s3 - {key: "", secret: ""};
gcs - {key: "", secret: "", content: ""};
azureblob - {key: "", secret: "", clientId: "", tenantId: ""};
key_value - {key: "", value: ""}
aws-sts - {key: "", secret: "", roleArns: ""}
aws-cross - {roleArns: ""}
**Example**:
.. code-block:: python
project.integrations.update(integrations_id='integrations_id', new_name="new_integration_name")
"""
if self.project is not None:
identifier = self.project
elif self.org is not None:
identifier = repositories.organizations.Organizations(client_api=self._client_api).get(
organization_id=self.org)
else:
raise exceptions.PlatformException(
error='400',
message='Must provide an identifier in inputs')
identifier.integrations.update(new_name=new_name,
integrations_id=self.id,
integration=self,
new_options=new_options)
[docs] def delete(self,
sure: bool = False,
really: bool = False) -> bool:
"""
Delete integrations from the Organization
:param bool sure: are you sure you want to delete?
:param bool really: really really?
:return: True
:rtype: bool
"""
if self.project is not None:
identifier = self.project
elif self.org is not None:
identifier = repositories.organizations.Organizations(client_api=self._client_api).get(
organization_id=self.org)
else:
raise exceptions.PlatformException(
error='400',
message='Must provide an identifier in inputs')
return identifier.integrations.delete(integrations_id=self.id, sure=sure, really=really)