def __init__(self, tag_prefix, entity_resource: EntityResource, construct=False): """Construct new backup resource out of entity resource (e.g. ebs volume).""" # if object manually created if construct: return # current date self.date_created = datetime.utcnow() self.account_id = AwsHelper.local_account_id() # determine retention period if self.date_created.day == 1: if self.date_created.month == 1: self.retention_type = self.RETENTION_YEARLY else: self.retention_type = self.RETENTION_MONTHLY elif self.date_created.weekday() == 6: self.retention_type = self.RETENTION_WEEKLY else: self.retention_type = self.RETENTION_DAILY # determine backup name. Hash of resource id is added to support creating backups # with resources having a same name if 'Name' in entity_resource.tags: name = entity_resource.tags['Name'] name = name + '-' + hashlib.md5(entity_resource.resource_id.encode('utf-8')).hexdigest()[0:6] else: name = entity_resource.resource_id # replace anything that is not alphanumeric to hyphen # do not allow two hyphens next to each other name = re.sub('[^a-zA-Z0-9\-]', '-', name) name = re.sub('\-+','-',name) date_formatted = self.date_created.strftime(self.TIMESTAMP_FORMAT) self.name = f"{name}-{date_formatted}-{self.retention_type}" self.entity_id = entity_resource.resource_id self.entity_resource = entity_resource self.__region = entity_resource.resource_region self.tags = { 'Name': self.name, "shelvery:tag_name": tag_prefix, f"{tag_prefix}:date_created": date_formatted, f"{tag_prefix}:src_account": self.account_id, f"{tag_prefix}:name": self.name, f"{tag_prefix}:region": entity_resource.resource_region, f"{tag_prefix}:retention_type": self.retention_type, f"{tag_prefix}:entity_id": entity_resource.resource_id, f"{tag_prefix}:{self.BACKUP_MARKER_TAG}": 'true' } self.backup_id = None self.expire_date = None self.date_deleted = None
def __init__(self): # system logger FORMAT = "%(asctime)s %(process)s %(thread)s: %(message)s" logging.basicConfig(format=FORMAT) logging.info("Initialize logger") self.logger = logging.getLogger() self.logger.setLevel(logging.INFO) self.aws_request_id = 0 self.lambda_wait_iteration = 0 self.lambda_payload = None self.lambda_context = None self.account_id = AwsHelper.local_account_id() self.region = AwsHelper.local_region() self.snspublisher = ShelveryNotification( RuntimeConfig.get_sns_topic(self))
def cross_account_copy(self, new_backup_id): backup = copy.deepcopy(self) # backup name and retention type are copied backup.backup_id = new_backup_id backup.region = AwsHelper.local_region() backup.account_id = AwsHelper.local_account_id() tag_prefix = self.tags['shelvery:tag_name'] backup.tags[f"{tag_prefix}:region"] = backup.region backup.tags[f"{tag_prefix}:date_copied"] = datetime.utcnow().strftime(self.TIMESTAMP_FORMAT) backup.tags[f"{tag_prefix}:dst_account"] = backup.account_id backup.tags[f"{tag_prefix}:src_region"] = self.region backup.tags[f"{tag_prefix}:region"] = backup.region backup.tags[f"{tag_prefix}:dr_copy"] = 'false' backup.tags[f"{tag_prefix}:cross_account_copy"] = 'true' backup.tags[f"{tag_prefix}:dr_regions"] = '' backup.tags[f"{tag_prefix}:dr_copies"] = '' return backup
def construct(cls, tag_prefix: str, backup_id: str, tags: Dict): """ Construct BackupResource object from object id and aws tags stored by shelvery """ obj = BackupResource(None, None, True) obj.entity_resource = None obj.entity_id = None obj.backup_id = backup_id obj.tags = tags # read properties from tags obj.retention_type = tags[f"{tag_prefix}:retention_type"] obj.name = tags[f"{tag_prefix}:name"] if f"{tag_prefix}:entity_id" in tags: obj.entity_id = tags[f"{tag_prefix}:entity_id"] try: obj.date_created = datetime.strptime( tags[f"{tag_prefix}:date_created"], cls.TIMESTAMP_FORMAT) except Exception as e: if 'does not match format' in str(e): str_date = tags[f"{tag_prefix}:date_created"] print( f"Failed to read {str_date} as date, trying legacy format {cls.TIMESTAMP_FORMAT_LEGACY}" ) obj.date_created = datetime.strptime( tags[f"{tag_prefix}:date_created"], cls.TIMESTAMP_FORMAT_LEGACY) obj.region = tags[f"{tag_prefix}:region"] if f"{tag_prefix}:src_account" in tags: obj.account_id = tags[f"{tag_prefix}:src_account"] else: obj.account_id = AwsHelper.local_account_id() return obj
def get_local_bucket_name(cls, region=None): account_id = AwsHelper.local_account_id() if region is None: region = AwsHelper.local_region() bucket_name = f"shelvery.data.{account_id}-{region}.base2tools" return bucket_name