tools/gcs-bucket-mover/gcs_bucket_mover/bucket_details.py (107 lines of code) (raw):
# Copyright 2018 Google LLC. All rights reserved. Licensed under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
# or implied. See the License for the specific language governing permissions and limitations under
# the License.
#
# Any software provided by Google hereunder is distributed "AS IS", WITHOUT WARRANTIES OR
# CONDITIONS OF ANY KIND, and is not intended for production use.
"""This is used to track the settings of the source bucket.
It is required so that after the source bucket is deleted, we can create the new one with all of
the same details and settings.
"""
class BucketDetails(object):
"""Holds the details and settings of a bucket."""
# pylint: disable=attribute-defined-outside-init
# This is done intentionally so that properties set either in the init or modified in outside
# code will be forced to follow the skip rules specified on the command line.
# pylint: disable=too-many-instance-attributes
# All of these attributes relate to the bucket being copied.
def __init__(self, conf, source_bucket):
"""Init the class from a source bucket.
Args:
conf: the configargparser parsing of command line options
source_bucket: a google.cloud.storage.Bucket object that the bucket details should be
copied from.
"""
# Unless these values are specified on the command line, use the values from the source
# bucket
self.location = conf.location or source_bucket.location
self.storage_class = conf.storage_class or source_bucket.storage_class
self._set_skip_settings(conf)
# These properties can be skipped with cmd line params, so use the property setters to
# make the checks
self.iam_policy = source_bucket.get_iam_policy()
self.is_uniform_bucket = vars(source_bucket)["_properties"][
"iamConfiguration"]["uniformBucketLevelAccess"]["enabled"]
if not self.is_uniform_bucket:
self.acl_entities = (source_bucket.acl.get_entities()
if not self._skip_acl else None)
self.default_obj_acl_entities = (
source_bucket.default_object_acl.get_entities()
if not self._skip_default_obj_acl else None)
else:
self.acl_entities = None
self.default_obj_acl_entities = None
self.requester_pays = source_bucket.requester_pays
self.cors = source_bucket.cors
self.default_kms_key_name = source_bucket.default_kms_key_name
self.labels = source_bucket.labels
# lifecycle_rules returns a generator
self.lifecycle_rules = list(source_bucket.lifecycle_rules)
self.logging = source_bucket.get_logging()
self.versioning_enabled = source_bucket.versioning_enabled
# Unlike all other bucket properties, notifications are only given as an iterator
self.notifications = list(source_bucket.list_notifications())
def _set_skip_settings(self, conf):
"""Set up which settings need to be skipped and which ones should be copied"""
self._skip_acl = True if conf.skip_everything else conf.skip_acl
self._skip_cors = True if conf.skip_everything else conf.skip_cors
self._skip_default_obj_acl = (True if conf.skip_everything else
conf.skip_default_obj_acl)
self._skip_iam = True if conf.skip_everything else conf.skip_iam
self._skip_kms_key = True if conf.skip_everything else conf.skip_kms_key
self._skip_labels = True if conf.skip_everything else conf.skip_labels
self._skip_logging = True if conf.skip_everything else conf.skip_logging
self._skip_lifecycle_rules = (True if conf.skip_everything else
conf.skip_lifecycle_rules)
self._skip_notifications = (True if conf.skip_everything else
conf.skip_notifications)
self._skip_requester_pays = (True if conf.skip_everything else
conf.skip_requester_pays)
self._skip_versioning = True if conf.skip_everything else conf.skip_versioning
@property
def iam_policy(self):
"""Get the bucket IAM policy"""
return self._iam_policy
@iam_policy.setter
def iam_policy(self, value):
self._iam_policy = None if self._skip_iam else value
@property
def acl_entities(self):
"""Get the bucket ACL entities"""
return self._acl_entities
@acl_entities.setter
def acl_entities(self, value):
self._acl_entities = None if self._skip_acl else value
@property
def default_obj_acl_entities(self):
"""Get the bucket's default object ACL entities"""
return self._default_obj_acl_entities
@default_obj_acl_entities.setter
def default_obj_acl_entities(self, value):
self._default_obj_acl_entities = None if self._skip_default_obj_acl else value
@property
def requester_pays(self):
"""Get the boolean for if the bucket is set as requester pays"""
return self._requester_pays
@requester_pays.setter
def requester_pays(self, value):
self._requester_pays = None if self._skip_requester_pays else value
@property
def cors(self):
"""Get the CORS settings of the bucket"""
return self._cors
@cors.setter
def cors(self, value):
self._cors = None if self._skip_cors else value
@property
def default_kms_key_name(self):
"""Get the bucket's default KMS key's name"""
return self._default_kms_key_name
@default_kms_key_name.setter
def default_kms_key_name(self, value):
self._default_kms_key_name = None if self._skip_kms_key else value
@property
def labels(self):
"""Get the labels on the bucket"""
return self._labels
@labels.setter
def labels(self, value):
self._labels = {} if self._skip_labels else value
@property
def lifecycle_rules(self):
"""Get the lifecycle rules for the bucket"""
return self._lifecycle_rules
@lifecycle_rules.setter
def lifecycle_rules(self, value):
self._lifecycle_rules = None if self._skip_lifecycle_rules else value
@property
def logging(self):
"""Get the logging settings for the bucket"""
return self._logging
@logging.setter
def logging(self, value):
self._logging = None if self._skip_logging else value
@property
def versioning_enabled(self):
"""Get the boolean on if the bucket has versioning enabled"""
return self._versioning_enabled
@versioning_enabled.setter
def versioning_enabled(self, value):
self._versioning_enabled = None if self._skip_versioning else value
@property
def notifications(self):
"""Get the notifications set up for the bucket"""
return self._notifications
@notifications.setter
def notifications(self, value):
self._notifications = [] if self._skip_notifications else value