Module core.default.resources.simple.object_store

Set of constructs for creating Cloud Object Stores like S3

Expand source code
"""Set of constructs for creating Cloud Object Stores like S3

"""

from enum import Enum
from typing import Any, Dict

from core.constructs.resource import (
    Resource,
    TaggableResourceModel,
    update_hash,
    ResourceOutputs,
    PermissionsAvailableMixin,
    TaggableMixin,
)
from core.constructs.cloud_output import Cloud_Output_Str, OutputType
from core.constructs.types import cdev_str_model
from core.utils import hasher
from core.constructs.models import frozendict

from core.default.resources.simple.iam import Permission

from core.default.resources.simple.events import Event, event_model

RUUID = "cdev::simple::bucket"


class Bucket_Event_Type(str, Enum):
    Object_Created = "s3:ObjectCreated:*"
    """Receive Events when Objects are created in the `Bucket`"""
    Object_Removed = "s3:ObjectRemoved:*"
    """Receive Events when Objects are removed from the `Bucket`"""
    Object_Restore = "s3:ObjectRestore:*"
    """Receive Events when Objects are restored to the `Bucket`"""
    Object_Replicaton = "s3:ObjectReplication:*"
    """Receive Events when Objects are replicated to the `Bucket`"""


class bucket_event_model(event_model):
    """Model representing an Event from a Bucket

    Args:
        bucket_arn (cdev_str_model)
        bucket_name (cdev_str_model)
        bucket_event_type (Bucket_Event_Type)
    """

    bucket_arn: cdev_str_model
    bucket_name: cdev_str_model
    bucket_event_type: Bucket_Event_Type


class BucketEvent(Event):
    """Construct representing an Event from a Bucket"""

    def __init__(self, bucket_name: str, bucket_event_type: Bucket_Event_Type) -> None:
        """
        Args:
            bucket_name (str): Cdev name of the bucket
            bucket_event_type (Bucket_Event_Type): Type fo events to create
        """
        self.bucket_cdev_name = bucket_name
        self.bucket_event_type = bucket_event_type
        self.bucket_arn = Cloud_Output_Str(
            name=bucket_name, ruuid=RUUID, key="cloud_id", type=OutputType.RESOURCE
        )
        self.bucket_name = Cloud_Output_Str(
            name=bucket_name, ruuid=RUUID, key="bucket_name", type=OutputType.RESOURCE
        )

    def render(self) -> bucket_event_model:
        return bucket_event_model(
            originating_resource_name=self.bucket_cdev_name,
            originating_resource_type=RUUID,
            hash=self.hash(),
            bucket_event_type=self.bucket_event_type,
            bucket_arn=self.bucket_arn.render(),
            bucket_name=self.bucket_name.render(),
        )

    def hash(self) -> str:
        return hasher.hash_list([self.bucket_cdev_name, self.bucket_event_type])


class BucketPermissions:
    RUUID = "cdev::simple::bucket"

    def __init__(self, resource_name: str) -> None:

        self.LIST_BUCKET = Permission(
            actions=["s3:ListBucket"],
            cloud_id=Cloud_Output_Str(
                resource_name, RUUID, "cloud_id", OutputType.RESOURCE
            ),
            effect="Allow",
        )
        """Permissions to list objects from the `Bucket`"""

        self.READ_BUCKET = Permission(
            actions=["s3:GetObject", "s3:GetObjectVersion"],
            cloud_id=Cloud_Output_Str(
                resource_name, RUUID, "cloud_id", OutputType.RESOURCE
            ).join(["", "/*"]),
            effect="Allow",
        )
        """Permissions to read objects from the `Bucket`"""

        self.WRITE_BUCKET = Permission(
            actions=["s3:PutObject", "s3:PutObjectAcl"],
            cloud_id=Cloud_Output_Str(
                resource_name, RUUID, "cloud_id", OutputType.RESOURCE
            ).join(["", "/*"]),
            effect="Allow",
        )
        """Permissions to write objects to the `Bucket`"""

        self.READ_AND_WRITE_BUCKET = Permission(
            actions=["s3:*Object"],
            cloud_id=Cloud_Output_Str(
                resource_name, RUUID, "cloud_id", OutputType.RESOURCE
            ).join(["", "/*"]),
            effect="Allow",
        )
        """Permissions to read and write objects to and from the `Bucket`"""

        self.READ_EVENTS = Permission(
            actions=["s3:*Object"],
            cloud_id=Cloud_Output_Str(
                resource_name, RUUID, "cloud_id", OutputType.RESOURCE
            ).join(["", "/*"]),
            effect="Allow",
        )
        """Permissions to receive events from the `Bucket`"""


class bucket_model(TaggableResourceModel):
    """Model representing a Bucket"""

    pass


class BucketOutput(ResourceOutputs):
    """Container object for the returned values from the cloud after a Bucket has been deployed."""

    def __init__(self, name: str) -> None:
        super().__init__(name, RUUID)

    @property
    def bucket_name(self) -> Cloud_Output_Str:
        """The name of the generated bucket"""
        return Cloud_Output_Str(
            name=self._name, ruuid=RUUID, key="bucket_name", type=self.OUTPUT_TYPE
        )

    @bucket_name.setter
    def bucket_name(self, value: Any) -> None:
        raise Exception


class Bucket(PermissionsAvailableMixin, TaggableMixin, Resource):
    """A Simple Bucket is a basic object store for applications to build on."""

    @update_hash
    def __init__(
        self,
        cdev_name: str,
        nonce: str = "",
        tags: Dict[str, str] = None,
    ) -> None:
        """
        Args:
            cdev_name (str): Name of the resource
            nonce (str): Nonce to make the resource hash unique if there are conflicting resources with same configuration.
            tags (Dict[str, str]): A set of tags to add to the resource
        """
        super().__init__(cdev_name, RUUID, nonce, tags=tags)

        self.available_permissions: BucketPermissions = BucketPermissions(cdev_name)
        self.output = BucketOutput(cdev_name)

    def create_event_trigger(self, event_type: Bucket_Event_Type) -> BucketEvent:
        """Create Construct of event that other resources can respond to"""

        event = BucketEvent(bucket_name=self.name, bucket_event_type=event_type)

        return event

    def compute_hash(self) -> None:
        self._hash = hasher.hash_list(
            [
                self.nonce,
                self._get_tags_hash(),
            ]
        )

    def render(self) -> bucket_model:
        return bucket_model(
            ruuid=self.ruuid,
            name=self.name,
            hash=self.hash,
            tags=frozendict(self.tags)
        )

Classes

class Bucket (cdev_name: str, nonce: str = '', tags: Dict[str, str] = None)

A Simple Bucket is a basic object store for applications to build on.

Args

cdev_name : str
Name of the resource
nonce : str
Nonce to make the resource hash unique if there are conflicting resources with same configuration.
tags : Dict[str, str]
A set of tags to add to the resource
Expand source code
class Bucket(PermissionsAvailableMixin, TaggableMixin, Resource):
    """A Simple Bucket is a basic object store for applications to build on."""

    @update_hash
    def __init__(
        self,
        cdev_name: str,
        nonce: str = "",
        tags: Dict[str, str] = None,
    ) -> None:
        """
        Args:
            cdev_name (str): Name of the resource
            nonce (str): Nonce to make the resource hash unique if there are conflicting resources with same configuration.
            tags (Dict[str, str]): A set of tags to add to the resource
        """
        super().__init__(cdev_name, RUUID, nonce, tags=tags)

        self.available_permissions: BucketPermissions = BucketPermissions(cdev_name)
        self.output = BucketOutput(cdev_name)

    def create_event_trigger(self, event_type: Bucket_Event_Type) -> BucketEvent:
        """Create Construct of event that other resources can respond to"""

        event = BucketEvent(bucket_name=self.name, bucket_event_type=event_type)

        return event

    def compute_hash(self) -> None:
        self._hash = hasher.hash_list(
            [
                self.nonce,
                self._get_tags_hash(),
            ]
        )

    def render(self) -> bucket_model:
        return bucket_model(
            ruuid=self.ruuid,
            name=self.name,
            hash=self.hash,
            tags=frozendict(self.tags)
        )

Ancestors

Methods

def compute_hash(self) ‑> None
Expand source code
def compute_hash(self) -> None:
    self._hash = hasher.hash_list(
        [
            self.nonce,
            self._get_tags_hash(),
        ]
    )
def create_event_trigger(self, event_type: Bucket_Event_Type) ‑> BucketEvent

Create Construct of event that other resources can respond to

Expand source code
def create_event_trigger(self, event_type: Bucket_Event_Type) -> BucketEvent:
    """Create Construct of event that other resources can respond to"""

    event = BucketEvent(bucket_name=self.name, bucket_event_type=event_type)

    return event
def render(self) ‑> bucket_model
Expand source code
def render(self) -> bucket_model:
    return bucket_model(
        ruuid=self.ruuid,
        name=self.name,
        hash=self.hash,
        tags=frozendict(self.tags)
    )

Inherited members

class BucketEvent (bucket_name: str, bucket_event_type: Bucket_Event_Type)

Construct representing an Event from a Bucket

Args

bucket_name : str
Cdev name of the bucket
bucket_event_type : Bucket_Event_Type
Type fo events to create
Expand source code
class BucketEvent(Event):
    """Construct representing an Event from a Bucket"""

    def __init__(self, bucket_name: str, bucket_event_type: Bucket_Event_Type) -> None:
        """
        Args:
            bucket_name (str): Cdev name of the bucket
            bucket_event_type (Bucket_Event_Type): Type fo events to create
        """
        self.bucket_cdev_name = bucket_name
        self.bucket_event_type = bucket_event_type
        self.bucket_arn = Cloud_Output_Str(
            name=bucket_name, ruuid=RUUID, key="cloud_id", type=OutputType.RESOURCE
        )
        self.bucket_name = Cloud_Output_Str(
            name=bucket_name, ruuid=RUUID, key="bucket_name", type=OutputType.RESOURCE
        )

    def render(self) -> bucket_event_model:
        return bucket_event_model(
            originating_resource_name=self.bucket_cdev_name,
            originating_resource_type=RUUID,
            hash=self.hash(),
            bucket_event_type=self.bucket_event_type,
            bucket_arn=self.bucket_arn.render(),
            bucket_name=self.bucket_name.render(),
        )

    def hash(self) -> str:
        return hasher.hash_list([self.bucket_cdev_name, self.bucket_event_type])

Ancestors

Methods

def hash(self) ‑> str
Expand source code
def hash(self) -> str:
    return hasher.hash_list([self.bucket_cdev_name, self.bucket_event_type])
def render(self) ‑> bucket_event_model
Expand source code
def render(self) -> bucket_event_model:
    return bucket_event_model(
        originating_resource_name=self.bucket_cdev_name,
        originating_resource_type=RUUID,
        hash=self.hash(),
        bucket_event_type=self.bucket_event_type,
        bucket_arn=self.bucket_arn.render(),
        bucket_name=self.bucket_name.render(),
    )
class BucketOutput (name: str)

Container object for the returned values from the cloud after a Bucket has been deployed.

Expand source code
class BucketOutput(ResourceOutputs):
    """Container object for the returned values from the cloud after a Bucket has been deployed."""

    def __init__(self, name: str) -> None:
        super().__init__(name, RUUID)

    @property
    def bucket_name(self) -> Cloud_Output_Str:
        """The name of the generated bucket"""
        return Cloud_Output_Str(
            name=self._name, ruuid=RUUID, key="bucket_name", type=self.OUTPUT_TYPE
        )

    @bucket_name.setter
    def bucket_name(self, value: Any) -> None:
        raise Exception

Ancestors

Instance variables

var bucket_nameCloud_Output_Str

The name of the generated bucket

Expand source code
@property
def bucket_name(self) -> Cloud_Output_Str:
    """The name of the generated bucket"""
    return Cloud_Output_Str(
        name=self._name, ruuid=RUUID, key="bucket_name", type=self.OUTPUT_TYPE
    )
class BucketPermissions (resource_name: str)
Expand source code
class BucketPermissions:
    RUUID = "cdev::simple::bucket"

    def __init__(self, resource_name: str) -> None:

        self.LIST_BUCKET = Permission(
            actions=["s3:ListBucket"],
            cloud_id=Cloud_Output_Str(
                resource_name, RUUID, "cloud_id", OutputType.RESOURCE
            ),
            effect="Allow",
        )
        """Permissions to list objects from the `Bucket`"""

        self.READ_BUCKET = Permission(
            actions=["s3:GetObject", "s3:GetObjectVersion"],
            cloud_id=Cloud_Output_Str(
                resource_name, RUUID, "cloud_id", OutputType.RESOURCE
            ).join(["", "/*"]),
            effect="Allow",
        )
        """Permissions to read objects from the `Bucket`"""

        self.WRITE_BUCKET = Permission(
            actions=["s3:PutObject", "s3:PutObjectAcl"],
            cloud_id=Cloud_Output_Str(
                resource_name, RUUID, "cloud_id", OutputType.RESOURCE
            ).join(["", "/*"]),
            effect="Allow",
        )
        """Permissions to write objects to the `Bucket`"""

        self.READ_AND_WRITE_BUCKET = Permission(
            actions=["s3:*Object"],
            cloud_id=Cloud_Output_Str(
                resource_name, RUUID, "cloud_id", OutputType.RESOURCE
            ).join(["", "/*"]),
            effect="Allow",
        )
        """Permissions to read and write objects to and from the `Bucket`"""

        self.READ_EVENTS = Permission(
            actions=["s3:*Object"],
            cloud_id=Cloud_Output_Str(
                resource_name, RUUID, "cloud_id", OutputType.RESOURCE
            ).join(["", "/*"]),
            effect="Allow",
        )
        """Permissions to receive events from the `Bucket`"""

Class variables

var RUUID

Instance variables

var LIST_BUCKET

Permissions to list objects from the Bucket

var READ_AND_WRITE_BUCKET

Permissions to read and write objects to and from the Bucket

var READ_BUCKET

Permissions to read objects from the Bucket

var READ_EVENTS

Permissions to receive events from the Bucket

var WRITE_BUCKET

Permissions to write objects to the Bucket

class Bucket_Event_Type (value, names=None, *, module=None, qualname=None, type=None, start=1)

An enumeration.

Expand source code
class Bucket_Event_Type(str, Enum):
    Object_Created = "s3:ObjectCreated:*"
    """Receive Events when Objects are created in the `Bucket`"""
    Object_Removed = "s3:ObjectRemoved:*"
    """Receive Events when Objects are removed from the `Bucket`"""
    Object_Restore = "s3:ObjectRestore:*"
    """Receive Events when Objects are restored to the `Bucket`"""
    Object_Replicaton = "s3:ObjectReplication:*"
    """Receive Events when Objects are replicated to the `Bucket`"""

Ancestors

  • builtins.str
  • enum.Enum

Class variables

var Object_Created

Receive Events when Objects are created in the Bucket

var Object_Removed

Receive Events when Objects are removed from the Bucket

var Object_Replicaton

Receive Events when Objects are replicated to the Bucket

var Object_Restore

Receive Events when Objects are restored to the Bucket

class bucket_event_model (**data: Any)

Model representing an Event from a Bucket

Args

bucket_arn (cdev_str_model) bucket_name (cdev_str_model) bucket_event_type (Bucket_Event_Type) Create a new model by parsing and validating input data from keyword arguments.

Raises ValidationError if the input data cannot be parsed to form a valid model.

Expand source code
class bucket_event_model(event_model):
    """Model representing an Event from a Bucket

    Args:
        bucket_arn (cdev_str_model)
        bucket_name (cdev_str_model)
        bucket_event_type (Bucket_Event_Type)
    """

    bucket_arn: cdev_str_model
    bucket_name: cdev_str_model
    bucket_event_type: Bucket_Event_Type

Ancestors

Class variables

var bucket_arn : ~cdev_str_model
var bucket_event_typeBucket_Event_Type
var bucket_name : ~cdev_str_model
class bucket_model (**data: Any)

Model representing a Bucket

Create a new model by parsing and validating input data from keyword arguments.

Raises ValidationError if the input data cannot be parsed to form a valid model.

Expand source code
class bucket_model(TaggableResourceModel):
    """Model representing a Bucket"""

    pass

Ancestors

Inherited members