OLD | NEW |
(Empty) | |
| 1 # -*- coding: utf-8 -*- |
| 2 # Copyright 2011 Google Inc. All Rights Reserved. |
| 3 # |
| 4 # Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 # you may not use this file except in compliance with the License. |
| 6 # You may obtain a copy of the License at |
| 7 # |
| 8 # http://www.apache.org/licenses/LICENSE-2.0 |
| 9 # |
| 10 # Unless required by applicable law or agreed to in writing, software |
| 11 # distributed under the License is distributed on an "AS IS" BASIS, |
| 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 # See the License for the specific language governing permissions and |
| 14 # limitations under the License. |
| 15 """Implementation of mb command for creating cloud storage buckets.""" |
| 16 |
| 17 from __future__ import absolute_import |
| 18 |
| 19 import textwrap |
| 20 |
| 21 from gslib.cloud_api import BadRequestException |
| 22 from gslib.command import Command |
| 23 from gslib.command_argument import CommandArgument |
| 24 from gslib.cs_api_map import ApiSelector |
| 25 from gslib.exception import CommandException |
| 26 from gslib.storage_url import StorageUrlFromString |
| 27 from gslib.third_party.storage_apitools import storage_v1_messages as apitools_m
essages |
| 28 from gslib.util import NO_MAX |
| 29 |
| 30 |
| 31 _SYNOPSIS = """ |
| 32 gsutil mb [-c class] [-l location] [-p proj_id] uri... |
| 33 """ |
| 34 |
| 35 _DETAILED_HELP_TEXT = (""" |
| 36 <B>SYNOPSIS</B> |
| 37 """ + _SYNOPSIS + """ |
| 38 |
| 39 |
| 40 <B>DESCRIPTION</B> |
| 41 The mb command creates a new bucket. Google Cloud Storage has a single |
| 42 namespace, so you will not be allowed to create a bucket with a name already |
| 43 in use by another user. You can, however, carve out parts of the bucket name |
| 44 space corresponding to your company's domain name (see "gsutil help naming"). |
| 45 |
| 46 If you don't specify a project ID using the -p option, the bucket |
| 47 will be created using the default project ID specified in your gsutil |
| 48 configuration file (see "gsutil help config"). For more details about |
| 49 projects see "gsutil help projects". |
| 50 |
| 51 The -c and -l options specify the storage class and location, respectively, |
| 52 for the bucket. Once a bucket is created in a given location and with a |
| 53 given storage class, it cannot be moved to a different location, and the |
| 54 storage class cannot be changed. Instead, you would need to create a new |
| 55 bucket and move the data over and then delete the original bucket. |
| 56 |
| 57 |
| 58 <B>BUCKET STORAGE CLASSES</B> |
| 59 If you don't specify a -c option, the bucket will be created with the default |
| 60 (Standard) storage class. |
| 61 |
| 62 If you specify -c DURABLE_REDUCED_AVAILABILITY (or -c DRA), it causes the data |
| 63 stored in the bucket to use Durable Reduced Availability storage. Buckets |
| 64 created with this storage class have lower availability than Standard storage |
| 65 class buckets, but durability equal to that of buckets created with Standard |
| 66 storage class. This option allows users to reduce costs for data for which |
| 67 lower availability is acceptable. Durable Reduced Availability storage would |
| 68 not be appropriate for "hot" objects (i.e., objects being accessed frequently) |
| 69 or for interactive workloads; however, it might be appropriate for other types |
| 70 of applications. See the online documentation for |
| 71 `pricing <https://cloud.google.com/storage/pricing>`_ |
| 72 and `SLA <https://cloud.google.com/storage/sla>`_ |
| 73 details. |
| 74 |
| 75 |
| 76 If you specify -c NEARLINE (or -c NL), it causes the data |
| 77 stored in the bucket to use Nearline storage. Buckets created with this |
| 78 storage class have higher latency and lower throughput than Standard storage |
| 79 class buckets. The availability and durability remains equal to that of |
| 80 buckets created with the Standard storage class. This option is best for |
| 81 objects which are accessed rarely and for which slower performance is |
| 82 acceptable. See the online documentation for |
| 83 `pricing <https://cloud.google.com/storage/pricing>`_ and |
| 84 `SLA <https://cloud.google.com/storage/sla>`_ details. |
| 85 |
| 86 |
| 87 <B>BUCKET LOCATIONS</B> |
| 88 If you don't specify a -l option, the bucket will be created in the default |
| 89 location (US). Otherwise, you can specify one of the available continental |
| 90 locations: |
| 91 |
| 92 - ASIA (Asia) |
| 93 - EU (European Union) |
| 94 - US (United States) |
| 95 |
| 96 Example: |
| 97 gsutil mb -l ASIA gs://some-bucket |
| 98 |
| 99 If you specify the Durable Reduced Availability storage class (-c DRA), you |
| 100 can specify one of the continental locations above or one of the regional |
| 101 locations below: |
| 102 |
| 103 - ASIA-EAST1 (Eastern Asia-Pacific) |
| 104 - US-EAST1 (Eastern United States) [1]_ |
| 105 - US-EAST2 (Eastern United States) [1]_ |
| 106 - US-EAST3 (Eastern United States) [1]_ |
| 107 - US-CENTRAL1 (Central United States) [1]_ |
| 108 - US-CENTRAL2 (Central United States) [1]_ |
| 109 - US-WEST1 (Western United States) [1]_ |
| 110 |
| 111 Example: |
| 112 gsutil mb -c DRA -l US-CENTRAL1 gs://some-bucket |
| 113 |
| 114 .. [1] These locations are for `Regional Buckets <https://developers.google.co
m/storage/docs/regional-buckets>`_. |
| 115 Regional Buckets is an experimental feature and data stored in these |
| 116 locations is not subject to the usual SLA. See the documentation for |
| 117 additional information. |
| 118 |
| 119 |
| 120 <B>OPTIONS</B> |
| 121 -c class Can be DRA (or DURABLE_REDUCED_AVAILABILITY), NL (or |
| 122 NEARLINE), or S (or STANDARD). Default is STANDARD. |
| 123 |
| 124 -l location Can be any continental location as described above, or |
| 125 for DRA storage class, any regional or continental |
| 126 location. Default is US. Locations are case insensitive. |
| 127 |
| 128 -p proj_id Specifies the project ID under which to create the bucket. |
| 129 """) |
| 130 |
| 131 |
| 132 class MbCommand(Command): |
| 133 """Implementation of gsutil mb command.""" |
| 134 |
| 135 # Command specification. See base class for documentation. |
| 136 command_spec = Command.CreateCommandSpec( |
| 137 'mb', |
| 138 command_name_aliases=['makebucket', 'createbucket', 'md', 'mkdir'], |
| 139 usage_synopsis=_SYNOPSIS, |
| 140 min_args=1, |
| 141 max_args=NO_MAX, |
| 142 supported_sub_args='c:l:p:', |
| 143 file_url_ok=False, |
| 144 provider_url_ok=False, |
| 145 urls_start_arg=0, |
| 146 gs_api_support=[ApiSelector.XML, ApiSelector.JSON], |
| 147 gs_default_api=ApiSelector.JSON, |
| 148 argparse_arguments=[ |
| 149 CommandArgument.MakeZeroOrMoreCloudBucketURLsArgument() |
| 150 ] |
| 151 ) |
| 152 # Help specification. See help_provider.py for documentation. |
| 153 help_spec = Command.HelpSpec( |
| 154 help_name='mb', |
| 155 help_name_aliases=[ |
| 156 'createbucket', 'makebucket', 'md', 'mkdir', 'location', 'dra', |
| 157 'dras', 'reduced_availability', 'durable_reduced_availability', 'rr', |
| 158 'reduced_redundancy', 'standard', 'storage class', 'nearline', 'nl'], |
| 159 help_type='command_help', |
| 160 help_one_line_summary='Make buckets', |
| 161 help_text=_DETAILED_HELP_TEXT, |
| 162 subcommand_help_text={}, |
| 163 ) |
| 164 |
| 165 def RunCommand(self): |
| 166 """Command entry point for the mb command.""" |
| 167 location = None |
| 168 storage_class = None |
| 169 if self.sub_opts: |
| 170 for o, a in self.sub_opts: |
| 171 if o == '-l': |
| 172 location = a |
| 173 elif o == '-p': |
| 174 self.project_id = a |
| 175 elif o == '-c': |
| 176 storage_class = self._Normalize_Storage_Class(a) |
| 177 |
| 178 bucket_metadata = apitools_messages.Bucket(location=location, |
| 179 storageClass=storage_class) |
| 180 |
| 181 for bucket_uri_str in self.args: |
| 182 bucket_uri = StorageUrlFromString(bucket_uri_str) |
| 183 if not bucket_uri.IsBucket(): |
| 184 raise CommandException('The mb command requires a URI that specifies a ' |
| 185 'bucket.\n"%s" is not valid.' % bucket_uri) |
| 186 |
| 187 self.logger.info('Creating %s...', bucket_uri) |
| 188 # Pass storage_class param only if this is a GCS bucket. (In S3 the |
| 189 # storage class is specified on the key object.) |
| 190 try: |
| 191 self.gsutil_api.CreateBucket( |
| 192 bucket_uri.bucket_name, project_id=self.project_id, |
| 193 metadata=bucket_metadata, provider=bucket_uri.scheme) |
| 194 except BadRequestException as e: |
| 195 if (e.status == 400 and e.reason == 'DotfulBucketNameNotUnderTld' and |
| 196 bucket_uri.scheme == 'gs'): |
| 197 bucket_name = bucket_uri.bucket_name |
| 198 final_comp = bucket_name[bucket_name.rfind('.')+1:] |
| 199 raise CommandException('\n'.join(textwrap.wrap( |
| 200 'Buckets with "." in the name must be valid DNS names. The bucket' |
| 201 ' you are attempting to create (%s) is not a valid DNS name,' |
| 202 ' because the final component (%s) is not currently a valid part' |
| 203 ' of the top-level DNS tree.' % (bucket_name, final_comp)))) |
| 204 else: |
| 205 raise |
| 206 |
| 207 return 0 |
| 208 |
| 209 def _Normalize_Storage_Class(self, sc): |
| 210 sc = sc.upper() |
| 211 if sc in ('DRA', 'DURABLE_REDUCED_AVAILABILITY'): |
| 212 return 'DURABLE_REDUCED_AVAILABILITY' |
| 213 if sc in ('S', 'STD', 'STANDARD'): |
| 214 return 'STANDARD' |
| 215 if sc in ('NL', 'NEARLINE'): |
| 216 return 'NEARLINE' |
| 217 return sc |
OLD | NEW |