Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / test / servers.py @ d2b8ec7b

History | View | Annotate | Download (17.2 kB)

1 039e3e61 Christos Stavrakakis
# Copyright 2012 GRNET S.A. All rights reserved.
2 039e3e61 Christos Stavrakakis
#
3 039e3e61 Christos Stavrakakis
# Redistribution and use in source and binary forms, with or
4 039e3e61 Christos Stavrakakis
# without modification, are permitted provided that the following
5 039e3e61 Christos Stavrakakis
# conditions are met:
6 039e3e61 Christos Stavrakakis
#
7 039e3e61 Christos Stavrakakis
#   1. Redistributions of source code must retain the above
8 039e3e61 Christos Stavrakakis
#      copyright notice, this list of conditions and the following
9 039e3e61 Christos Stavrakakis
#      disclaimer.
10 039e3e61 Christos Stavrakakis
#
11 039e3e61 Christos Stavrakakis
#   2. Redistributions in binary form must reproduce the above
12 039e3e61 Christos Stavrakakis
#      copyright notice, this list of conditions and the following
13 039e3e61 Christos Stavrakakis
#      disclaimer in the documentation and/or other materials
14 039e3e61 Christos Stavrakakis
#      provided with the distribution.
15 039e3e61 Christos Stavrakakis
#
16 039e3e61 Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 039e3e61 Christos Stavrakakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 039e3e61 Christos Stavrakakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 039e3e61 Christos Stavrakakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 039e3e61 Christos Stavrakakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 039e3e61 Christos Stavrakakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 039e3e61 Christos Stavrakakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 039e3e61 Christos Stavrakakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 039e3e61 Christos Stavrakakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 039e3e61 Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 039e3e61 Christos Stavrakakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 039e3e61 Christos Stavrakakis
# POSSIBILITY OF SUCH DAMAGE.
28 039e3e61 Christos Stavrakakis
#
29 039e3e61 Christos Stavrakakis
# The views and conclusions contained in the software and
30 039e3e61 Christos Stavrakakis
# documentation are those of the authors and should not be
31 039e3e61 Christos Stavrakakis
# interpreted as representing official policies, either expressed
32 039e3e61 Christos Stavrakakis
# or implied, of GRNET S.A.
33 039e3e61 Christos Stavrakakis
34 039e3e61 Christos Stavrakakis
import json
35 039e3e61 Christos Stavrakakis
36 d2b8ec7b Christos Stavrakakis
from snf_django.utils.testing import BaseAPITest
37 039e3e61 Christos Stavrakakis
from synnefo.db.models import VirtualMachine, VirtualMachineMetadata
38 039e3e61 Christos Stavrakakis
from synnefo.db import models_factory as mfactory
39 039e3e61 Christos Stavrakakis
from synnefo.logic.utils import get_rsapi_state
40 039e3e61 Christos Stavrakakis
41 039e3e61 Christos Stavrakakis
from mock import patch
42 039e3e61 Christos Stavrakakis
43 039e3e61 Christos Stavrakakis
44 039e3e61 Christos Stavrakakis
class ServerAPITest(BaseAPITest):
45 039e3e61 Christos Stavrakakis
    def setUp(self):
46 039e3e61 Christos Stavrakakis
        self.user1 = 'user1'
47 039e3e61 Christos Stavrakakis
        self.user2 = 'user2'
48 039e3e61 Christos Stavrakakis
        self.vm1 = mfactory.VirtualMachineFactory(userid=self.user1)
49 039e3e61 Christos Stavrakakis
        self.vm2 = mfactory.VirtualMachineFactory(userid=self.user2)
50 039e3e61 Christos Stavrakakis
        self.vm3 = mfactory.VirtualMachineFactory(deleted=True,
51 039e3e61 Christos Stavrakakis
                                                  userid=self.user1)
52 039e3e61 Christos Stavrakakis
        self.vm4 = mfactory.VirtualMachineFactory(userid=self.user2)
53 039e3e61 Christos Stavrakakis
54 039e3e61 Christos Stavrakakis
    def test_server_list_1(self):
55 039e3e61 Christos Stavrakakis
        """Test if the expected list of servers is returned."""
56 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers')
57 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
58 039e3e61 Christos Stavrakakis
        servers = json.loads(response.content)['servers']['values']
59 039e3e61 Christos Stavrakakis
        self.assertEqual(servers, [])
60 039e3e61 Christos Stavrakakis
61 039e3e61 Christos Stavrakakis
    def test_server_list_2(self):
62 039e3e61 Christos Stavrakakis
        """Test if the expected list of servers is returned."""
63 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers', self.user1)
64 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
65 039e3e61 Christos Stavrakakis
        servers = json.loads(response.content)['servers']['values']
66 039e3e61 Christos Stavrakakis
        db_server = self.vm1
67 039e3e61 Christos Stavrakakis
        self.assertEqual(servers, [{'name': db_server.name,
68 039e3e61 Christos Stavrakakis
                                    'id': db_server.id}])
69 039e3e61 Christos Stavrakakis
70 039e3e61 Christos Stavrakakis
    def test_server_list_detail(self):
71 039e3e61 Christos Stavrakakis
        """Test if the servers list details are returned."""
72 039e3e61 Christos Stavrakakis
        user = self.user2
73 039e3e61 Christos Stavrakakis
        user_vms = {self.vm2.id: self.vm2,
74 039e3e61 Christos Stavrakakis
                    self.vm4.id: self.vm4}
75 039e3e61 Christos Stavrakakis
76 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers/detail', user)
77 039e3e61 Christos Stavrakakis
        servers = json.loads(response.content)['servers']['values']
78 039e3e61 Christos Stavrakakis
        self.assertEqual(len(servers), len(user_vms))
79 039e3e61 Christos Stavrakakis
        for api_vm in servers:
80 039e3e61 Christos Stavrakakis
            db_vm = user_vms[api_vm['id']]
81 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['flavorRef'], db_vm.flavor.id)
82 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['hostId'], db_vm.hostid)
83 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['id'], db_vm.id)
84 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['imageRef'], db_vm.imageid)
85 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['name'], db_vm.name)
86 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['status'], get_rsapi_state(db_vm))
87 039e3e61 Christos Stavrakakis
            self.assertSuccess(response)
88 039e3e61 Christos Stavrakakis
89 039e3e61 Christos Stavrakakis
    def test_server_detail(self):
90 039e3e61 Christos Stavrakakis
        """Test if a server details are returned."""
91 039e3e61 Christos Stavrakakis
        db_vm = self.vm2
92 039e3e61 Christos Stavrakakis
        user = self.vm2.userid
93 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory()
94 039e3e61 Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net)
95 039e3e61 Christos Stavrakakis
96 039e3e61 Christos Stavrakakis
        db_vm_meta = mfactory.VirtualMachineMetadataFactory(vm=db_vm)
97 039e3e61 Christos Stavrakakis
98 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers/%d' % db_vm.id, user)
99 039e3e61 Christos Stavrakakis
        server = json.loads(response.content)['server']
100 039e3e61 Christos Stavrakakis
101 039e3e61 Christos Stavrakakis
        self.assertEqual(server['flavorRef'], db_vm.flavor.id)
102 039e3e61 Christos Stavrakakis
        self.assertEqual(server['hostId'], db_vm.hostid)
103 039e3e61 Christos Stavrakakis
        self.assertEqual(server['id'], db_vm.id)
104 039e3e61 Christos Stavrakakis
        self.assertEqual(server['imageRef'], db_vm.imageid)
105 039e3e61 Christos Stavrakakis
        self.assertEqual(server['name'], db_vm.name)
106 039e3e61 Christos Stavrakakis
        self.assertEqual(server['status'], get_rsapi_state(db_vm))
107 039e3e61 Christos Stavrakakis
        api_nic = server['attachments']['values'][0]
108 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['network_id'], str(net.id))
109 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['mac_address'], nic.mac)
110 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['firewallProfile'], nic.firewall_profile)
111 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['ipv4'], nic.ipv4)
112 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['ipv6'], nic.ipv6)
113 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['id'], 'nic-%s-%s' % (db_vm.id, nic.index))
114 039e3e61 Christos Stavrakakis
115 039e3e61 Christos Stavrakakis
        metadata = server['metadata']['values']
116 039e3e61 Christos Stavrakakis
        self.assertEqual(len(metadata), 1)
117 039e3e61 Christos Stavrakakis
        self.assertEqual(metadata[db_vm_meta.meta_key], db_vm_meta.meta_value)
118 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
119 039e3e61 Christos Stavrakakis
120 939d71dd Christos Stavrakakis
    def test_server_building_nics(self):
121 939d71dd Christos Stavrakakis
        db_vm = self.vm2
122 939d71dd Christos Stavrakakis
        user = self.vm2.userid
123 939d71dd Christos Stavrakakis
        net1 = mfactory.NetworkFactory()
124 939d71dd Christos Stavrakakis
        net2 = mfactory.NetworkFactory()
125 939d71dd Christos Stavrakakis
        net3 = mfactory.NetworkFactory()
126 939d71dd Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net1,
127 939d71dd Christos Stavrakakis
                                         state="BUILDING")
128 939d71dd Christos Stavrakakis
        nic2 = mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net2,
129 939d71dd Christos Stavrakakis
                                                state="ACTIVE")
130 939d71dd Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net3,
131 939d71dd Christos Stavrakakis
                                         state="BUILDING")
132 939d71dd Christos Stavrakakis
133 939d71dd Christos Stavrakakis
        response = self.get('/api/v1.1/servers/%d' % db_vm.id, user)
134 939d71dd Christos Stavrakakis
        server = json.loads(response.content)['server']
135 939d71dd Christos Stavrakakis
        nics = server["attachments"]["values"]
136 939d71dd Christos Stavrakakis
        self.assertEqual(len(nics), 1)
137 939d71dd Christos Stavrakakis
        self.assertEqual(nics[0]["network_id"], str(nic2.network_id))
138 939d71dd Christos Stavrakakis
139 039e3e61 Christos Stavrakakis
    def test_noauthorized(self):
140 039e3e61 Christos Stavrakakis
        """Test 404 for detail of other user vm"""
141 039e3e61 Christos Stavrakakis
        db_vm = self.vm2
142 039e3e61 Christos Stavrakakis
143 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers/%d' % db_vm.id, 'wrong_user')
144 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
145 039e3e61 Christos Stavrakakis
146 039e3e61 Christos Stavrakakis
    def test_wrong_server(self):
147 039e3e61 Christos Stavrakakis
        """Test 404 response if server does not exist."""
148 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers/%d' % 5000)
149 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
150 039e3e61 Christos Stavrakakis
151 039e3e61 Christos Stavrakakis
    def test_create_server_empty(self):
152 039e3e61 Christos Stavrakakis
        """Test if the create server call returns a 400 badRequest if
153 039e3e61 Christos Stavrakakis
           no attributes are specified."""
154 039e3e61 Christos Stavrakakis
155 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers', params={})
156 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
157 039e3e61 Christos Stavrakakis
158 039e3e61 Christos Stavrakakis
    def test_rename_server(self):
159 039e3e61 Christos Stavrakakis
        vm = self.vm2
160 039e3e61 Christos Stavrakakis
        request = {'server': {'name': 'new_name'}}
161 039e3e61 Christos Stavrakakis
        response = self.put('/api/v1.1/servers/%d' % vm.id, vm.userid,
162 039e3e61 Christos Stavrakakis
                            json.dumps(request), 'json')
163 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
164 039e3e61 Christos Stavrakakis
        self.assertEqual(VirtualMachine.objects.get(id=vm.id).name, "new_name")
165 039e3e61 Christos Stavrakakis
166 039e3e61 Christos Stavrakakis
167 039e3e61 Christos Stavrakakis
@patch('synnefo.api.util.get_image')
168 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
169 039e3e61 Christos Stavrakakis
class ServerCreateAPITest(BaseAPITest):
170 039e3e61 Christos Stavrakakis
    def test_create_server(self, mrapi, mimage):
171 039e3e61 Christos Stavrakakis
        """Test if the create server call returns the expected response
172 039e3e61 Christos Stavrakakis
           if a valid request has been speficied."""
173 039e3e61 Christos Stavrakakis
        mimage.return_value = {'location': 'pithos://foo',
174 920af09f Christos Stavrakakis
                               'checksum': '1234',
175 039e3e61 Christos Stavrakakis
                               'disk_format': 'diskdump'}
176 039e3e61 Christos Stavrakakis
        mrapi().CreateInstance.return_value = 12
177 039e3e61 Christos Stavrakakis
        flavor = mfactory.FlavorFactory()
178 039e3e61 Christos Stavrakakis
        # Create public network and backend
179 039e3e61 Christos Stavrakakis
        network = mfactory.NetworkFactory(public=True)
180 039e3e61 Christos Stavrakakis
        backend = mfactory.BackendFactory()
181 039e3e61 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=network, backend=backend)
182 039e3e61 Christos Stavrakakis
183 039e3e61 Christos Stavrakakis
        request = {
184 039e3e61 Christos Stavrakakis
                    "server": {
185 039e3e61 Christos Stavrakakis
                        "name": "new-server-test",
186 039e3e61 Christos Stavrakakis
                        "userid": "test_user",
187 039e3e61 Christos Stavrakakis
                        "imageRef": 1,
188 039e3e61 Christos Stavrakakis
                        "flavorRef": flavor.id,
189 039e3e61 Christos Stavrakakis
                        "metadata": {
190 039e3e61 Christos Stavrakakis
                            "My Server Name": "Apache1"
191 039e3e61 Christos Stavrakakis
                        },
192 039e3e61 Christos Stavrakakis
                        "personality": []
193 039e3e61 Christos Stavrakakis
                    }
194 039e3e61 Christos Stavrakakis
        }
195 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers', 'test_user',
196 039e3e61 Christos Stavrakakis
                                 json.dumps(request), 'json')
197 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
198 039e3e61 Christos Stavrakakis
        mrapi().CreateInstance.assert_called_once()
199 039e3e61 Christos Stavrakakis
200 039e3e61 Christos Stavrakakis
        api_server = json.loads(response.content)['server']
201 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['status'], "BUILD")
202 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['progress'], 0)
203 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['metadata']['values'],
204 039e3e61 Christos Stavrakakis
                        {"My Server Name":  "Apache1"})
205 039e3e61 Christos Stavrakakis
        self.assertTrue('adminPass' in api_server)
206 039e3e61 Christos Stavrakakis
207 039e3e61 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(userid='test_user')
208 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['name'], db_vm.name)
209 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['status'], db_vm.operstate)
210 039e3e61 Christos Stavrakakis
211 039e3e61 Christos Stavrakakis
    def test_create_server_no_flavor(self, mrapi, mimage):
212 039e3e61 Christos Stavrakakis
        request = {
213 039e3e61 Christos Stavrakakis
                    "server": {
214 039e3e61 Christos Stavrakakis
                        "name": "new-server-test",
215 039e3e61 Christos Stavrakakis
                        "userid": "test_user",
216 039e3e61 Christos Stavrakakis
                        "imageRef": 1,
217 039e3e61 Christos Stavrakakis
                        "flavorRef": 42,
218 039e3e61 Christos Stavrakakis
                        "metadata": {
219 039e3e61 Christos Stavrakakis
                            "My Server Name": "Apache1"
220 039e3e61 Christos Stavrakakis
                        },
221 039e3e61 Christos Stavrakakis
                        "personality": []
222 039e3e61 Christos Stavrakakis
                    }
223 039e3e61 Christos Stavrakakis
        }
224 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers', 'test_user',
225 039e3e61 Christos Stavrakakis
                                 json.dumps(request), 'json')
226 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
227 039e3e61 Christos Stavrakakis
228 039e3e61 Christos Stavrakakis
229 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
230 039e3e61 Christos Stavrakakis
class ServerDestroyAPITest(BaseAPITest):
231 039e3e61 Christos Stavrakakis
    def test_delete_server(self, mrapi):
232 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
233 039e3e61 Christos Stavrakakis
        response = self.delete('/api/v1.1/servers/%d' % vm.id, vm.userid)
234 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 204)
235 039e3e61 Christos Stavrakakis
        mrapi().DeleteInstance.assert_called_once()
236 039e3e61 Christos Stavrakakis
237 039e3e61 Christos Stavrakakis
    def test_non_existing_delete_server(self, mrapi):
238 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
239 039e3e61 Christos Stavrakakis
        response = self.delete('/api/v1.1/servers/%d' % 42, vm.userid)
240 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
241 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.mock_calls)
242 039e3e61 Christos Stavrakakis
243 039e3e61 Christos Stavrakakis
244 039e3e61 Christos Stavrakakis
class ServerMetadataAPITest(BaseAPITest):
245 039e3e61 Christos Stavrakakis
    def setUp(self):
246 039e3e61 Christos Stavrakakis
        self.vm = mfactory.VirtualMachineFactory()
247 039e3e61 Christos Stavrakakis
        self.metadata = mfactory.VirtualMachineMetadataFactory(vm=self.vm)
248 039e3e61 Christos Stavrakakis
249 039e3e61 Christos Stavrakakis
    def test_get_metadata(self):
250 039e3e61 Christos Stavrakakis
        vm = self.vm
251 039e3e61 Christos Stavrakakis
        create_meta = lambda: mfactory.VirtualMachineMetadataFactory(vm=vm)
252 039e3e61 Christos Stavrakakis
        metadata = [create_meta(), create_meta(), create_meta()]
253 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers/%d/meta' % vm.id, vm.userid)
254 039e3e61 Christos Stavrakakis
        self.assertTrue(response.status_code in [200, 203])
255 039e3e61 Christos Stavrakakis
        api_metadata = json.loads(response.content)['metadata']['values']
256 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_metadata), len(metadata) + 1)
257 039e3e61 Christos Stavrakakis
        for db_m in metadata:
258 039e3e61 Christos Stavrakakis
            self.assertEqual(api_metadata[db_m.meta_key], db_m.meta_value)
259 039e3e61 Christos Stavrakakis
260 039e3e61 Christos Stavrakakis
        request = {'metadata':
261 039e3e61 Christos Stavrakakis
                        {'foo': 'bar'},
262 039e3e61 Christos Stavrakakis
                        metadata[0].meta_key: 'bar2'
263 039e3e61 Christos Stavrakakis
                  }
264 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/meta' % vm.id, vm.userid,
265 039e3e61 Christos Stavrakakis
                             json.dumps(request), 'json')
266 039e3e61 Christos Stavrakakis
        metadata2 = VirtualMachineMetadata.objects.filter(vm=vm)
267 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers/%d/meta' % vm.id, vm.userid)
268 039e3e61 Christos Stavrakakis
        self.assertTrue(response.status_code in [200, 203])
269 039e3e61 Christos Stavrakakis
        api_metadata2 = json.loads(response.content)['metadata']['values']
270 039e3e61 Christos Stavrakakis
        self.assertTrue('foo' in api_metadata2.keys())
271 039e3e61 Christos Stavrakakis
        self.assertTrue(api_metadata2[metadata[0].meta_key], 'bar2')
272 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_metadata2), len(metadata2))
273 039e3e61 Christos Stavrakakis
        for db_m in metadata2:
274 039e3e61 Christos Stavrakakis
            self.assertEqual(api_metadata2[db_m.meta_key], db_m.meta_value)
275 039e3e61 Christos Stavrakakis
276 039e3e61 Christos Stavrakakis
        # Create new meta
277 039e3e61 Christos Stavrakakis
        request = {'meta': {'foo2': 'bar2'}}
278 039e3e61 Christos Stavrakakis
        response = self.put('/api/v1.1/servers/%d/meta/foo2' % vm.id,
279 039e3e61 Christos Stavrakakis
                            vm.userid, json.dumps(request), 'json')
280 039e3e61 Christos Stavrakakis
281 039e3e61 Christos Stavrakakis
        # Get the new meta
282 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers/%d/meta/foo2' % vm.id,
283 039e3e61 Christos Stavrakakis
                            vm.userid)
284 039e3e61 Christos Stavrakakis
        meta = json.loads(response.content)['meta']
285 039e3e61 Christos Stavrakakis
        self.assertEqual(meta['foo2'], 'bar2')
286 039e3e61 Christos Stavrakakis
287 039e3e61 Christos Stavrakakis
        # Delete the new meta
288 039e3e61 Christos Stavrakakis
        response = self.delete('/api/v1.1/servers/%d/meta/foo2' % vm.id,
289 039e3e61 Christos Stavrakakis
                               vm.userid)
290 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 204)
291 039e3e61 Christos Stavrakakis
292 039e3e61 Christos Stavrakakis
        # Try to get the deleted meta: should raise 404
293 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers/%d/meta/foo2' % vm.id,
294 039e3e61 Christos Stavrakakis
                            vm.userid)
295 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 404)
296 039e3e61 Christos Stavrakakis
297 039e3e61 Christos Stavrakakis
    def test_invalid_metadata(self):
298 039e3e61 Christos Stavrakakis
        vm = self.vm
299 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/meta' % vm.id, vm.userid)
300 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
301 039e3e61 Christos Stavrakakis
        self.assertEqual(len(vm.metadata.all()), 1)
302 039e3e61 Christos Stavrakakis
303 039e3e61 Christos Stavrakakis
    def test_invalid_metadata_server(self):
304 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers/42/meta', 'user')
305 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
306 039e3e61 Christos Stavrakakis
307 039e3e61 Christos Stavrakakis
    def test_get_meta_invalid_key(self):
308 039e3e61 Christos Stavrakakis
        vm = self.vm
309 039e3e61 Christos Stavrakakis
        response = self.get('/api/v1.1/servers/%d/meta/foo2' % vm.id,
310 039e3e61 Christos Stavrakakis
                            vm.userid)
311 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
312 039e3e61 Christos Stavrakakis
313 039e3e61 Christos Stavrakakis
314 039e3e61 Christos Stavrakakis
@patch('synnefo.api.util.get_image')
315 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
316 039e3e61 Christos Stavrakakis
class ServerActionAPITest(BaseAPITest):
317 039e3e61 Christos Stavrakakis
    def test_actions(self, mrapi, mimage):
318 039e3e61 Christos Stavrakakis
        actions = ['start', 'shutdown', 'reboot']
319 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
320 039e3e61 Christos Stavrakakis
        vm.operstate = "STOPPED"
321 039e3e61 Christos Stavrakakis
        vm.save()
322 039e3e61 Christos Stavrakakis
        for action in actions:
323 039e3e61 Christos Stavrakakis
            val = {'type': 'HARD'} if action == 'reboot' else {}
324 039e3e61 Christos Stavrakakis
            request = {action: val}
325 039e3e61 Christos Stavrakakis
            response = self.post('/api/v1.1/servers/%d/action' % vm.id,
326 039e3e61 Christos Stavrakakis
                                vm.userid, json.dumps(request), 'json')
327 039e3e61 Christos Stavrakakis
            self.assertEqual(response.status_code, 202)
328 039e3e61 Christos Stavrakakis
            if action == 'shutdown':
329 039e3e61 Christos Stavrakakis
                self.assertEqual(VirtualMachine.objects.get(id=vm.id).action,
330 039e3e61 Christos Stavrakakis
                                 "STOP")
331 039e3e61 Christos Stavrakakis
            else:
332 039e3e61 Christos Stavrakakis
                self.assertEqual(VirtualMachine.objects.get(id=vm.id).action,
333 039e3e61 Christos Stavrakakis
                                 action.upper())
334 039e3e61 Christos Stavrakakis
335 039e3e61 Christos Stavrakakis
    def test_action_in_building_vm(self, mrapi, mimage):
336 039e3e61 Christos Stavrakakis
        """Test building in progress"""
337 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
338 039e3e61 Christos Stavrakakis
        request = {'start': '{}'}
339 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
340 039e3e61 Christos Stavrakakis
                             vm.userid, json.dumps(request), 'json')
341 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 409)
342 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.mock_calls)
343 039e3e61 Christos Stavrakakis
344 039e3e61 Christos Stavrakakis
    def test_destroy_build_vm(self, mrapi, mimage):
345 039e3e61 Christos Stavrakakis
        """Test building in progress"""
346 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
347 039e3e61 Christos Stavrakakis
        response = self.delete('/api/v1.1/servers/%d' % vm.id,
348 039e3e61 Christos Stavrakakis
                             vm.userid)
349 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
350 039e3e61 Christos Stavrakakis
        mrapi().RemoveInstance.assert_called_once()
351 039e3e61 Christos Stavrakakis
352 039e3e61 Christos Stavrakakis
    def test_firewall(self, mrapi, mimage):
353 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
354 039e3e61 Christos Stavrakakis
        vm.operstate = "STOPPED"
355 039e3e61 Christos Stavrakakis
        vm.save()
356 039e3e61 Christos Stavrakakis
        request = {'firewallProfile': {'profile': 'PROTECTED'}}
357 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
358 039e3e61 Christos Stavrakakis
                             vm.userid, json.dumps(request), 'json')
359 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
360 039e3e61 Christos Stavrakakis
        mrapi().ModifyInstance.assert_called_once()
361 039e3e61 Christos Stavrakakis
362 039e3e61 Christos Stavrakakis
    def test_unsupported_firewall(self, mrapi, mimage):
363 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
364 039e3e61 Christos Stavrakakis
        vm.operstate = "STOPPED"
365 039e3e61 Christos Stavrakakis
        vm.save()
366 039e3e61 Christos Stavrakakis
        request = {'firewallProfile': {'profile': 'FOO'}}
367 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
368 039e3e61 Christos Stavrakakis
                             vm.userid, json.dumps(request), 'json')
369 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
370 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.mock_calls)
371 039e3e61 Christos Stavrakakis
372 039e3e61 Christos Stavrakakis
373 039e3e61 Christos Stavrakakis
class ServerVNCConsole(BaseAPITest):
374 039e3e61 Christos Stavrakakis
    def test_not_active_server(self):
375 039e3e61 Christos Stavrakakis
        """Test console req for not ACTIVE server returns badRequest"""
376 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
377 039e3e61 Christos Stavrakakis
        data = json.dumps({'console': {'type': 'vnc'}})
378 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
379 039e3e61 Christos Stavrakakis
                             vm.userid, data, 'json')
380 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
381 039e3e61 Christos Stavrakakis
382 039e3e61 Christos Stavrakakis
    def test_active_server(self):
383 039e3e61 Christos Stavrakakis
        """Test console req for ACTIVE server"""
384 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
385 039e3e61 Christos Stavrakakis
        vm.operstate = 'STARTED'
386 039e3e61 Christos Stavrakakis
        vm.save()
387 039e3e61 Christos Stavrakakis
388 039e3e61 Christos Stavrakakis
        data = json.dumps({'console': {'type': 'vnc'}})
389 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
390 039e3e61 Christos Stavrakakis
                             vm.userid, data, 'json')
391 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 200)
392 039e3e61 Christos Stavrakakis
        reply = json.loads(response.content)
393 039e3e61 Christos Stavrakakis
        self.assertEqual(reply.keys(), ['console'])
394 039e3e61 Christos Stavrakakis
        console = reply['console']
395 039e3e61 Christos Stavrakakis
        self.assertEqual(console['type'], 'vnc')
396 039e3e61 Christos Stavrakakis
        self.assertEqual(set(console.keys()),
397 039e3e61 Christos Stavrakakis
                         set(['type', 'host', 'port', 'password']))
398 039e3e61 Christos Stavrakakis
399 039e3e61 Christos Stavrakakis
    def test_wrong_console_type(self):
400 039e3e61 Christos Stavrakakis
        """Test console req for ACTIVE server"""
401 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
402 039e3e61 Christos Stavrakakis
        vm.operstate = 'STARTED'
403 039e3e61 Christos Stavrakakis
        vm.save()
404 039e3e61 Christos Stavrakakis
405 039e3e61 Christos Stavrakakis
        data = json.dumps({'console': {'type': 'foo'}})
406 039e3e61 Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
407 039e3e61 Christos Stavrakakis
                             vm.userid, data, 'json')
408 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)