1# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5#      http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
12
13"""
14test_compute
15----------------------------------
16
17Functional tests for `shade` image methods.
18"""
19
20import filecmp
21import os
22import tempfile
23
24from openstack.tests.functional import base
25
26
27class TestImage(base.BaseFunctionalTest):
28    def setUp(self):
29        super(TestImage, self).setUp()
30        self.image = self.pick_image()
31
32    def test_create_image(self):
33        test_image = tempfile.NamedTemporaryFile(delete=False)
34        test_image.write(b'\0' * 1024 * 1024)
35        test_image.close()
36        image_name = self.getUniqueString('image')
37        try:
38            self.user_cloud.create_image(
39                name=image_name,
40                filename=test_image.name,
41                disk_format='raw',
42                container_format='bare',
43                min_disk=10,
44                min_ram=1024,
45                tags=['custom'],
46                wait=True)
47        finally:
48            self.user_cloud.delete_image(image_name, wait=True)
49
50    def test_download_image(self):
51        test_image = tempfile.NamedTemporaryFile(delete=False)
52        self.addCleanup(os.remove, test_image.name)
53        test_image.write(b'\0' * 1024 * 1024)
54        test_image.close()
55        image_name = self.getUniqueString('image')
56        self.user_cloud.create_image(
57            name=image_name,
58            filename=test_image.name,
59            disk_format='raw',
60            container_format='bare',
61            min_disk=10,
62            min_ram=1024,
63            wait=True)
64        self.addCleanup(self.user_cloud.delete_image, image_name, wait=True)
65        output = os.path.join(tempfile.gettempdir(), self.getUniqueString())
66        self.user_cloud.download_image(image_name, output)
67        self.addCleanup(os.remove, output)
68        self.assertTrue(filecmp.cmp(test_image.name, output),
69                        "Downloaded contents don't match created image")
70
71    def test_create_image_skip_duplicate(self):
72        test_image = tempfile.NamedTemporaryFile(delete=False)
73        test_image.write(b'\0' * 1024 * 1024)
74        test_image.close()
75        image_name = self.getUniqueString('image')
76        try:
77            first_image = self.user_cloud.create_image(
78                name=image_name,
79                filename=test_image.name,
80                disk_format='raw',
81                container_format='bare',
82                min_disk=10,
83                min_ram=1024,
84                validate_checksum=True,
85                wait=True)
86            second_image = self.user_cloud.create_image(
87                name=image_name,
88                filename=test_image.name,
89                disk_format='raw',
90                container_format='bare',
91                min_disk=10,
92                min_ram=1024,
93                validate_checksum=True,
94                wait=True)
95            self.assertEqual(first_image.id, second_image.id)
96        finally:
97            self.user_cloud.delete_image(image_name, wait=True)
98
99    def test_create_image_force_duplicate(self):
100        test_image = tempfile.NamedTemporaryFile(delete=False)
101        test_image.write(b'\0' * 1024 * 1024)
102        test_image.close()
103        image_name = self.getUniqueString('image')
104        first_image = None
105        second_image = None
106        try:
107            first_image = self.user_cloud.create_image(
108                name=image_name,
109                filename=test_image.name,
110                disk_format='raw',
111                container_format='bare',
112                min_disk=10,
113                min_ram=1024,
114                wait=True)
115            second_image = self.user_cloud.create_image(
116                name=image_name,
117                filename=test_image.name,
118                disk_format='raw',
119                container_format='bare',
120                min_disk=10,
121                min_ram=1024,
122                allow_duplicates=True,
123                wait=True)
124            self.assertNotEqual(first_image.id, second_image.id)
125        finally:
126            if first_image:
127                self.user_cloud.delete_image(first_image.id, wait=True)
128            if second_image:
129                self.user_cloud.delete_image(second_image.id, wait=True)
130
131    def test_create_image_update_properties(self):
132        test_image = tempfile.NamedTemporaryFile(delete=False)
133        test_image.write(b'\0' * 1024 * 1024)
134        test_image.close()
135        image_name = self.getUniqueString('image')
136        try:
137            image = self.user_cloud.create_image(
138                name=image_name,
139                filename=test_image.name,
140                disk_format='raw',
141                container_format='bare',
142                min_disk=10,
143                min_ram=1024,
144                wait=True)
145            self.user_cloud.update_image_properties(
146                image=image,
147                name=image_name,
148                foo='bar')
149            image = self.user_cloud.get_image(image_name)
150            self.assertIn('foo', image.properties)
151            self.assertEqual(image.properties['foo'], 'bar')
152        finally:
153            self.user_cloud.delete_image(image_name, wait=True)
154
155    def test_create_image_without_filename(self):
156        image_name = self.getUniqueString('image')
157        image = self.user_cloud.create_image(
158            name=image_name,
159            disk_format='raw',
160            container_format='bare',
161            min_disk=10,
162            min_ram=1024,
163            allow_duplicates=True,
164            wait=False)
165        self.assertEqual(image_name, image.name)
166        self.user_cloud.delete_image(image.id, wait=True)
167
168    def test_get_image_by_id(self):
169        test_image = tempfile.NamedTemporaryFile(delete=False)
170        test_image.write(b'\0' * 1024 * 1024)
171        test_image.close()
172        image_name = self.getUniqueString('image')
173        try:
174            image = self.user_cloud.create_image(
175                name=image_name,
176                filename=test_image.name,
177                disk_format='raw',
178                container_format='bare',
179                min_disk=10,
180                min_ram=1024,
181                wait=True)
182            image = self.user_cloud.get_image_by_id(image.id)
183            self.assertEqual(image_name, image.name)
184            self.assertEqual('raw', image.disk_format)
185        finally:
186            self.user_cloud.delete_image(image_name, wait=True)
187