| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/python | |
| 2 # Copyright 2013 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 | |
| 16 import random | |
| 17 import string | |
| 18 import subprocess | |
| 19 import tempfile | |
| 20 import time | |
| 21 import unittest | |
| 22 | |
| 23 class BucketRelocateTests(unittest.TestCase): | |
| 24 | |
| 25 def setUp(self): | |
| 26 self.buckets = [] | |
| 27 print '\n\n\n' | |
| 28 print 'creating test buckets' | |
| 29 self.buckets.append('gs://relocate_test_%s' % ( | |
| 30 ''.join(random.choice(string.ascii_lowercase) for x in range(10)))) | |
| 31 self.buckets.append('gs://relocate_test_%s' % ( | |
| 32 ''.join(random.choice(string.ascii_lowercase) for x in range(10)))) | |
| 33 self._GSUtil('mb %s' % self.buckets[0]) | |
| 34 self._GSUtil('mb %s' % self.buckets[1]) | |
| 35 self._GSUtil('-m cp -R gs://relotestdata/* %s' % self.buckets[0]) | |
| 36 | |
| 37 def tearDown(self): | |
| 38 print 'deleting test buckets' | |
| 39 for bucket in self.buckets: | |
| 40 if self._GSUtil('ls -a %s' % bucket, raiseError=False): | |
| 41 self._GSUtil('-m rm -Ra %s/*' % bucket) | |
| 42 self._GSUtil('rb %s' % bucket) | |
| 43 | |
| 44 def _GSUtil(self, paramstr, raiseError=True): | |
| 45 cmd = 'gsutil %s' % paramstr | |
| 46 print cmd | |
| 47 p = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, | |
| 48 stdout=subprocess.PIPE, | |
| 49 stderr=subprocess.STDOUT, | |
| 50 close_fds=True) | |
| 51 code = p.wait() | |
| 52 output = p.stdout.read() | |
| 53 if code: | |
| 54 if raiseError: | |
| 55 raise Exception('gsutil return code=%d stdout=%s' % (code, output)) | |
| 56 else: | |
| 57 return None | |
| 58 return output | |
| 59 | |
| 60 def _Relocate(self, stage=None, storage_class=None, location=None, | |
| 61 buckets=None): | |
| 62 params = ['./bucket_relocate.sh'] | |
| 63 if stage: | |
| 64 params.append(stage) | |
| 65 if storage_class: | |
| 66 params.append(storage_class) | |
| 67 if location: | |
| 68 params.append(location) | |
| 69 if buckets: | |
| 70 params.extend(buckets) | |
| 71 code = subprocess.call(params) | |
| 72 if code: | |
| 73 raise Exception('Return code=%d' % code) | |
| 74 | |
| 75 def _DeleteBucketWithRetry(self, bucket): | |
| 76 self._GSUtil('-m rm -Ra %s/*' % bucket) | |
| 77 count = 0 | |
| 78 while count < 5: | |
| 79 count += 1 | |
| 80 try: | |
| 81 self._GSUtil('rb %s' % bucket) | |
| 82 return | |
| 83 except Exception as ex: | |
| 84 if count == 5 or not 'BucketNotEmpty' in ex.message: | |
| 85 raise | |
| 86 time.sleep(5) | |
| 87 | |
| 88 def test_SimpleAll(self): | |
| 89 bucket = self.buckets[0] | |
| 90 self._Relocate(stage='-A', buckets=[bucket]) | |
| 91 | |
| 92 def test_SimpleStage1(self): | |
| 93 bucket = self.buckets[0] | |
| 94 self._Relocate(stage='-1', buckets=[bucket]) | |
| 95 self._DeleteBucketWithRetry('%s-relocate' % bucket) | |
| 96 | |
| 97 def test_SimpleStage2(self): | |
| 98 bucket = self.buckets[0] | |
| 99 self._Relocate(stage='-1', buckets=[bucket]) | |
| 100 self._Relocate(stage='-2', buckets=[bucket]) | |
| 101 | |
| 102 def test_RelocateToDRA(self): | |
| 103 bucket = self.buckets[0] | |
| 104 self._Relocate(stage='-A', storage_class='-c DRA', buckets=[bucket]) | |
| 105 | |
| 106 def test_RelocateToEU(self): | |
| 107 bucket = self.buckets[0] | |
| 108 self._Relocate(stage='-A', location='-l EU', buckets=[bucket]) | |
| 109 | |
| 110 def test_RelocateClassAndLocation(self): | |
| 111 bucket = self.buckets[0] | |
| 112 self._Relocate(stage='-A', location='-l EU', storage_class='-c DRA', | |
| 113 buckets=[bucket]) | |
| 114 | |
| 115 def test_ConfigDefacl(self): | |
| 116 bucket = self.buckets[0] | |
| 117 self._GSUtil('defacl set public-read %s' % bucket) | |
| 118 cfg_before = self._GSUtil('defacl get %s' % bucket) | |
| 119 self._Relocate(stage='-A', buckets=[bucket]) | |
| 120 cfg_after = self._GSUtil('defacl get %s' % bucket) | |
| 121 self.assertEqual(cfg_before, cfg_after) | |
| 122 | |
| 123 def test_ConfigWebcfg(self): | |
| 124 bucket = self.buckets[0] | |
| 125 self._GSUtil('web set -m main.html -e error.html %s' % bucket) | |
| 126 cfg_before = self._GSUtil('web get %s' % bucket) | |
| 127 self._Relocate(stage='-A', buckets=[bucket]) | |
| 128 cfg_after = self._GSUtil('web get %s' % bucket) | |
| 129 self.assertEqual(cfg_before, cfg_after) | |
| 130 | |
| 131 def test_ConfigLogging(self): | |
| 132 bucket = self.buckets[0] | |
| 133 log_bucket = self.buckets[1] | |
| 134 self._GSUtil('logging set on -b %s -o tstlog %s' % (log_bucket, bucket)) | |
| 135 cfg_before = self._GSUtil('logging get %s' % bucket) | |
| 136 self._Relocate(stage='-A', buckets=[bucket]) | |
| 137 cfg_after = self._GSUtil('logging get %s' % bucket) | |
| 138 self.assertEqual(cfg_before, cfg_after) | |
| 139 | |
| 140 def test_ConfigCors(self): | |
| 141 bucket = self.buckets[0] | |
| 142 cors="""<?xml version="1.0" ?> | |
| 143 <CorsConfig><Cors><Origins><Origin>http://origin1.example.com</Origin> | |
| 144 </Origins><Methods><Method>GET</Method></Methods><ResponseHeaders> | |
| 145 <ResponseHeader>Content-Type</ResponseHeader></ResponseHeaders> | |
| 146 </Cors></CorsConfig>""" | |
| 147 f = tempfile.NamedTemporaryFile() | |
| 148 f.write(cors) | |
| 149 f.flush() | |
| 150 self._GSUtil('cors set %s %s' % (f.name, bucket)) | |
| 151 cfg_before = self._GSUtil('cors get %s' % bucket) | |
| 152 self._Relocate(stage='-A', buckets=[bucket]) | |
| 153 cfg_after = self._GSUtil('cors get %s' % bucket) | |
| 154 self.assertEqual(cfg_before, cfg_after) | |
| 155 f.close() | |
| 156 | |
| 157 def test_ConfigVersioning(self): | |
| 158 bucket = self.buckets[0] | |
| 159 self._GSUtil('versioning set on %s' % bucket) | |
| 160 cfg_before = self._GSUtil('versioning get %s' % bucket) | |
| 161 self._Relocate(stage='-A', buckets=[bucket]) | |
| 162 cfg_after = self._GSUtil('versioning get %s' % bucket) | |
| 163 self.assertEqual(cfg_before, cfg_after) | |
| 164 | |
| 165 def test_VersionedObjects(self): | |
| 166 bucket = self.buckets[0] | |
| 167 obj1 = '/tjp.dat' | |
| 168 obj2 = '/yjux.dat' | |
| 169 # enable versioning | |
| 170 self._GSUtil('versioning set on %s' % bucket) | |
| 171 # force another version | |
| 172 self._GSUtil('cp %s%s %s%s' % (bucket, obj1, bucket, obj2)) | |
| 173 versions_before = self._GSUtil('ls -a %s%s' % (bucket, obj2)) | |
| 174 self._Relocate(stage='-A', buckets=[bucket]) | |
| 175 versions_after = self._GSUtil('ls -a %s%s' % (bucket, obj2)) | |
| 176 version_count = len(versions_before.splitlines()) | |
| 177 self.assertEqual(version_count, 2) | |
| 178 self.assertEqual(version_count, len(versions_after.splitlines())) | |
| 179 | |
| 180 | |
| 181 if __name__ == "__main__": | |
| 182 unittest.main() | |
| OLD | NEW |