PageRenderTime 31ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/boto-2.5.2/boto/__init__.py

#
Python | 698 lines | 567 code | 29 blank | 102 comment | 13 complexity | 0563aedaaf955f6cdaf678b042077a01 MD5 | raw file
  1. # Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
  2. # Copyright (c) 2010-2011, Eucalyptus Systems, Inc.
  3. # Copyright (c) 2011, Nexenta Systems Inc.
  4. # Copyright (c) 2012 Amazon.com, Inc. or its affiliates.
  5. # All rights reserved.
  6. #
  7. # Permission is hereby granted, free of charge, to any person obtaining a
  8. # copy of this software and associated documentation files (the
  9. # "Software"), to deal in the Software without restriction, including
  10. # without limitation the rights to use, copy, modify, merge, publish, dis-
  11. # tribute, sublicense, and/or sell copies of the Software, and to permit
  12. # persons to whom the Software is furnished to do so, subject to the fol-
  13. # lowing conditions:
  14. #
  15. # The above copyright notice and this permission notice shall be included
  16. # in all copies or substantial portions of the Software.
  17. #
  18. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19. # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
  20. # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
  21. # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  22. # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  24. # IN THE SOFTWARE.
  25. #
  26. from boto.pyami.config import Config, BotoConfigLocations
  27. from boto.storage_uri import BucketStorageUri, FileStorageUri
  28. import boto.plugin
  29. import os
  30. import re
  31. import sys
  32. import logging
  33. import logging.config
  34. import urlparse
  35. from boto.exception import InvalidUriError
  36. __version__ = '2.5.2'
  37. Version = __version__ # for backware compatibility
  38. UserAgent = 'Boto/%s (%s)' % (__version__, sys.platform)
  39. config = Config()
  40. def init_logging():
  41. for file in BotoConfigLocations:
  42. try:
  43. logging.config.fileConfig(os.path.expanduser(file))
  44. except:
  45. pass
  46. class NullHandler(logging.Handler):
  47. def emit(self, record):
  48. pass
  49. log = logging.getLogger('boto')
  50. log.addHandler(NullHandler())
  51. init_logging()
  52. # convenience function to set logging to a particular file
  53. def set_file_logger(name, filepath, level=logging.INFO, format_string=None):
  54. global log
  55. if not format_string:
  56. format_string = "%(asctime)s %(name)s [%(levelname)s]:%(message)s"
  57. logger = logging.getLogger(name)
  58. logger.setLevel(level)
  59. fh = logging.FileHandler(filepath)
  60. fh.setLevel(level)
  61. formatter = logging.Formatter(format_string)
  62. fh.setFormatter(formatter)
  63. logger.addHandler(fh)
  64. log = logger
  65. def set_stream_logger(name, level=logging.DEBUG, format_string=None):
  66. global log
  67. if not format_string:
  68. format_string = "%(asctime)s %(name)s [%(levelname)s]:%(message)s"
  69. logger = logging.getLogger(name)
  70. logger.setLevel(level)
  71. fh = logging.StreamHandler()
  72. fh.setLevel(level)
  73. formatter = logging.Formatter(format_string)
  74. fh.setFormatter(formatter)
  75. logger.addHandler(fh)
  76. log = logger
  77. def connect_sqs(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  78. """
  79. :type aws_access_key_id: string
  80. :param aws_access_key_id: Your AWS Access Key ID
  81. :type aws_secret_access_key: string
  82. :param aws_secret_access_key: Your AWS Secret Access Key
  83. :rtype: :class:`boto.sqs.connection.SQSConnection`
  84. :return: A connection to Amazon's SQS
  85. """
  86. from boto.sqs.connection import SQSConnection
  87. return SQSConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  88. def connect_s3(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  89. """
  90. :type aws_access_key_id: string
  91. :param aws_access_key_id: Your AWS Access Key ID
  92. :type aws_secret_access_key: string
  93. :param aws_secret_access_key: Your AWS Secret Access Key
  94. :rtype: :class:`boto.s3.connection.S3Connection`
  95. :return: A connection to Amazon's S3
  96. """
  97. from boto.s3.connection import S3Connection
  98. return S3Connection(aws_access_key_id, aws_secret_access_key, **kwargs)
  99. def connect_gs(gs_access_key_id=None, gs_secret_access_key=None, **kwargs):
  100. """
  101. @type gs_access_key_id: string
  102. @param gs_access_key_id: Your Google Cloud Storage Access Key ID
  103. @type gs_secret_access_key: string
  104. @param gs_secret_access_key: Your Google Cloud Storage Secret Access Key
  105. @rtype: L{GSConnection<boto.gs.connection.GSConnection>}
  106. @return: A connection to Google's Storage service
  107. """
  108. from boto.gs.connection import GSConnection
  109. return GSConnection(gs_access_key_id, gs_secret_access_key, **kwargs)
  110. def connect_ec2(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  111. """
  112. :type aws_access_key_id: string
  113. :param aws_access_key_id: Your AWS Access Key ID
  114. :type aws_secret_access_key: string
  115. :param aws_secret_access_key: Your AWS Secret Access Key
  116. :rtype: :class:`boto.ec2.connection.EC2Connection`
  117. :return: A connection to Amazon's EC2
  118. """
  119. from boto.ec2.connection import EC2Connection
  120. return EC2Connection(aws_access_key_id, aws_secret_access_key, **kwargs)
  121. def connect_elb(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  122. """
  123. :type aws_access_key_id: string
  124. :param aws_access_key_id: Your AWS Access Key ID
  125. :type aws_secret_access_key: string
  126. :param aws_secret_access_key: Your AWS Secret Access Key
  127. :rtype: :class:`boto.ec2.elb.ELBConnection`
  128. :return: A connection to Amazon's Load Balancing Service
  129. """
  130. from boto.ec2.elb import ELBConnection
  131. return ELBConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  132. def connect_autoscale(aws_access_key_id=None, aws_secret_access_key=None,
  133. **kwargs):
  134. """
  135. :type aws_access_key_id: string
  136. :param aws_access_key_id: Your AWS Access Key ID
  137. :type aws_secret_access_key: string
  138. :param aws_secret_access_key: Your AWS Secret Access Key
  139. :rtype: :class:`boto.ec2.autoscale.AutoScaleConnection`
  140. :return: A connection to Amazon's Auto Scaling Service
  141. """
  142. from boto.ec2.autoscale import AutoScaleConnection
  143. return AutoScaleConnection(aws_access_key_id, aws_secret_access_key,
  144. **kwargs)
  145. def connect_cloudwatch(aws_access_key_id=None, aws_secret_access_key=None,
  146. **kwargs):
  147. """
  148. :type aws_access_key_id: string
  149. :param aws_access_key_id: Your AWS Access Key ID
  150. :type aws_secret_access_key: string
  151. :param aws_secret_access_key: Your AWS Secret Access Key
  152. :rtype: :class:`boto.ec2.cloudwatch.CloudWatchConnection`
  153. :return: A connection to Amazon's EC2 Monitoring service
  154. """
  155. from boto.ec2.cloudwatch import CloudWatchConnection
  156. return CloudWatchConnection(aws_access_key_id, aws_secret_access_key,
  157. **kwargs)
  158. def connect_sdb(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  159. """
  160. :type aws_access_key_id: string
  161. :param aws_access_key_id: Your AWS Access Key ID
  162. :type aws_secret_access_key: string
  163. :param aws_secret_access_key: Your AWS Secret Access Key
  164. :rtype: :class:`boto.sdb.connection.SDBConnection`
  165. :return: A connection to Amazon's SDB
  166. """
  167. from boto.sdb.connection import SDBConnection
  168. return SDBConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  169. def connect_fps(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  170. """
  171. :type aws_access_key_id: string
  172. :param aws_access_key_id: Your AWS Access Key ID
  173. :type aws_secret_access_key: string
  174. :param aws_secret_access_key: Your AWS Secret Access Key
  175. :rtype: :class:`boto.fps.connection.FPSConnection`
  176. :return: A connection to FPS
  177. """
  178. from boto.fps.connection import FPSConnection
  179. return FPSConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  180. def connect_mturk(aws_access_key_id=None, aws_secret_access_key=None,
  181. **kwargs):
  182. """
  183. :type aws_access_key_id: string
  184. :param aws_access_key_id: Your AWS Access Key ID
  185. :type aws_secret_access_key: string
  186. :param aws_secret_access_key: Your AWS Secret Access Key
  187. :rtype: :class:`boto.mturk.connection.MTurkConnection`
  188. :return: A connection to MTurk
  189. """
  190. from boto.mturk.connection import MTurkConnection
  191. return MTurkConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  192. def connect_cloudfront(aws_access_key_id=None, aws_secret_access_key=None,
  193. **kwargs):
  194. """
  195. :type aws_access_key_id: string
  196. :param aws_access_key_id: Your AWS Access Key ID
  197. :type aws_secret_access_key: string
  198. :param aws_secret_access_key: Your AWS Secret Access Key
  199. :rtype: :class:`boto.fps.connection.FPSConnection`
  200. :return: A connection to FPS
  201. """
  202. from boto.cloudfront import CloudFrontConnection
  203. return CloudFrontConnection(aws_access_key_id, aws_secret_access_key,
  204. **kwargs)
  205. def connect_vpc(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  206. """
  207. :type aws_access_key_id: string
  208. :param aws_access_key_id: Your AWS Access Key ID
  209. :type aws_secret_access_key: string
  210. :param aws_secret_access_key: Your AWS Secret Access Key
  211. :rtype: :class:`boto.vpc.VPCConnection`
  212. :return: A connection to VPC
  213. """
  214. from boto.vpc import VPCConnection
  215. return VPCConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  216. def connect_rds(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  217. """
  218. :type aws_access_key_id: string
  219. :param aws_access_key_id: Your AWS Access Key ID
  220. :type aws_secret_access_key: string
  221. :param aws_secret_access_key: Your AWS Secret Access Key
  222. :rtype: :class:`boto.rds.RDSConnection`
  223. :return: A connection to RDS
  224. """
  225. from boto.rds import RDSConnection
  226. return RDSConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  227. def connect_emr(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  228. """
  229. :type aws_access_key_id: string
  230. :param aws_access_key_id: Your AWS Access Key ID
  231. :type aws_secret_access_key: string
  232. :param aws_secret_access_key: Your AWS Secret Access Key
  233. :rtype: :class:`boto.emr.EmrConnection`
  234. :return: A connection to Elastic mapreduce
  235. """
  236. from boto.emr import EmrConnection
  237. return EmrConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  238. def connect_sns(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  239. """
  240. :type aws_access_key_id: string
  241. :param aws_access_key_id: Your AWS Access Key ID
  242. :type aws_secret_access_key: string
  243. :param aws_secret_access_key: Your AWS Secret Access Key
  244. :rtype: :class:`boto.sns.SNSConnection`
  245. :return: A connection to Amazon's SNS
  246. """
  247. from boto.sns import SNSConnection
  248. return SNSConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  249. def connect_iam(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  250. """
  251. :type aws_access_key_id: string
  252. :param aws_access_key_id: Your AWS Access Key ID
  253. :type aws_secret_access_key: string
  254. :param aws_secret_access_key: Your AWS Secret Access Key
  255. :rtype: :class:`boto.iam.IAMConnection`
  256. :return: A connection to Amazon's IAM
  257. """
  258. from boto.iam import IAMConnection
  259. return IAMConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  260. def connect_route53(aws_access_key_id=None, aws_secret_access_key=None,
  261. **kwargs):
  262. """
  263. :type aws_access_key_id: string
  264. :param aws_access_key_id: Your AWS Access Key ID
  265. :type aws_secret_access_key: string
  266. :param aws_secret_access_key: Your AWS Secret Access Key
  267. :rtype: :class:`boto.dns.Route53Connection`
  268. :return: A connection to Amazon's Route53 DNS Service
  269. """
  270. from boto.route53 import Route53Connection
  271. return Route53Connection(aws_access_key_id, aws_secret_access_key,
  272. **kwargs)
  273. def connect_cloudformation(aws_access_key_id=None, aws_secret_access_key=None,
  274. **kwargs):
  275. """
  276. :type aws_access_key_id: string
  277. :param aws_access_key_id: Your AWS Access Key ID
  278. :type aws_secret_access_key: string
  279. :param aws_secret_access_key: Your AWS Secret Access Key
  280. :rtype: :class:`boto.cloudformation.CloudFormationConnection`
  281. :return: A connection to Amazon's CloudFormation Service
  282. """
  283. from boto.cloudformation import CloudFormationConnection
  284. return CloudFormationConnection(aws_access_key_id, aws_secret_access_key,
  285. **kwargs)
  286. def connect_euca(host=None, aws_access_key_id=None, aws_secret_access_key=None,
  287. port=8773, path='/services/Eucalyptus', is_secure=False,
  288. **kwargs):
  289. """
  290. Connect to a Eucalyptus service.
  291. :type host: string
  292. :param host: the host name or ip address of the Eucalyptus server
  293. :type aws_access_key_id: string
  294. :param aws_access_key_id: Your AWS Access Key ID
  295. :type aws_secret_access_key: string
  296. :param aws_secret_access_key: Your AWS Secret Access Key
  297. :rtype: :class:`boto.ec2.connection.EC2Connection`
  298. :return: A connection to Eucalyptus server
  299. """
  300. from boto.ec2 import EC2Connection
  301. from boto.ec2.regioninfo import RegionInfo
  302. # Check for values in boto config, if not supplied as args
  303. if not aws_access_key_id:
  304. aws_access_key_id = config.get('Credentials',
  305. 'euca_access_key_id',
  306. None)
  307. if not aws_secret_access_key:
  308. aws_secret_access_key = config.get('Credentials',
  309. 'euca_secret_access_key',
  310. None)
  311. if not host:
  312. host = config.get('Boto', 'eucalyptus_host', None)
  313. reg = RegionInfo(name='eucalyptus', endpoint=host)
  314. return EC2Connection(aws_access_key_id, aws_secret_access_key,
  315. region=reg, port=port, path=path,
  316. is_secure=is_secure, **kwargs)
  317. def connect_ec2_endpoint(url, aws_access_key_id=None,
  318. aws_secret_access_key=None,
  319. **kwargs):
  320. """
  321. Connect to an EC2 Api endpoint. Additional arguments are passed
  322. through to connect_ec2.
  323. :type url: string
  324. :param url: A url for the ec2 api endpoint to connect to
  325. :type aws_access_key_id: string
  326. :param aws_access_key_id: Your AWS Access Key ID
  327. :type aws_secret_access_key: string
  328. :param aws_secret_access_key: Your AWS Secret Access Key
  329. :rtype: :class:`boto.ec2.connection.EC2Connection`
  330. :return: A connection to Eucalyptus server
  331. """
  332. from boto.ec2.regioninfo import RegionInfo
  333. purl = urlparse.urlparse(url)
  334. kwargs['port'] = purl.port
  335. kwargs['host'] = purl.hostname
  336. kwargs['path'] = purl.path
  337. if not 'is_secure' in kwargs:
  338. kwargs['is_secure'] = (purl.scheme == "https")
  339. kwargs['region'] = RegionInfo(name=purl.hostname,
  340. endpoint=purl.hostname)
  341. kwargs['aws_access_key_id'] = aws_access_key_id
  342. kwargs['aws_secret_access_key'] = aws_secret_access_key
  343. return(connect_ec2(**kwargs))
  344. def connect_walrus(host=None, aws_access_key_id=None,
  345. aws_secret_access_key=None,
  346. port=8773, path='/services/Walrus', is_secure=False,
  347. **kwargs):
  348. """
  349. Connect to a Walrus service.
  350. :type host: string
  351. :param host: the host name or ip address of the Walrus server
  352. :type aws_access_key_id: string
  353. :param aws_access_key_id: Your AWS Access Key ID
  354. :type aws_secret_access_key: string
  355. :param aws_secret_access_key: Your AWS Secret Access Key
  356. :rtype: :class:`boto.s3.connection.S3Connection`
  357. :return: A connection to Walrus
  358. """
  359. from boto.s3.connection import S3Connection
  360. from boto.s3.connection import OrdinaryCallingFormat
  361. # Check for values in boto config, if not supplied as args
  362. if not aws_access_key_id:
  363. aws_access_key_id = config.get('Credentials',
  364. 'euca_access_key_id',
  365. None)
  366. if not aws_secret_access_key:
  367. aws_secret_access_key = config.get('Credentials',
  368. 'euca_secret_access_key',
  369. None)
  370. if not host:
  371. host = config.get('Boto', 'walrus_host', None)
  372. return S3Connection(aws_access_key_id, aws_secret_access_key,
  373. host=host, port=port, path=path,
  374. calling_format=OrdinaryCallingFormat(),
  375. is_secure=is_secure, **kwargs)
  376. def connect_ses(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  377. """
  378. :type aws_access_key_id: string
  379. :param aws_access_key_id: Your AWS Access Key ID
  380. :type aws_secret_access_key: string
  381. :param aws_secret_access_key: Your AWS Secret Access Key
  382. :rtype: :class:`boto.ses.SESConnection`
  383. :return: A connection to Amazon's SES
  384. """
  385. from boto.ses import SESConnection
  386. return SESConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  387. def connect_sts(aws_access_key_id=None, aws_secret_access_key=None, **kwargs):
  388. """
  389. :type aws_access_key_id: string
  390. :param aws_access_key_id: Your AWS Access Key ID
  391. :type aws_secret_access_key: string
  392. :param aws_secret_access_key: Your AWS Secret Access Key
  393. :rtype: :class:`boto.sts.STSConnection`
  394. :return: A connection to Amazon's STS
  395. """
  396. from boto.sts import STSConnection
  397. return STSConnection(aws_access_key_id, aws_secret_access_key, **kwargs)
  398. def connect_ia(ia_access_key_id=None, ia_secret_access_key=None,
  399. is_secure=False, **kwargs):
  400. """
  401. Connect to the Internet Archive via their S3-like API.
  402. :type ia_access_key_id: string
  403. :param ia_access_key_id: Your IA Access Key ID. This will also look
  404. in your boto config file for an entry in the Credentials
  405. section called "ia_access_key_id"
  406. :type ia_secret_access_key: string
  407. :param ia_secret_access_key: Your IA Secret Access Key. This will also
  408. look in your boto config file for an entry in the Credentials
  409. section called "ia_secret_access_key"
  410. :rtype: :class:`boto.s3.connection.S3Connection`
  411. :return: A connection to the Internet Archive
  412. """
  413. from boto.s3.connection import S3Connection
  414. from boto.s3.connection import OrdinaryCallingFormat
  415. access_key = config.get('Credentials', 'ia_access_key_id',
  416. ia_access_key_id)
  417. secret_key = config.get('Credentials', 'ia_secret_access_key',
  418. ia_secret_access_key)
  419. return S3Connection(access_key, secret_key,
  420. host='s3.us.archive.org',
  421. calling_format=OrdinaryCallingFormat(),
  422. is_secure=is_secure, **kwargs)
  423. def connect_dynamodb(aws_access_key_id=None,
  424. aws_secret_access_key=None,
  425. **kwargs):
  426. """
  427. :type aws_access_key_id: string
  428. :param aws_access_key_id: Your AWS Access Key ID
  429. :type aws_secret_access_key: string
  430. :param aws_secret_access_key: Your AWS Secret Access Key
  431. :rtype: :class:`boto.dynamodb.layer2.Layer2`
  432. :return: A connection to the Layer2 interface for DynamoDB.
  433. """
  434. from boto.dynamodb.layer2 import Layer2
  435. return Layer2(aws_access_key_id, aws_secret_access_key, **kwargs)
  436. def connect_swf(aws_access_key_id=None,
  437. aws_secret_access_key=None,
  438. **kwargs):
  439. """
  440. :type aws_access_key_id: string
  441. :param aws_access_key_id: Your AWS Access Key ID
  442. :type aws_secret_access_key: string
  443. :param aws_secret_access_key: Your AWS Secret Access Key
  444. :rtype: :class:`boto.swf.layer1.Layer1`
  445. :return: A connection to the Layer1 interface for SWF.
  446. """
  447. from boto.swf.layer1 import Layer1
  448. return Layer1(aws_access_key_id, aws_secret_access_key, **kwargs)
  449. def connect_cloudsearch(aws_access_key_id=None,
  450. aws_secret_access_key=None,
  451. **kwargs):
  452. """
  453. :type aws_access_key_id: string
  454. :param aws_access_key_id: Your AWS Access Key ID
  455. :type aws_secret_access_key: string
  456. :param aws_secret_access_key: Your AWS Secret Access Key
  457. :rtype: :class:`boto.ec2.autoscale.CloudSearchConnection`
  458. :return: A connection to Amazon's CloudSearch service
  459. """
  460. from boto.cloudsearch.layer2 import Layer2
  461. return Layer2(aws_access_key_id, aws_secret_access_key,
  462. **kwargs)
  463. def storage_uri(uri_str, default_scheme='file', debug=0, validate=True,
  464. bucket_storage_uri_class=BucketStorageUri,
  465. suppress_consec_slashes=True):
  466. """
  467. Instantiate a StorageUri from a URI string.
  468. :type uri_str: string
  469. :param uri_str: URI naming bucket + optional object.
  470. :type default_scheme: string
  471. :param default_scheme: default scheme for scheme-less URIs.
  472. :type debug: int
  473. :param debug: debug level to pass in to boto connection (range 0..2).
  474. :type validate: bool
  475. :param validate: whether to check for bucket name validity.
  476. :type bucket_storage_uri_class: BucketStorageUri interface.
  477. :param bucket_storage_uri_class: Allows mocking for unit tests.
  478. :param suppress_consec_slashes: If provided, controls whether
  479. consecutive slashes will be suppressed in key paths.
  480. We allow validate to be disabled to allow caller
  481. to implement bucket-level wildcarding (outside the boto library;
  482. see gsutil).
  483. :rtype: :class:`boto.StorageUri` subclass
  484. :return: StorageUri subclass for given URI.
  485. ``uri_str`` must be one of the following formats:
  486. * gs://bucket/name
  487. * s3://bucket/name
  488. * gs://bucket
  489. * s3://bucket
  490. * filename
  491. The last example uses the default scheme ('file', unless overridden)
  492. """
  493. # Manually parse URI components instead of using urlparse.urlparse because
  494. # what we're calling URIs don't really fit the standard syntax for URIs
  495. # (the latter includes an optional host/net location part).
  496. end_scheme_idx = uri_str.find('://')
  497. if end_scheme_idx == -1:
  498. # Check for common error: user specifies gs:bucket instead
  499. # of gs://bucket. Some URI parsers allow this, but it can cause
  500. # confusion for callers, so we don't.
  501. if uri_str.find(':') != -1:
  502. raise InvalidUriError('"%s" contains ":" instead of "://"' % uri_str)
  503. scheme = default_scheme.lower()
  504. path = uri_str
  505. else:
  506. scheme = uri_str[0:end_scheme_idx].lower()
  507. path = uri_str[end_scheme_idx + 3:]
  508. if scheme not in ['file', 's3', 'gs']:
  509. raise InvalidUriError('Unrecognized scheme "%s"' % scheme)
  510. if scheme == 'file':
  511. # For file URIs we have no bucket name, and use the complete path
  512. # (minus 'file://') as the object name.
  513. is_stream = False
  514. if path == '-':
  515. is_stream = True
  516. return FileStorageUri(path, debug, is_stream)
  517. else:
  518. path_parts = path.split('/', 1)
  519. bucket_name = path_parts[0]
  520. if (validate and bucket_name and
  521. # Disallow buckets violating charset or not [3..255] chars total.
  522. (not re.match('^[a-z0-9][a-z0-9\._-]{1,253}[a-z0-9]$', bucket_name)
  523. # Disallow buckets with individual DNS labels longer than 63.
  524. or re.search('[-_a-z0-9]{64}', bucket_name))):
  525. raise InvalidUriError('Invalid bucket name in URI "%s"' % uri_str)
  526. # If enabled, ensure the bucket name is valid, to avoid possibly
  527. # confusing other parts of the code. (For example if we didn't
  528. # catch bucket names containing ':', when a user tried to connect to
  529. # the server with that name they might get a confusing error about
  530. # non-integer port numbers.)
  531. object_name = ''
  532. if len(path_parts) > 1:
  533. object_name = path_parts[1]
  534. return bucket_storage_uri_class(
  535. scheme, bucket_name, object_name, debug,
  536. suppress_consec_slashes=suppress_consec_slashes)
  537. def storage_uri_for_key(key):
  538. """Returns a StorageUri for the given key.
  539. :type key: :class:`boto.s3.key.Key` or subclass
  540. :param key: URI naming bucket + optional object.
  541. """
  542. if not isinstance(key, boto.s3.key.Key):
  543. raise InvalidUriError('Requested key (%s) is not a subclass of '
  544. 'boto.s3.key.Key' % str(type(key)))
  545. prov_name = key.bucket.connection.provider.get_provider_name()
  546. uri_str = '%s://%s/%s' % (prov_name, key.bucket.name, key.name)
  547. return storage_uri(uri_str)
  548. boto.plugin.load_plugins(config)