Statistics
| Branch: | Tag: | Revision:

root / snf-tools / synnefo_tools / burnin / pithos_tests.py @ 6a6aba0b

History | View | Annotate | Download (10.5 kB)

1 79a5c431 Ilias Tsitsimpis
# Copyright 2013 GRNET S.A. All rights reserved.
2 79a5c431 Ilias Tsitsimpis
#
3 79a5c431 Ilias Tsitsimpis
# Redistribution and use in source and binary forms, with or
4 79a5c431 Ilias Tsitsimpis
# without modification, are permitted provided that the following
5 79a5c431 Ilias Tsitsimpis
# conditions are met:
6 79a5c431 Ilias Tsitsimpis
#
7 79a5c431 Ilias Tsitsimpis
#   1. Redistributions of source code must retain the above
8 79a5c431 Ilias Tsitsimpis
#      copyright notice, this list of conditions and the following
9 79a5c431 Ilias Tsitsimpis
#      disclaimer.
10 79a5c431 Ilias Tsitsimpis
#
11 79a5c431 Ilias Tsitsimpis
#   2. Redistributions in binary form must reproduce the above
12 79a5c431 Ilias Tsitsimpis
#      copyright notice, this list of conditions and the following
13 79a5c431 Ilias Tsitsimpis
#      disclaimer in the documentation and/or other materials
14 79a5c431 Ilias Tsitsimpis
#      provided with the distribution.
15 79a5c431 Ilias Tsitsimpis
#
16 79a5c431 Ilias Tsitsimpis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 79a5c431 Ilias Tsitsimpis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 79a5c431 Ilias Tsitsimpis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 79a5c431 Ilias Tsitsimpis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 79a5c431 Ilias Tsitsimpis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 79a5c431 Ilias Tsitsimpis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 79a5c431 Ilias Tsitsimpis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 79a5c431 Ilias Tsitsimpis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 79a5c431 Ilias Tsitsimpis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 79a5c431 Ilias Tsitsimpis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 79a5c431 Ilias Tsitsimpis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 79a5c431 Ilias Tsitsimpis
# POSSIBILITY OF SUCH DAMAGE.
28 79a5c431 Ilias Tsitsimpis
#
29 79a5c431 Ilias Tsitsimpis
# The views and conclusions contained in the software and
30 79a5c431 Ilias Tsitsimpis
# documentation are those of the authors and should not be
31 79a5c431 Ilias Tsitsimpis
# interpreted as representing official policies, either expressed
32 79a5c431 Ilias Tsitsimpis
# or implied, of GRNET S.A.
33 79a5c431 Ilias Tsitsimpis
34 79a5c431 Ilias Tsitsimpis
"""
35 79a5c431 Ilias Tsitsimpis
This is the burnin class that tests the Pithos functionality
36 79a5c431 Ilias Tsitsimpis

37 79a5c431 Ilias Tsitsimpis
"""
38 79a5c431 Ilias Tsitsimpis
39 3e5bbd85 Ilias Tsitsimpis
import os
40 79a5c431 Ilias Tsitsimpis
import random
41 79a5c431 Ilias Tsitsimpis
import tempfile
42 5d9987a5 Stavros Sachtouris
from datetime import datetime
43 79a5c431 Ilias Tsitsimpis
44 d11c80c0 Ilias Tsitsimpis
from synnefo_tools.burnin.common import BurninTests, Proper
45 6a6aba0b Stavros Sachtouris
from kamaki.clients import ClientError
46 79a5c431 Ilias Tsitsimpis
47 79a5c431 Ilias Tsitsimpis
48 79a5c431 Ilias Tsitsimpis
# Too many public methods. pylint: disable-msg=R0904
49 d11c80c0 Ilias Tsitsimpis
class PithosTestSuite(BurninTests):
50 79a5c431 Ilias Tsitsimpis
    """Test Pithos functionality"""
51 d11c80c0 Ilias Tsitsimpis
    containers = Proper(value=None)
52 d11c80c0 Ilias Tsitsimpis
    created_container = Proper(value=None)
53 5d9987a5 Stavros Sachtouris
    now_unformated = Proper(value=datetime.utcnow())
54 79a5c431 Ilias Tsitsimpis
55 5d9987a5 Stavros Sachtouris
    def test_005_account_head(self):
56 5d9987a5 Stavros Sachtouris
        """HEAD on pithos account"""
57 79a5c431 Ilias Tsitsimpis
        self._set_pithos_account(self._get_uuid())
58 5d9987a5 Stavros Sachtouris
        pithos = self.clients.pithos
59 5d9987a5 Stavros Sachtouris
        r = pithos.account_head()
60 5d9987a5 Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
61 5d9987a5 Stavros Sachtouris
        self.info('Returns 204')
62 5d9987a5 Stavros Sachtouris
63 5d9987a5 Stavros Sachtouris
        r = pithos.account_head(until='1000000000')
64 5d9987a5 Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
65 5d9987a5 Stavros Sachtouris
        datestring = unicode(r.headers['x-account-until-timestamp'])
66 5d9987a5 Stavros Sachtouris
        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
67 5d9987a5 Stavros Sachtouris
        self.assertTrue('x-account-policy-quota' in r.headers)
68 5d9987a5 Stavros Sachtouris
        self.info('Until and policy quota exist')
69 5d9987a5 Stavros Sachtouris
70 5d9987a5 Stavros Sachtouris
        for format in pithos.DATE_FORMATS:
71 5d9987a5 Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
72 5d9987a5 Stavros Sachtouris
            r1 = pithos.account_head(
73 5d9987a5 Stavros Sachtouris
                if_modified_since=now_formated, success=(204, 304, 412))
74 5d9987a5 Stavros Sachtouris
            r2 = pithos.account_head(
75 5d9987a5 Stavros Sachtouris
                if_unmodified_since=now_formated, success=(204, 304, 412))
76 5d9987a5 Stavros Sachtouris
            self.assertNotEqual(r1.status_code, r2.status_code)
77 5d9987a5 Stavros Sachtouris
        self.info('If_(un)modified_since is OK')
78 5d9987a5 Stavros Sachtouris
79 5d9987a5 Stavros Sachtouris
    def test_010_account_get(self):
80 5d9987a5 Stavros Sachtouris
        """Test account_get"""
81 5d9987a5 Stavros Sachtouris
        self.info('Preparation')
82 5d9987a5 Stavros Sachtouris
        pithos = self.clients.pithos
83 5d9987a5 Stavros Sachtouris
        for i in range(1, 3):
84 5d9987a5 Stavros Sachtouris
            cont_name = "cont%s_%s%s" % (
85 5d9987a5 Stavros Sachtouris
                i, self.run_id, random.randint(1000, 9999))
86 5d9987a5 Stavros Sachtouris
            self._create_pithos_container(cont_name)
87 5d9987a5 Stavros Sachtouris
        pithos.container, obj = cont_name, 'shared_file'
88 5d9987a5 Stavros Sachtouris
        pithos.create_object(obj)
89 5d9987a5 Stavros Sachtouris
        pithos.set_object_sharing(obj, read_permission='*')
90 5d9987a5 Stavros Sachtouris
        self.info('Created object /%s/%s' % (cont_name, obj))
91 5d9987a5 Stavros Sachtouris
92 5d9987a5 Stavros Sachtouris
        r = pithos.list_containers()
93 5d9987a5 Stavros Sachtouris
        fullLen = len(r)
94 5d9987a5 Stavros Sachtouris
        self.assertTrue(fullLen > 2)
95 5d9987a5 Stavros Sachtouris
        self.info('Normal use is OK')
96 5d9987a5 Stavros Sachtouris
97 5d9987a5 Stavros Sachtouris
        r = pithos.account_get(limit=1)
98 5d9987a5 Stavros Sachtouris
        self.assertEqual(len(r.json), 1)
99 5d9987a5 Stavros Sachtouris
        self.info('Limit works')
100 5d9987a5 Stavros Sachtouris
101 5d9987a5 Stavros Sachtouris
        r = pithos.account_get(marker='cont')
102 5d9987a5 Stavros Sachtouris
        cont1, cont3 = r.json[0], r.json[2]
103 5d9987a5 Stavros Sachtouris
        self.info('Marker works')
104 5d9987a5 Stavros Sachtouris
105 5d9987a5 Stavros Sachtouris
        r = pithos.account_get(limit=2, marker='cont')
106 5d9987a5 Stavros Sachtouris
        conames = [container['name'] for container in r.json if (
107 5d9987a5 Stavros Sachtouris
            container['name'].lower().startswith('cont'))]
108 5d9987a5 Stavros Sachtouris
        self.assertTrue(cont1['name'] in conames)
109 5d9987a5 Stavros Sachtouris
        self.assertFalse(cont3['name'] in conames)
110 5d9987a5 Stavros Sachtouris
        self.info('Marker-limit combination works')
111 5d9987a5 Stavros Sachtouris
112 5d9987a5 Stavros Sachtouris
        r = pithos.account_get(show_only_shared=True)
113 5d9987a5 Stavros Sachtouris
        self.assertTrue(cont_name in [c['name'] for c in r.json])
114 5d9987a5 Stavros Sachtouris
        self.info('Show-only-shared works')
115 5d9987a5 Stavros Sachtouris
116 5d9987a5 Stavros Sachtouris
        r = pithos.account_get(until=1342609206.0)
117 5d9987a5 Stavros Sachtouris
        self.assertTrue(len(r.json) <= fullLen)
118 5d9987a5 Stavros Sachtouris
        self.info('Until works')
119 5d9987a5 Stavros Sachtouris
120 5d9987a5 Stavros Sachtouris
        for format in pithos.DATE_FORMATS:
121 5d9987a5 Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
122 5d9987a5 Stavros Sachtouris
            r1 = pithos.account_get(
123 5d9987a5 Stavros Sachtouris
                if_modified_since=now_formated, success=(200, 304, 412))
124 5d9987a5 Stavros Sachtouris
            r2 = pithos.account_get(
125 5d9987a5 Stavros Sachtouris
                if_unmodified_since=now_formated, success=(200, 304, 412))
126 5d9987a5 Stavros Sachtouris
            self.assertNotEqual(r1.status_code, r2.status_code)
127 5d9987a5 Stavros Sachtouris
        self.info('If_(un)modified_since is OK')
128 5d9987a5 Stavros Sachtouris
129 6a6aba0b Stavros Sachtouris
    def test_015_account_post(self):
130 6a6aba0b Stavros Sachtouris
        """Test account_post"""
131 6a6aba0b Stavros Sachtouris
        pithos = self.clients.pithos
132 6a6aba0b Stavros Sachtouris
        r = pithos.account_post()
133 6a6aba0b Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
134 6a6aba0b Stavros Sachtouris
        self.info('Status code is OK')
135 6a6aba0b Stavros Sachtouris
136 6a6aba0b Stavros Sachtouris
        rand_num = '%s%s' % (self.run_id or 0, random.randint(1000, 9999))
137 6a6aba0b Stavros Sachtouris
        grpName = 'grp%s' % rand_num
138 6a6aba0b Stavros Sachtouris
139 6a6aba0b Stavros Sachtouris
        u1, u2 = pithos.account, 'invalid-user-uuid-%s' % rand_num
140 6a6aba0b Stavros Sachtouris
        self.assertRaises(
141 6a6aba0b Stavros Sachtouris
            ClientError, pithos.set_account_group, grpName, [u1, u2])
142 6a6aba0b Stavros Sachtouris
        self.info('Invalid uuid is handled correctly')
143 6a6aba0b Stavros Sachtouris
144 6a6aba0b Stavros Sachtouris
        pithos.set_account_group(grpName, [u1])
145 6a6aba0b Stavros Sachtouris
        r = pithos.get_account_group()
146 6a6aba0b Stavros Sachtouris
        self.assertEqual(r['x-account-group-' + grpName], '%s' % u1)
147 6a6aba0b Stavros Sachtouris
        self.info('Account group is OK')
148 6a6aba0b Stavros Sachtouris
        pithos.del_account_group(grpName)
149 6a6aba0b Stavros Sachtouris
        r = pithos.get_account_group()
150 6a6aba0b Stavros Sachtouris
        self.assertTrue('x-account-group-' + grpName not in r)
151 6a6aba0b Stavros Sachtouris
        self.info('Removed account group')
152 6a6aba0b Stavros Sachtouris
153 6a6aba0b Stavros Sachtouris
        mprefix = 'meta%s' % rand_num
154 6a6aba0b Stavros Sachtouris
        pithos.set_account_meta({
155 6a6aba0b Stavros Sachtouris
            mprefix + '1': 'v1', mprefix + '2': 'v2'})
156 6a6aba0b Stavros Sachtouris
        r = pithos.get_account_meta()
157 6a6aba0b Stavros Sachtouris
        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
158 6a6aba0b Stavros Sachtouris
        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
159 6a6aba0b Stavros Sachtouris
        self.info('Account meta is OK')
160 6a6aba0b Stavros Sachtouris
161 6a6aba0b Stavros Sachtouris
        pithos.del_account_meta(mprefix + '1')
162 6a6aba0b Stavros Sachtouris
        r = pithos.get_account_meta()
163 6a6aba0b Stavros Sachtouris
        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
164 6a6aba0b Stavros Sachtouris
        self.assertTrue('x-account-meta-' + mprefix + '2' in r)
165 6a6aba0b Stavros Sachtouris
        self.info('Selective removal of account meta is OK')
166 6a6aba0b Stavros Sachtouris
167 6a6aba0b Stavros Sachtouris
        pithos.del_account_meta(mprefix + '2')
168 6a6aba0b Stavros Sachtouris
        r = pithos.get_account_meta()
169 6a6aba0b Stavros Sachtouris
        self.assertTrue('x-account-meta-' + mprefix + '2' not in r)
170 6a6aba0b Stavros Sachtouris
        self.info('Temporary account meta are removed')
171 6a6aba0b Stavros Sachtouris
172 6a6aba0b Stavros Sachtouris
    # def test_050_stop_test(self):
173 6a6aba0b Stavros Sachtouris
    #     """STOP TESTING ALREADY"""
174 6a6aba0b Stavros Sachtouris
    #     self.assertTrue(False)
175 6a6aba0b Stavros Sachtouris
176 5d9987a5 Stavros Sachtouris
    def test_051_list_containers(self):
177 5d9987a5 Stavros Sachtouris
        """Test container list actually returns containers"""
178 d11c80c0 Ilias Tsitsimpis
        self.containers = self._get_list_of_containers()
179 79a5c431 Ilias Tsitsimpis
        self.assertGreater(len(self.containers), 0)
180 5d9987a5 Stavros Sachtouris
        self.lala = 1
181 79a5c431 Ilias Tsitsimpis
182 5d9987a5 Stavros Sachtouris
    def test_052_unique_containers(self):
183 79a5c431 Ilias Tsitsimpis
        """Test if containers have unique names"""
184 79a5c431 Ilias Tsitsimpis
        names = [n['name'] for n in self.containers]
185 79a5c431 Ilias Tsitsimpis
        names = sorted(names)
186 79a5c431 Ilias Tsitsimpis
        self.assertEqual(sorted(list(set(names))), names)
187 79a5c431 Ilias Tsitsimpis
188 5d9987a5 Stavros Sachtouris
    def test_053_create_container(self):
189 79a5c431 Ilias Tsitsimpis
        """Test creating a new container"""
190 79a5c431 Ilias Tsitsimpis
        names = [n['name'] for n in self.containers]
191 79a5c431 Ilias Tsitsimpis
        while True:
192 79a5c431 Ilias Tsitsimpis
            rand_num = random.randint(1000, 9999)
193 79a5c431 Ilias Tsitsimpis
            rand_name = "%s%s" % (self.run_id, rand_num)
194 79a5c431 Ilias Tsitsimpis
            self.info("Trying container name %s", rand_name)
195 79a5c431 Ilias Tsitsimpis
            if rand_name not in names:
196 79a5c431 Ilias Tsitsimpis
                break
197 79a5c431 Ilias Tsitsimpis
            self.info("Container name %s already exists", rand_name)
198 79a5c431 Ilias Tsitsimpis
        # Create container
199 79a5c431 Ilias Tsitsimpis
        self._create_pithos_container(rand_name)
200 79a5c431 Ilias Tsitsimpis
        # Verify that container is created
201 79a5c431 Ilias Tsitsimpis
        containers = self._get_list_of_containers()
202 79a5c431 Ilias Tsitsimpis
        self.info("Verify that container %s is created", rand_name)
203 79a5c431 Ilias Tsitsimpis
        names = [n['name'] for n in containers]
204 79a5c431 Ilias Tsitsimpis
        self.assertIn(rand_name, names)
205 79a5c431 Ilias Tsitsimpis
        # Keep the name of the container so we can remove it
206 79a5c431 Ilias Tsitsimpis
        # at cleanup phase, if something goes wrong.
207 d11c80c0 Ilias Tsitsimpis
        self.created_container = rand_name
208 79a5c431 Ilias Tsitsimpis
209 5d9987a5 Stavros Sachtouris
    def test_054_upload_file(self):
210 79a5c431 Ilias Tsitsimpis
        """Test uploading a txt file to Pithos"""
211 79a5c431 Ilias Tsitsimpis
        # Create a tmp file
212 24d1788b Ilias Tsitsimpis
        with tempfile.TemporaryFile(dir=self.temp_directory) as fout:
213 79a5c431 Ilias Tsitsimpis
            fout.write("This is a temp file")
214 79a5c431 Ilias Tsitsimpis
            fout.seek(0, 0)
215 79a5c431 Ilias Tsitsimpis
            # Upload the file,
216 79a5c431 Ilias Tsitsimpis
            # The container is the one choosen during the `create_container'
217 79a5c431 Ilias Tsitsimpis
            self.clients.pithos.upload_object("test.txt", fout)
218 3e5bbd85 Ilias Tsitsimpis
            # Verify quotas
219 3e5bbd85 Ilias Tsitsimpis
            self._check_quotas(diskspace=+os.fstat(fout.fileno()).st_size)
220 79a5c431 Ilias Tsitsimpis
221 5d9987a5 Stavros Sachtouris
    def test_055_download_file(self):
222 79a5c431 Ilias Tsitsimpis
        """Test downloading the file from Pithos"""
223 79a5c431 Ilias Tsitsimpis
        # Create a tmp directory to save the file
224 24d1788b Ilias Tsitsimpis
        with tempfile.TemporaryFile(dir=self.temp_directory) as fout:
225 79a5c431 Ilias Tsitsimpis
            self.clients.pithos.download_object("test.txt", fout)
226 79a5c431 Ilias Tsitsimpis
            # Now read the file
227 79a5c431 Ilias Tsitsimpis
            fout.seek(0, 0)
228 79a5c431 Ilias Tsitsimpis
            contents = fout.read()
229 79a5c431 Ilias Tsitsimpis
            # Compare results
230 79a5c431 Ilias Tsitsimpis
            self.info("Comparing contents with the uploaded file")
231 79a5c431 Ilias Tsitsimpis
            self.assertEqual(contents, "This is a temp file")
232 79a5c431 Ilias Tsitsimpis
233 5d9987a5 Stavros Sachtouris
    def test_056_remove(self):
234 79a5c431 Ilias Tsitsimpis
        """Test removing files and containers from Pithos"""
235 79a5c431 Ilias Tsitsimpis
        self.info("Removing the file %s from container %s",
236 79a5c431 Ilias Tsitsimpis
                  "test.txt", self.created_container)
237 79a5c431 Ilias Tsitsimpis
        # The container is the one choosen during the `create_container'
238 3e5bbd85 Ilias Tsitsimpis
        content_length = \
239 3e5bbd85 Ilias Tsitsimpis
            self.clients.pithos.get_object_info("test.txt")['content-length']
240 79a5c431 Ilias Tsitsimpis
        self.clients.pithos.del_object("test.txt")
241 79a5c431 Ilias Tsitsimpis
242 3e5bbd85 Ilias Tsitsimpis
        # Verify quotas
243 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas(diskspace=-int(content_length))
244 3e5bbd85 Ilias Tsitsimpis
245 79a5c431 Ilias Tsitsimpis
        self.info("Removing the container %s", self.created_container)
246 79a5c431 Ilias Tsitsimpis
        self.clients.pithos.purge_container()
247 79a5c431 Ilias Tsitsimpis
248 79a5c431 Ilias Tsitsimpis
        # List containers
249 79a5c431 Ilias Tsitsimpis
        containers = self._get_list_of_containers()
250 79a5c431 Ilias Tsitsimpis
        self.info("Check that the container %s has been deleted",
251 79a5c431 Ilias Tsitsimpis
                  self.created_container)
252 79a5c431 Ilias Tsitsimpis
        names = [n['name'] for n in containers]
253 79a5c431 Ilias Tsitsimpis
        self.assertNotIn(self.created_container, names)
254 79a5c431 Ilias Tsitsimpis
        # We successfully deleted our container, no need to do it
255 79a5c431 Ilias Tsitsimpis
        # in our clean up phase
256 d11c80c0 Ilias Tsitsimpis
        self.created_container = None
257 79a5c431 Ilias Tsitsimpis
258 79a5c431 Ilias Tsitsimpis
    @classmethod
259 79a5c431 Ilias Tsitsimpis
    def tearDownClass(cls):  # noqa
260 79a5c431 Ilias Tsitsimpis
        """Clean up"""
261 79a5c431 Ilias Tsitsimpis
        if cls.created_container is not None:
262 79a5c431 Ilias Tsitsimpis
            cls.clients.pithos.del_container(delimiter='/')
263 79a5c431 Ilias Tsitsimpis
            cls.clients.pithos.purge_container()