Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (24.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 41a7fae7 Christos Stavrakakis
from snf_django.utils.testing import (BaseAPITest, mocked_quotaholder,
37 41a7fae7 Christos Stavrakakis
                                      override_settings)
38 039e3e61 Christos Stavrakakis
from synnefo.db.models import VirtualMachine, VirtualMachineMetadata
39 039e3e61 Christos Stavrakakis
from synnefo.db import models_factory as mfactory
40 039e3e61 Christos Stavrakakis
from synnefo.logic.utils import get_rsapi_state
41 a26e5a4d Georgios D. Tsoukalas
from synnefo.cyclades_settings import cyclades_services
42 a26e5a4d Georgios D. Tsoukalas
from synnefo.lib.services import get_service_path
43 a26e5a4d Georgios D. Tsoukalas
from synnefo.lib import join_urls
44 41a7fae7 Christos Stavrakakis
from synnefo import settings
45 039e3e61 Christos Stavrakakis
46 039e3e61 Christos Stavrakakis
from mock import patch
47 039e3e61 Christos Stavrakakis
48 039e3e61 Christos Stavrakakis
49 a26e5a4d Georgios D. Tsoukalas
class ComputeAPITest(BaseAPITest):
50 a26e5a4d Georgios D. Tsoukalas
    def setUp(self, *args, **kwargs):
51 a26e5a4d Georgios D. Tsoukalas
        super(ComputeAPITest, self).setUp(*args, **kwargs)
52 a26e5a4d Georgios D. Tsoukalas
        self.compute_path = get_service_path(cyclades_services, 'compute',
53 a26e5a4d Georgios D. Tsoukalas
                                             version='v2.0')
54 41a7fae7 Christos Stavrakakis
55 a26e5a4d Georgios D. Tsoukalas
    def myget(self, path, *args, **kwargs):
56 a26e5a4d Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
57 a26e5a4d Georgios D. Tsoukalas
        return self.get(path, *args, **kwargs)
58 a26e5a4d Georgios D. Tsoukalas
59 a26e5a4d Georgios D. Tsoukalas
    def myput(self, path, *args, **kwargs):
60 a26e5a4d Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
61 a26e5a4d Georgios D. Tsoukalas
        return self.put(path, *args, **kwargs)
62 a26e5a4d Georgios D. Tsoukalas
63 a26e5a4d Georgios D. Tsoukalas
    def mypost(self, path, *args, **kwargs):
64 a26e5a4d Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
65 a26e5a4d Georgios D. Tsoukalas
        return self.post(path, *args, **kwargs)
66 a26e5a4d Georgios D. Tsoukalas
67 a26e5a4d Georgios D. Tsoukalas
    def mydelete(self, path, *args, **kwargs):
68 a26e5a4d Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
69 a26e5a4d Georgios D. Tsoukalas
        return self.delete(path, *args, **kwargs)
70 a26e5a4d Georgios D. Tsoukalas
71 a26e5a4d Georgios D. Tsoukalas
72 a26e5a4d Georgios D. Tsoukalas
class ServerAPITest(ComputeAPITest):
73 039e3e61 Christos Stavrakakis
    def setUp(self):
74 039e3e61 Christos Stavrakakis
        self.user1 = 'user1'
75 039e3e61 Christos Stavrakakis
        self.user2 = 'user2'
76 039e3e61 Christos Stavrakakis
        self.vm1 = mfactory.VirtualMachineFactory(userid=self.user1)
77 039e3e61 Christos Stavrakakis
        self.vm2 = mfactory.VirtualMachineFactory(userid=self.user2)
78 039e3e61 Christos Stavrakakis
        self.vm3 = mfactory.VirtualMachineFactory(deleted=True,
79 039e3e61 Christos Stavrakakis
                                                  userid=self.user1)
80 039e3e61 Christos Stavrakakis
        self.vm4 = mfactory.VirtualMachineFactory(userid=self.user2)
81 a26e5a4d Georgios D. Tsoukalas
        super(ServerAPITest, self).setUp()
82 039e3e61 Christos Stavrakakis
83 039e3e61 Christos Stavrakakis
    def test_server_list_1(self):
84 039e3e61 Christos Stavrakakis
        """Test if the expected list of servers is returned."""
85 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers')
86 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
87 2d04422f Christos Stavrakakis
        servers = json.loads(response.content)['servers']
88 039e3e61 Christos Stavrakakis
        self.assertEqual(servers, [])
89 039e3e61 Christos Stavrakakis
90 039e3e61 Christos Stavrakakis
    def test_server_list_2(self):
91 039e3e61 Christos Stavrakakis
        """Test if the expected list of servers is returned."""
92 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers', self.user1)
93 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
94 2d04422f Christos Stavrakakis
        servers = json.loads(response.content)['servers']
95 039e3e61 Christos Stavrakakis
        db_server = self.vm1
96 1b696c26 Christos Stavrakakis
        server = servers[0]
97 1b696c26 Christos Stavrakakis
        self.assertEqual(server["name"], db_server.name)
98 1b696c26 Christos Stavrakakis
        self.assertEqual(server["id"], db_server.id)
99 039e3e61 Christos Stavrakakis
100 039e3e61 Christos Stavrakakis
    def test_server_list_detail(self):
101 039e3e61 Christos Stavrakakis
        """Test if the servers list details are returned."""
102 039e3e61 Christos Stavrakakis
        user = self.user2
103 039e3e61 Christos Stavrakakis
        user_vms = {self.vm2.id: self.vm2,
104 039e3e61 Christos Stavrakakis
                    self.vm4.id: self.vm4}
105 039e3e61 Christos Stavrakakis
106 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/detail', user)
107 2d04422f Christos Stavrakakis
        servers = json.loads(response.content)['servers']
108 039e3e61 Christos Stavrakakis
        self.assertEqual(len(servers), len(user_vms))
109 039e3e61 Christos Stavrakakis
        for api_vm in servers:
110 039e3e61 Christos Stavrakakis
            db_vm = user_vms[api_vm['id']]
111 1b696c26 Christos Stavrakakis
            self.assertEqual(api_vm['flavor']["id"], db_vm.flavor.id)
112 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['hostId'], db_vm.hostid)
113 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['id'], db_vm.id)
114 1b696c26 Christos Stavrakakis
            self.assertEqual(api_vm['image']["id"], db_vm.imageid)
115 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['name'], db_vm.name)
116 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['status'], get_rsapi_state(db_vm))
117 039e3e61 Christos Stavrakakis
            self.assertSuccess(response)
118 039e3e61 Christos Stavrakakis
119 039e3e61 Christos Stavrakakis
    def test_server_detail(self):
120 039e3e61 Christos Stavrakakis
        """Test if a server details are returned."""
121 039e3e61 Christos Stavrakakis
        db_vm = self.vm2
122 039e3e61 Christos Stavrakakis
        user = self.vm2.userid
123 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory()
124 1f638a85 Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net,
125 1f638a85 Christos Stavrakakis
                                              ipv6="::babe")
126 039e3e61 Christos Stavrakakis
127 039e3e61 Christos Stavrakakis
        db_vm_meta = mfactory.VirtualMachineMetadataFactory(vm=db_vm)
128 039e3e61 Christos Stavrakakis
129 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d' % db_vm.id, user)
130 039e3e61 Christos Stavrakakis
        server = json.loads(response.content)['server']
131 039e3e61 Christos Stavrakakis
132 1b696c26 Christos Stavrakakis
        self.assertEqual(server['flavor']["id"], db_vm.flavor.id)
133 039e3e61 Christos Stavrakakis
        self.assertEqual(server['hostId'], db_vm.hostid)
134 039e3e61 Christos Stavrakakis
        self.assertEqual(server['id'], db_vm.id)
135 1b696c26 Christos Stavrakakis
        self.assertEqual(server['image']["id"], db_vm.imageid)
136 039e3e61 Christos Stavrakakis
        self.assertEqual(server['name'], db_vm.name)
137 039e3e61 Christos Stavrakakis
        self.assertEqual(server['status'], get_rsapi_state(db_vm))
138 2d04422f Christos Stavrakakis
        api_nic = server['attachments'][0]
139 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['network_id'], str(net.id))
140 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['mac_address'], nic.mac)
141 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['firewallProfile'], nic.firewall_profile)
142 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['ipv4'], nic.ipv4)
143 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['ipv6'], nic.ipv6)
144 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['id'], 'nic-%s-%s' % (db_vm.id, nic.index))
145 1f638a85 Christos Stavrakakis
        api_address = server["addresses"]
146 1f638a85 Christos Stavrakakis
        self.assertEqual(api_address[str(net.id)],
147 f8352d29 Christos Stavrakakis
               [{"version": 4, "addr": nic.ipv4, "OS-EXT-IPS:type": "fixed"},
148 f8352d29 Christos Stavrakakis
                {"version": 6, "addr": nic.ipv6, "OS-EXT-IPS:type": "fixed"}])
149 039e3e61 Christos Stavrakakis
150 2d04422f Christos Stavrakakis
        metadata = server['metadata']
151 039e3e61 Christos Stavrakakis
        self.assertEqual(len(metadata), 1)
152 039e3e61 Christos Stavrakakis
        self.assertEqual(metadata[db_vm_meta.meta_key], db_vm_meta.meta_value)
153 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
154 039e3e61 Christos Stavrakakis
155 939d71dd Christos Stavrakakis
    def test_server_building_nics(self):
156 939d71dd Christos Stavrakakis
        db_vm = self.vm2
157 939d71dd Christos Stavrakakis
        user = self.vm2.userid
158 939d71dd Christos Stavrakakis
        net1 = mfactory.NetworkFactory()
159 939d71dd Christos Stavrakakis
        net2 = mfactory.NetworkFactory()
160 939d71dd Christos Stavrakakis
        net3 = mfactory.NetworkFactory()
161 939d71dd Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net1,
162 939d71dd Christos Stavrakakis
                                         state="BUILDING")
163 939d71dd Christos Stavrakakis
        nic2 = mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net2,
164 939d71dd Christos Stavrakakis
                                                state="ACTIVE")
165 939d71dd Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net3,
166 939d71dd Christos Stavrakakis
                                         state="BUILDING")
167 939d71dd Christos Stavrakakis
168 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d' % db_vm.id, user)
169 939d71dd Christos Stavrakakis
        server = json.loads(response.content)['server']
170 2d04422f Christos Stavrakakis
        nics = server["attachments"]
171 939d71dd Christos Stavrakakis
        self.assertEqual(len(nics), 1)
172 939d71dd Christos Stavrakakis
        self.assertEqual(nics[0]["network_id"], str(nic2.network_id))
173 939d71dd Christos Stavrakakis
174 039e3e61 Christos Stavrakakis
    def test_noauthorized(self):
175 039e3e61 Christos Stavrakakis
        """Test 404 for detail of other user vm"""
176 039e3e61 Christos Stavrakakis
        db_vm = self.vm2
177 039e3e61 Christos Stavrakakis
178 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d' % db_vm.id, 'wrong_user')
179 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
180 039e3e61 Christos Stavrakakis
181 039e3e61 Christos Stavrakakis
    def test_wrong_server(self):
182 039e3e61 Christos Stavrakakis
        """Test 404 response if server does not exist."""
183 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d' % 5000)
184 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
185 039e3e61 Christos Stavrakakis
186 039e3e61 Christos Stavrakakis
    def test_create_server_empty(self):
187 039e3e61 Christos Stavrakakis
        """Test if the create server call returns a 400 badRequest if
188 039e3e61 Christos Stavrakakis
           no attributes are specified."""
189 039e3e61 Christos Stavrakakis
190 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers', params={})
191 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
192 039e3e61 Christos Stavrakakis
193 039e3e61 Christos Stavrakakis
    def test_rename_server(self):
194 039e3e61 Christos Stavrakakis
        vm = self.vm2
195 039e3e61 Christos Stavrakakis
        request = {'server': {'name': 'new_name'}}
196 a26e5a4d Georgios D. Tsoukalas
        response = self.myput('servers/%d' % vm.id, vm.userid,
197 a26e5a4d Georgios D. Tsoukalas
                              json.dumps(request), 'json')
198 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
199 039e3e61 Christos Stavrakakis
        self.assertEqual(VirtualMachine.objects.get(id=vm.id).name, "new_name")
200 039e3e61 Christos Stavrakakis
201 a3accf03 Georgios D. Tsoukalas
    def test_catch_wrong_api_paths(self):
202 a3accf03 Georgios D. Tsoukalas
        response = self.myget('nonexistent')
203 a3accf03 Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
204 a3accf03 Georgios D. Tsoukalas
        try:
205 a3accf03 Georgios D. Tsoukalas
            error = json.loads(response.content)
206 a3accf03 Georgios D. Tsoukalas
        except ValueError:
207 a3accf03 Georgios D. Tsoukalas
            self.assertTrue(False)
208 a3accf03 Georgios D. Tsoukalas
209 16437e4d Kostas Papadimitriou
    def test_method_not_allowed(self, *args):
210 16437e4d Kostas Papadimitriou
        # /servers/ allows only POST, GET
211 16437e4d Kostas Papadimitriou
        response = self.myput('servers', '', '')
212 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
213 16437e4d Kostas Papadimitriou
        response = self.mydelete('servers')
214 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
215 16437e4d Kostas Papadimitriou
216 16437e4d Kostas Papadimitriou
        # /servers/<srvid>/ allows only GET, PUT, DELETE
217 16437e4d Kostas Papadimitriou
        response = self.mypost("servers/42")
218 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
219 16437e4d Kostas Papadimitriou
220 16437e4d Kostas Papadimitriou
        # /imags/<srvid>/metadata/ allows only POST, GET
221 16437e4d Kostas Papadimitriou
        response = self.myput('servers/42/metadata', '', '')
222 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
223 16437e4d Kostas Papadimitriou
        response = self.mydelete('servers/42/metadata')
224 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
225 16437e4d Kostas Papadimitriou
226 16437e4d Kostas Papadimitriou
        # /imags/<srvid>/metadata/ allows only POST, GET
227 16437e4d Kostas Papadimitriou
        response = self.myput('servers/42/metadata', '', '')
228 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
229 16437e4d Kostas Papadimitriou
        response = self.mydelete('servers/42/metadata')
230 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
231 16437e4d Kostas Papadimitriou
232 16437e4d Kostas Papadimitriou
        # /imags/<srvid>/metadata/<key> allows only PUT, GET, DELETE
233 16437e4d Kostas Papadimitriou
        response = self.mypost('servers/42/metadata/foo')
234 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
235 16437e4d Kostas Papadimitriou
236 039e3e61 Christos Stavrakakis
237 039e3e61 Christos Stavrakakis
@patch('synnefo.api.util.get_image')
238 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
239 a26e5a4d Georgios D. Tsoukalas
class ServerCreateAPITest(ComputeAPITest):
240 039e3e61 Christos Stavrakakis
    def test_create_server(self, mrapi, mimage):
241 039e3e61 Christos Stavrakakis
        """Test if the create server call returns the expected response
242 039e3e61 Christos Stavrakakis
           if a valid request has been speficied."""
243 039e3e61 Christos Stavrakakis
        mimage.return_value = {'location': 'pithos://foo',
244 920af09f Christos Stavrakakis
                               'checksum': '1234',
245 bcd80cd9 Christos Stavrakakis
                               "id": 1,
246 bcd80cd9 Christos Stavrakakis
                               "name": "test_image",
247 039e3e61 Christos Stavrakakis
                               'disk_format': 'diskdump'}
248 039e3e61 Christos Stavrakakis
        mrapi().CreateInstance.return_value = 12
249 039e3e61 Christos Stavrakakis
        flavor = mfactory.FlavorFactory()
250 039e3e61 Christos Stavrakakis
        # Create public network and backend
251 039e3e61 Christos Stavrakakis
        network = mfactory.NetworkFactory(public=True)
252 039e3e61 Christos Stavrakakis
        backend = mfactory.BackendFactory()
253 039e3e61 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=network, backend=backend)
254 039e3e61 Christos Stavrakakis
255 039e3e61 Christos Stavrakakis
        request = {
256 039e3e61 Christos Stavrakakis
                    "server": {
257 039e3e61 Christos Stavrakakis
                        "name": "new-server-test",
258 039e3e61 Christos Stavrakakis
                        "userid": "test_user",
259 039e3e61 Christos Stavrakakis
                        "imageRef": 1,
260 039e3e61 Christos Stavrakakis
                        "flavorRef": flavor.id,
261 039e3e61 Christos Stavrakakis
                        "metadata": {
262 039e3e61 Christos Stavrakakis
                            "My Server Name": "Apache1"
263 039e3e61 Christos Stavrakakis
                        },
264 039e3e61 Christos Stavrakakis
                        "personality": []
265 039e3e61 Christos Stavrakakis
                    }
266 039e3e61 Christos Stavrakakis
        }
267 184a2a8c Christos Stavrakakis
        with mocked_quotaholder():
268 a26e5a4d Georgios D. Tsoukalas
            response = self.mypost('servers', 'test_user',
269 a26e5a4d Georgios D. Tsoukalas
                                   json.dumps(request), 'json')
270 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
271 039e3e61 Christos Stavrakakis
        mrapi().CreateInstance.assert_called_once()
272 039e3e61 Christos Stavrakakis
273 039e3e61 Christos Stavrakakis
        api_server = json.loads(response.content)['server']
274 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['status'], "BUILD")
275 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['progress'], 0)
276 2d04422f Christos Stavrakakis
        self.assertEqual(api_server['metadata'],
277 039e3e61 Christos Stavrakakis
                        {"My Server Name":  "Apache1"})
278 039e3e61 Christos Stavrakakis
        self.assertTrue('adminPass' in api_server)
279 039e3e61 Christos Stavrakakis
280 039e3e61 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(userid='test_user')
281 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['name'], db_vm.name)
282 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['status'], db_vm.operstate)
283 039e3e61 Christos Stavrakakis
284 6dafedf6 Christos Stavrakakis
        # Test drained flag in Network:
285 6dafedf6 Christos Stavrakakis
        network.drained = True
286 6dafedf6 Christos Stavrakakis
        network.save()
287 6dafedf6 Christos Stavrakakis
        with mocked_quotaholder():
288 a26e5a4d Georgios D. Tsoukalas
            response = self.mypost('servers', 'test_user',
289 a26e5a4d Georgios D. Tsoukalas
                                    json.dumps(request), 'json')
290 6dafedf6 Christos Stavrakakis
        self.assertEqual(response.status_code, 503, "serviceUnavailable")
291 6dafedf6 Christos Stavrakakis
292 039e3e61 Christos Stavrakakis
    def test_create_server_no_flavor(self, mrapi, mimage):
293 039e3e61 Christos Stavrakakis
        request = {
294 039e3e61 Christos Stavrakakis
                    "server": {
295 039e3e61 Christos Stavrakakis
                        "name": "new-server-test",
296 039e3e61 Christos Stavrakakis
                        "userid": "test_user",
297 039e3e61 Christos Stavrakakis
                        "imageRef": 1,
298 039e3e61 Christos Stavrakakis
                        "flavorRef": 42,
299 039e3e61 Christos Stavrakakis
                        "metadata": {
300 039e3e61 Christos Stavrakakis
                            "My Server Name": "Apache1"
301 039e3e61 Christos Stavrakakis
                        },
302 039e3e61 Christos Stavrakakis
                        "personality": []
303 039e3e61 Christos Stavrakakis
                    }
304 039e3e61 Christos Stavrakakis
        }
305 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers', 'test_user',
306 a26e5a4d Georgios D. Tsoukalas
                               json.dumps(request), 'json')
307 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
308 039e3e61 Christos Stavrakakis
309 039e3e61 Christos Stavrakakis
310 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
311 a26e5a4d Georgios D. Tsoukalas
class ServerDestroyAPITest(ComputeAPITest):
312 039e3e61 Christos Stavrakakis
    def test_delete_server(self, mrapi):
313 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
314 41a7fae7 Christos Stavrakakis
        mrapi().DeleteInstance.return_value = 12
315 41a7fae7 Christos Stavrakakis
        response = self.mydelete('/api/v1.1/servers/%d' % vm.id, vm.userid)
316 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 204)
317 039e3e61 Christos Stavrakakis
        mrapi().DeleteInstance.assert_called_once()
318 039e3e61 Christos Stavrakakis
319 039e3e61 Christos Stavrakakis
    def test_non_existing_delete_server(self, mrapi):
320 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
321 a26e5a4d Georgios D. Tsoukalas
        response = self.mydelete('servers/%d' % 42, vm.userid)
322 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
323 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.mock_calls)
324 039e3e61 Christos Stavrakakis
325 039e3e61 Christos Stavrakakis
326 a26e5a4d Georgios D. Tsoukalas
class ServerMetadataAPITest(ComputeAPITest):
327 039e3e61 Christos Stavrakakis
    def setUp(self):
328 039e3e61 Christos Stavrakakis
        self.vm = mfactory.VirtualMachineFactory()
329 039e3e61 Christos Stavrakakis
        self.metadata = mfactory.VirtualMachineMetadataFactory(vm=self.vm)
330 a26e5a4d Georgios D. Tsoukalas
        super(ServerMetadataAPITest, self).setUp()
331 039e3e61 Christos Stavrakakis
332 039e3e61 Christos Stavrakakis
    def test_get_metadata(self):
333 039e3e61 Christos Stavrakakis
        vm = self.vm
334 039e3e61 Christos Stavrakakis
        create_meta = lambda: mfactory.VirtualMachineMetadataFactory(vm=vm)
335 039e3e61 Christos Stavrakakis
        metadata = [create_meta(), create_meta(), create_meta()]
336 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d/metadata' % vm.id, vm.userid)
337 039e3e61 Christos Stavrakakis
        self.assertTrue(response.status_code in [200, 203])
338 2d04422f Christos Stavrakakis
        api_metadata = json.loads(response.content)['metadata']
339 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_metadata), len(metadata) + 1)
340 039e3e61 Christos Stavrakakis
        for db_m in metadata:
341 039e3e61 Christos Stavrakakis
            self.assertEqual(api_metadata[db_m.meta_key], db_m.meta_value)
342 039e3e61 Christos Stavrakakis
343 039e3e61 Christos Stavrakakis
        request = {'metadata':
344 039e3e61 Christos Stavrakakis
                        {'foo': 'bar'},
345 039e3e61 Christos Stavrakakis
                        metadata[0].meta_key: 'bar2'
346 039e3e61 Christos Stavrakakis
                  }
347 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/metadata' % vm.id,
348 2d04422f Christos Stavrakakis
                             vm.userid, json.dumps(request), 'json')
349 039e3e61 Christos Stavrakakis
        metadata2 = VirtualMachineMetadata.objects.filter(vm=vm)
350 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d/metadata' % vm.id, vm.userid)
351 039e3e61 Christos Stavrakakis
        self.assertTrue(response.status_code in [200, 203])
352 2d04422f Christos Stavrakakis
        api_metadata2 = json.loads(response.content)['metadata']
353 039e3e61 Christos Stavrakakis
        self.assertTrue('foo' in api_metadata2.keys())
354 039e3e61 Christos Stavrakakis
        self.assertTrue(api_metadata2[metadata[0].meta_key], 'bar2')
355 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_metadata2), len(metadata2))
356 039e3e61 Christos Stavrakakis
        for db_m in metadata2:
357 039e3e61 Christos Stavrakakis
            self.assertEqual(api_metadata2[db_m.meta_key], db_m.meta_value)
358 039e3e61 Christos Stavrakakis
359 039e3e61 Christos Stavrakakis
        # Create new meta
360 039e3e61 Christos Stavrakakis
        request = {'meta': {'foo2': 'bar2'}}
361 a26e5a4d Georgios D. Tsoukalas
        response = self.myput('servers/%d/metadata/foo2' % vm.id,
362 a26e5a4d Georgios D. Tsoukalas
                              vm.userid, json.dumps(request), 'json')
363 039e3e61 Christos Stavrakakis
364 039e3e61 Christos Stavrakakis
        # Get the new meta
365 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d/metadata/foo2' % vm.id, vm.userid)
366 039e3e61 Christos Stavrakakis
        meta = json.loads(response.content)['meta']
367 039e3e61 Christos Stavrakakis
        self.assertEqual(meta['foo2'], 'bar2')
368 039e3e61 Christos Stavrakakis
369 039e3e61 Christos Stavrakakis
        # Delete the new meta
370 a26e5a4d Georgios D. Tsoukalas
        response = self.mydelete('servers/%d/metadata/foo2' % vm.id, vm.userid)
371 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 204)
372 039e3e61 Christos Stavrakakis
373 039e3e61 Christos Stavrakakis
        # Try to get the deleted meta: should raise 404
374 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d/metadata/foo2' % vm.id, vm.userid)
375 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 404)
376 039e3e61 Christos Stavrakakis
377 039e3e61 Christos Stavrakakis
    def test_invalid_metadata(self):
378 039e3e61 Christos Stavrakakis
        vm = self.vm
379 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/metadata' % vm.id, vm.userid)
380 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
381 039e3e61 Christos Stavrakakis
        self.assertEqual(len(vm.metadata.all()), 1)
382 039e3e61 Christos Stavrakakis
383 039e3e61 Christos Stavrakakis
    def test_invalid_metadata_server(self):
384 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/42/metadata', 'user')
385 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
386 039e3e61 Christos Stavrakakis
387 039e3e61 Christos Stavrakakis
    def test_get_meta_invalid_key(self):
388 039e3e61 Christos Stavrakakis
        vm = self.vm
389 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d/metadata/foo2' % vm.id, vm.userid)
390 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
391 039e3e61 Christos Stavrakakis
392 039e3e61 Christos Stavrakakis
393 039e3e61 Christos Stavrakakis
@patch('synnefo.api.util.get_image')
394 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
395 a26e5a4d Georgios D. Tsoukalas
class ServerActionAPITest(ComputeAPITest):
396 039e3e61 Christos Stavrakakis
    def test_actions(self, mrapi, mimage):
397 039e3e61 Christos Stavrakakis
        actions = ['start', 'shutdown', 'reboot']
398 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
399 039e3e61 Christos Stavrakakis
        vm.operstate = "STOPPED"
400 039e3e61 Christos Stavrakakis
        vm.save()
401 41a7fae7 Christos Stavrakakis
        mrapi().StartupInstance.return_value = 0
402 41a7fae7 Christos Stavrakakis
        mrapi().ShutdownInstance.return_value = 1
403 41a7fae7 Christos Stavrakakis
        mrapi().RebootInstance.return_value = 2
404 41a7fae7 Christos Stavrakakis
        for jobId, action in enumerate(actions):
405 41a7fae7 Christos Stavrakakis
            if action in ["shutdown", "reboot"]:
406 41a7fae7 Christos Stavrakakis
                vm.operstate = "STARTED"
407 41a7fae7 Christos Stavrakakis
            else:
408 41a7fae7 Christos Stavrakakis
                vm.operstate = "STOPPED"
409 41a7fae7 Christos Stavrakakis
            vm.task = None
410 41a7fae7 Christos Stavrakakis
            vm.task_job_id = None
411 41a7fae7 Christos Stavrakakis
            vm.save()
412 039e3e61 Christos Stavrakakis
            val = {'type': 'HARD'} if action == 'reboot' else {}
413 039e3e61 Christos Stavrakakis
            request = {action: val}
414 a26e5a4d Georgios D. Tsoukalas
            response = self.mypost('servers/%d/action' % vm.id,
415 a26e5a4d Georgios D. Tsoukalas
                                   vm.userid, json.dumps(request), 'json')
416 039e3e61 Christos Stavrakakis
            self.assertEqual(response.status_code, 202)
417 039e3e61 Christos Stavrakakis
            if action == 'shutdown':
418 41a7fae7 Christos Stavrakakis
                self.assertEqual(VirtualMachine.objects.get(id=vm.id).task,
419 039e3e61 Christos Stavrakakis
                                 "STOP")
420 039e3e61 Christos Stavrakakis
            else:
421 41a7fae7 Christos Stavrakakis
                self.assertEqual(VirtualMachine.objects.get(id=vm.id).task,
422 039e3e61 Christos Stavrakakis
                                 action.upper())
423 41a7fae7 Christos Stavrakakis
            self.assertEqual(VirtualMachine.objects.get(id=vm.id).task_job_id,
424 41a7fae7 Christos Stavrakakis
                             jobId)
425 039e3e61 Christos Stavrakakis
426 039e3e61 Christos Stavrakakis
    def test_action_in_building_vm(self, mrapi, mimage):
427 039e3e61 Christos Stavrakakis
        """Test building in progress"""
428 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="BUILD")
429 41a7fae7 Christos Stavrakakis
        request = {'start': {}}
430 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
431 41a7fae7 Christos Stavrakakis
            response = self.mypost('/api/v1.1/servers/%d/action' % vm.id,
432 41a7fae7 Christos Stavrakakis
                                   vm.userid, json.dumps(request), 'json')
433 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 409)
434 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.mock_calls)
435 039e3e61 Christos Stavrakakis
436 039e3e61 Christos Stavrakakis
    def test_destroy_build_vm(self, mrapi, mimage):
437 039e3e61 Christos Stavrakakis
        """Test building in progress"""
438 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
439 41a7fae7 Christos Stavrakakis
        mrapi().DeleteInstance.return_value = 2
440 41a7fae7 Christos Stavrakakis
        response = self.mydelete('/api/v1.1/servers/%d' % vm.id,
441 41a7fae7 Christos Stavrakakis
                                 vm.userid)
442 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
443 039e3e61 Christos Stavrakakis
        mrapi().RemoveInstance.assert_called_once()
444 039e3e61 Christos Stavrakakis
445 039e3e61 Christos Stavrakakis
    def test_firewall(self, mrapi, mimage):
446 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
447 039e3e61 Christos Stavrakakis
        vm.operstate = "STOPPED"
448 039e3e61 Christos Stavrakakis
        vm.save()
449 039e3e61 Christos Stavrakakis
        request = {'firewallProfile': {'profile': 'PROTECTED'}}
450 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/action' % vm.id,
451 a26e5a4d Georgios D. Tsoukalas
                               vm.userid, json.dumps(request), 'json')
452 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
453 039e3e61 Christos Stavrakakis
        mrapi().ModifyInstance.assert_called_once()
454 039e3e61 Christos Stavrakakis
455 039e3e61 Christos Stavrakakis
    def test_unsupported_firewall(self, mrapi, mimage):
456 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
457 039e3e61 Christos Stavrakakis
        vm.operstate = "STOPPED"
458 039e3e61 Christos Stavrakakis
        vm.save()
459 039e3e61 Christos Stavrakakis
        request = {'firewallProfile': {'profile': 'FOO'}}
460 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/action' % vm.id,
461 a26e5a4d Georgios D. Tsoukalas
                               vm.userid, json.dumps(request), 'json')
462 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
463 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.mock_calls)
464 039e3e61 Christos Stavrakakis
465 1af851fd Christos Stavrakakis
    def test_resize_vm(self, mrapi, mimage):
466 1af851fd Christos Stavrakakis
        flavor = mfactory.FlavorFactory(cpu=1, ram=1024)
467 1af851fd Christos Stavrakakis
        # Check building VM
468 1af851fd Christos Stavrakakis
        vm = self.get_vm(flavor=flavor, operstate="BUILD")
469 1af851fd Christos Stavrakakis
        request = {'resize': {'flavorRef': flavor.id}}
470 1af851fd Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
471 1af851fd Christos Stavrakakis
                             vm.userid, json.dumps(request), 'json')
472 1af851fd Christos Stavrakakis
        self.assertFault(response, 409, "buildInProgress")
473 1af851fd Christos Stavrakakis
        # Check same Flavor
474 1af851fd Christos Stavrakakis
        vm = self.get_vm(flavor=flavor, operstate="STOPPED")
475 1af851fd Christos Stavrakakis
        request = {'resize': {'flavorRef': flavor.id}}
476 1af851fd Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
477 1af851fd Christos Stavrakakis
                             vm.userid, json.dumps(request), 'json')
478 41a7fae7 Christos Stavrakakis
        self.assertBadRequest(response)
479 1af851fd Christos Stavrakakis
        # Check flavor with different disk
480 1af851fd Christos Stavrakakis
        flavor2 = mfactory.FlavorFactory(disk=1024)
481 1af851fd Christos Stavrakakis
        flavor3 = mfactory.FlavorFactory(disk=2048)
482 1af851fd Christos Stavrakakis
        vm = self.get_vm(flavor=flavor2, operstate="STOPPED")
483 1af851fd Christos Stavrakakis
        request = {'resize': {'flavorRef': flavor3.id}}
484 1af851fd Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
485 1af851fd Christos Stavrakakis
                             vm.userid, json.dumps(request), 'json')
486 1af851fd Christos Stavrakakis
        self.assertBadRequest(response)
487 1af851fd Christos Stavrakakis
        flavor2 = mfactory.FlavorFactory(disk_template="foo")
488 1af851fd Christos Stavrakakis
        flavor3 = mfactory.FlavorFactory(disk_template="baz")
489 1af851fd Christos Stavrakakis
        vm = self.get_vm(flavor=flavor2, operstate="STOPPED")
490 1af851fd Christos Stavrakakis
        request = {'resize': {'flavorRef': flavor3.id}}
491 1af851fd Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
492 1af851fd Christos Stavrakakis
                             vm.userid, json.dumps(request), 'json')
493 1af851fd Christos Stavrakakis
        self.assertBadRequest(response)
494 1af851fd Christos Stavrakakis
        # Check success
495 1af851fd Christos Stavrakakis
        vm = self.get_vm(flavor=flavor, operstate="STOPPED")
496 1af851fd Christos Stavrakakis
        flavor4 = mfactory.FlavorFactory(disk_template=flavor.disk_template,
497 1af851fd Christos Stavrakakis
                                         disk=flavor.disk,
498 1af851fd Christos Stavrakakis
                                         cpu=4, ram=2048)
499 1af851fd Christos Stavrakakis
        request = {'resize': {'flavorRef': flavor4.id}}
500 1af851fd Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
501 1af851fd Christos Stavrakakis
        response = self.post('/api/v1.1/servers/%d/action' % vm.id,
502 1af851fd Christos Stavrakakis
                             vm.userid, json.dumps(request), 'json')
503 1af851fd Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
504 1af851fd Christos Stavrakakis
        vm = VirtualMachine.objects.get(id=vm.id)
505 41a7fae7 Christos Stavrakakis
        self.assertEqual(vm.task_job_id, 42)
506 1af851fd Christos Stavrakakis
        name, args, kwargs = mrapi().ModifyInstance.mock_calls[0]
507 1af851fd Christos Stavrakakis
        self.assertEqual(kwargs["beparams"]["vcpus"], 4)
508 1af851fd Christos Stavrakakis
        self.assertEqual(kwargs["beparams"]["minmem"], 2048)
509 1af851fd Christos Stavrakakis
        self.assertEqual(kwargs["beparams"]["maxmem"], 2048)
510 1af851fd Christos Stavrakakis
511 41a7fae7 Christos Stavrakakis
    def test_action_on_resizing_vm(self, mrapi, mimage):
512 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
513 41a7fae7 Christos Stavrakakis
        vm.operstate = "RESIZE"
514 41a7fae7 Christos Stavrakakis
        vm.save()
515 41a7fae7 Christos Stavrakakis
        for action in VirtualMachine.ACTIONS:
516 41a7fae7 Christos Stavrakakis
            request = {action[0]: ""}
517 41a7fae7 Christos Stavrakakis
            response = self.post('/api/v1.1/servers/%d/action' % vm.id,
518 41a7fae7 Christos Stavrakakis
                                 vm.userid, json.dumps(request), 'json')
519 41a7fae7 Christos Stavrakakis
            self.assertBadRequest(response)
520 41a7fae7 Christos Stavrakakis
        # however you can destroy
521 41a7fae7 Christos Stavrakakis
        mrapi().DeleteInstance.return_value = 42
522 41a7fae7 Christos Stavrakakis
        response = self.delete('/api/v1.1/servers/%d' % vm.id,
523 41a7fae7 Christos Stavrakakis
                               vm.userid)
524 41a7fae7 Christos Stavrakakis
        self.assertSuccess(response)
525 41a7fae7 Christos Stavrakakis
526 1af851fd Christos Stavrakakis
    def get_vm(self, flavor, operstate):
527 1af851fd Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(flavor=flavor)
528 1af851fd Christos Stavrakakis
        vm.operstate = operstate
529 1af851fd Christos Stavrakakis
        vm.backendjobstatus = "success"
530 1af851fd Christos Stavrakakis
        vm.save()
531 1af851fd Christos Stavrakakis
        return vm
532 1af851fd Christos Stavrakakis
533 039e3e61 Christos Stavrakakis
534 a26e5a4d Georgios D. Tsoukalas
class ServerVNCConsole(ComputeAPITest):
535 039e3e61 Christos Stavrakakis
    def test_not_active_server(self):
536 039e3e61 Christos Stavrakakis
        """Test console req for not ACTIVE server returns badRequest"""
537 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="BUILD")
538 039e3e61 Christos Stavrakakis
        data = json.dumps({'console': {'type': 'vnc'}})
539 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/action' % vm.id,
540 a26e5a4d Georgios D. Tsoukalas
                               vm.userid, data, 'json')
541 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
542 039e3e61 Christos Stavrakakis
543 039e3e61 Christos Stavrakakis
    def test_active_server(self):
544 039e3e61 Christos Stavrakakis
        """Test console req for ACTIVE server"""
545 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
546 039e3e61 Christos Stavrakakis
        vm.operstate = 'STARTED'
547 039e3e61 Christos Stavrakakis
        vm.save()
548 039e3e61 Christos Stavrakakis
549 039e3e61 Christos Stavrakakis
        data = json.dumps({'console': {'type': 'vnc'}})
550 41a7fae7 Christos Stavrakakis
        with override_settings(settings, TEST=True):
551 41a7fae7 Christos Stavrakakis
            response = self.mypost('/api/v1.1/servers/%d/action' % vm.id,
552 41a7fae7 Christos Stavrakakis
                                   vm.userid, data, 'json')
553 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 200)
554 039e3e61 Christos Stavrakakis
        reply = json.loads(response.content)
555 039e3e61 Christos Stavrakakis
        self.assertEqual(reply.keys(), ['console'])
556 039e3e61 Christos Stavrakakis
        console = reply['console']
557 039e3e61 Christos Stavrakakis
        self.assertEqual(console['type'], 'vnc')
558 039e3e61 Christos Stavrakakis
        self.assertEqual(set(console.keys()),
559 039e3e61 Christos Stavrakakis
                         set(['type', 'host', 'port', 'password']))
560 039e3e61 Christos Stavrakakis
561 039e3e61 Christos Stavrakakis
    def test_wrong_console_type(self):
562 039e3e61 Christos Stavrakakis
        """Test console req for ACTIVE server"""
563 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
564 039e3e61 Christos Stavrakakis
        vm.operstate = 'STARTED'
565 039e3e61 Christos Stavrakakis
        vm.save()
566 039e3e61 Christos Stavrakakis
567 039e3e61 Christos Stavrakakis
        data = json.dumps({'console': {'type': 'foo'}})
568 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/action' % vm.id,
569 a26e5a4d Georgios D. Tsoukalas
                               vm.userid, data, 'json')
570 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)