Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / tests / servers.py @ ba777b02

History | View | Annotate | Download (37.5 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 cb66110b Christos Stavrakakis
from copy import deepcopy
36 039e3e61 Christos Stavrakakis
37 41a7fae7 Christos Stavrakakis
from snf_django.utils.testing import (BaseAPITest, mocked_quotaholder,
38 41a7fae7 Christos Stavrakakis
                                      override_settings)
39 816d7588 Christos Stavrakakis
from synnefo.db.models import (VirtualMachine, VirtualMachineMetadata,
40 99988465 Christos Stavrakakis
                               IPAddress, NetworkInterface)
41 039e3e61 Christos Stavrakakis
from synnefo.db import models_factory as mfactory
42 039e3e61 Christos Stavrakakis
from synnefo.logic.utils import get_rsapi_state
43 a26e5a4d Georgios D. Tsoukalas
from synnefo.cyclades_settings import cyclades_services
44 a26e5a4d Georgios D. Tsoukalas
from synnefo.lib.services import get_service_path
45 a26e5a4d Georgios D. Tsoukalas
from synnefo.lib import join_urls
46 7e82ac17 Christos Stavrakakis
from django.conf import settings
47 f2080d16 Christos Stavrakakis
from synnefo.logic.rapi import GanetiApiError
48 039e3e61 Christos Stavrakakis
49 816d7588 Christos Stavrakakis
from mock import patch, Mock
50 039e3e61 Christos Stavrakakis
51 039e3e61 Christos Stavrakakis
52 a26e5a4d Georgios D. Tsoukalas
class ComputeAPITest(BaseAPITest):
53 2cd55da6 Christos Stavrakakis
    def __init__(self, *args, **kwargs):
54 2cd55da6 Christos Stavrakakis
        super(ComputeAPITest, self).__init__(*args, **kwargs)
55 a26e5a4d Georgios D. Tsoukalas
        self.compute_path = get_service_path(cyclades_services, 'compute',
56 a26e5a4d Georgios D. Tsoukalas
                                             version='v2.0')
57 41a7fae7 Christos Stavrakakis
58 a26e5a4d Georgios D. Tsoukalas
    def myget(self, path, *args, **kwargs):
59 a26e5a4d Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
60 a26e5a4d Georgios D. Tsoukalas
        return self.get(path, *args, **kwargs)
61 a26e5a4d Georgios D. Tsoukalas
62 a26e5a4d Georgios D. Tsoukalas
    def myput(self, path, *args, **kwargs):
63 a26e5a4d Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
64 a26e5a4d Georgios D. Tsoukalas
        return self.put(path, *args, **kwargs)
65 a26e5a4d Georgios D. Tsoukalas
66 a26e5a4d Georgios D. Tsoukalas
    def mypost(self, path, *args, **kwargs):
67 a26e5a4d Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
68 a26e5a4d Georgios D. Tsoukalas
        return self.post(path, *args, **kwargs)
69 a26e5a4d Georgios D. Tsoukalas
70 a26e5a4d Georgios D. Tsoukalas
    def mydelete(self, path, *args, **kwargs):
71 a26e5a4d Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
72 a26e5a4d Georgios D. Tsoukalas
        return self.delete(path, *args, **kwargs)
73 a26e5a4d Georgios D. Tsoukalas
74 a26e5a4d Georgios D. Tsoukalas
75 a26e5a4d Georgios D. Tsoukalas
class ServerAPITest(ComputeAPITest):
76 039e3e61 Christos Stavrakakis
    def setUp(self):
77 039e3e61 Christos Stavrakakis
        self.user1 = 'user1'
78 039e3e61 Christos Stavrakakis
        self.user2 = 'user2'
79 039e3e61 Christos Stavrakakis
        self.vm1 = mfactory.VirtualMachineFactory(userid=self.user1)
80 039e3e61 Christos Stavrakakis
        self.vm2 = mfactory.VirtualMachineFactory(userid=self.user2)
81 039e3e61 Christos Stavrakakis
        self.vm3 = mfactory.VirtualMachineFactory(deleted=True,
82 039e3e61 Christos Stavrakakis
                                                  userid=self.user1)
83 039e3e61 Christos Stavrakakis
        self.vm4 = mfactory.VirtualMachineFactory(userid=self.user2)
84 039e3e61 Christos Stavrakakis
85 039e3e61 Christos Stavrakakis
    def test_server_list_1(self):
86 039e3e61 Christos Stavrakakis
        """Test if the expected list of servers is returned."""
87 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers')
88 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
89 2d04422f Christos Stavrakakis
        servers = json.loads(response.content)['servers']
90 039e3e61 Christos Stavrakakis
        self.assertEqual(servers, [])
91 039e3e61 Christos Stavrakakis
92 039e3e61 Christos Stavrakakis
    def test_server_list_2(self):
93 039e3e61 Christos Stavrakakis
        """Test if the expected list of servers is returned."""
94 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers', self.user1)
95 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
96 2d04422f Christos Stavrakakis
        servers = json.loads(response.content)['servers']
97 039e3e61 Christos Stavrakakis
        db_server = self.vm1
98 1b696c26 Christos Stavrakakis
        server = servers[0]
99 1b696c26 Christos Stavrakakis
        self.assertEqual(server["name"], db_server.name)
100 1b696c26 Christos Stavrakakis
        self.assertEqual(server["id"], db_server.id)
101 039e3e61 Christos Stavrakakis
102 039e3e61 Christos Stavrakakis
    def test_server_list_detail(self):
103 039e3e61 Christos Stavrakakis
        """Test if the servers list details are returned."""
104 039e3e61 Christos Stavrakakis
        user = self.user2
105 039e3e61 Christos Stavrakakis
        user_vms = {self.vm2.id: self.vm2,
106 039e3e61 Christos Stavrakakis
                    self.vm4.id: self.vm4}
107 039e3e61 Christos Stavrakakis
108 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/detail', user)
109 2d04422f Christos Stavrakakis
        servers = json.loads(response.content)['servers']
110 039e3e61 Christos Stavrakakis
        self.assertEqual(len(servers), len(user_vms))
111 039e3e61 Christos Stavrakakis
        for api_vm in servers:
112 039e3e61 Christos Stavrakakis
            db_vm = user_vms[api_vm['id']]
113 1b696c26 Christos Stavrakakis
            self.assertEqual(api_vm['flavor']["id"], db_vm.flavor.id)
114 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['hostId'], db_vm.hostid)
115 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['id'], db_vm.id)
116 1b696c26 Christos Stavrakakis
            self.assertEqual(api_vm['image']["id"], db_vm.imageid)
117 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['name'], db_vm.name)
118 039e3e61 Christos Stavrakakis
            self.assertEqual(api_vm['status'], get_rsapi_state(db_vm))
119 039e3e61 Christos Stavrakakis
            self.assertSuccess(response)
120 039e3e61 Christos Stavrakakis
121 039e3e61 Christos Stavrakakis
    def test_server_detail(self):
122 039e3e61 Christos Stavrakakis
        """Test if a server details are returned."""
123 039e3e61 Christos Stavrakakis
        db_vm = self.vm2
124 039e3e61 Christos Stavrakakis
        user = self.vm2.userid
125 92d2d1ce Christos Stavrakakis
        ip4 = mfactory.IPv4AddressFactory(nic__machine=self.vm2)
126 92d2d1ce Christos Stavrakakis
        nic = ip4.nic
127 92d2d1ce Christos Stavrakakis
        net = ip4.network
128 92d2d1ce Christos Stavrakakis
        ip6 = mfactory.IPv6AddressFactory(nic=nic, network=net)
129 92d2d1ce Christos Stavrakakis
        nic.mac = "aa:00:11:22:33:44"
130 92d2d1ce Christos Stavrakakis
        nic.save()
131 039e3e61 Christos Stavrakakis
132 039e3e61 Christos Stavrakakis
        db_vm_meta = mfactory.VirtualMachineMetadataFactory(vm=db_vm)
133 039e3e61 Christos Stavrakakis
134 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d' % db_vm.id, user)
135 039e3e61 Christos Stavrakakis
        server = json.loads(response.content)['server']
136 039e3e61 Christos Stavrakakis
137 1b696c26 Christos Stavrakakis
        self.assertEqual(server['flavor']["id"], db_vm.flavor.id)
138 039e3e61 Christos Stavrakakis
        self.assertEqual(server['hostId'], db_vm.hostid)
139 039e3e61 Christos Stavrakakis
        self.assertEqual(server['id'], db_vm.id)
140 1b696c26 Christos Stavrakakis
        self.assertEqual(server['image']["id"], db_vm.imageid)
141 039e3e61 Christos Stavrakakis
        self.assertEqual(server['name'], db_vm.name)
142 039e3e61 Christos Stavrakakis
        self.assertEqual(server['status'], get_rsapi_state(db_vm))
143 2d04422f Christos Stavrakakis
        api_nic = server['attachments'][0]
144 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['network_id'], str(net.id))
145 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['mac_address'], nic.mac)
146 039e3e61 Christos Stavrakakis
        self.assertEqual(api_nic['firewallProfile'], nic.firewall_profile)
147 92d2d1ce Christos Stavrakakis
        self.assertEqual(api_nic['ipv4'], ip4.address)
148 92d2d1ce Christos Stavrakakis
        self.assertEqual(api_nic['ipv6'], ip6.address)
149 e368ad39 Christos Stavrakakis
        self.assertEqual(api_nic['OS-EXT-IPS:type'], "fixed")
150 c988fcca Christos Stavrakakis
        self.assertEqual(api_nic['id'], nic.id)
151 1f638a85 Christos Stavrakakis
        api_address = server["addresses"]
152 e368ad39 Christos Stavrakakis
        self.assertEqual(api_address[str(net.id)], [
153 92d2d1ce Christos Stavrakakis
            {"version": 4, "addr": ip4.address, "OS-EXT-IPS:type": "fixed"},
154 92d2d1ce Christos Stavrakakis
            {"version": 6, "addr": ip6.address, "OS-EXT-IPS:type": "fixed"}
155 e368ad39 Christos Stavrakakis
        ])
156 039e3e61 Christos Stavrakakis
157 2d04422f Christos Stavrakakis
        metadata = server['metadata']
158 039e3e61 Christos Stavrakakis
        self.assertEqual(len(metadata), 1)
159 039e3e61 Christos Stavrakakis
        self.assertEqual(metadata[db_vm_meta.meta_key], db_vm_meta.meta_value)
160 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
161 039e3e61 Christos Stavrakakis
162 7e82ac17 Christos Stavrakakis
    def test_server_fqdn(self):
163 7e82ac17 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
164 9cec0c17 Christos Stavrakakis
        # Setting set to None
165 b3a43976 Christos Stavrakakis
        with override_settings(settings,
166 9cec0c17 Christos Stavrakakis
                               CYCLADES_SERVERS_FQDN=None):
167 b3a43976 Christos Stavrakakis
            response = self.myget("servers/%d" % vm.id, vm.userid)
168 b3a43976 Christos Stavrakakis
            server = json.loads(response.content)['server']
169 9cec0c17 Christos Stavrakakis
            self.assertEqual(server["SNF:fqdn"], None)
170 9cec0c17 Christos Stavrakakis
        # Unformated setting
171 7e82ac17 Christos Stavrakakis
        with override_settings(settings,
172 7e82ac17 Christos Stavrakakis
                               CYCLADES_SERVERS_FQDN="vm.example.org"):
173 7e82ac17 Christos Stavrakakis
            response = self.myget("servers/%d" % vm.id, vm.userid)
174 7e82ac17 Christos Stavrakakis
            server = json.loads(response.content)['server']
175 7e82ac17 Christos Stavrakakis
            self.assertEqual(server["SNF:fqdn"], "vm.example.org")
176 9cec0c17 Christos Stavrakakis
        # Formatted settings
177 e368ad39 Christos Stavrakakis
        with override_settings(settings, CYCLADES_SERVERS_FQDN=
178 e368ad39 Christos Stavrakakis
                               "snf-%(id)s.vm.example.org"):
179 7e82ac17 Christos Stavrakakis
            response = self.myget("servers/%d" % vm.id, vm.userid)
180 7e82ac17 Christos Stavrakakis
            server = json.loads(response.content)['server']
181 e368ad39 Christos Stavrakakis
            self.assertEqual(server["SNF:fqdn"],
182 e368ad39 Christos Stavrakakis
                             "snf-%d.vm.example.org" % vm.id)
183 7e82ac17 Christos Stavrakakis
        with override_settings(settings,
184 e368ad39 Christos Stavrakakis
                               CYCLADES_SERVERS_FQDN=
185 e368ad39 Christos Stavrakakis
                               "snf-%(id)s.vm-%(id)s.example.org"):
186 7e82ac17 Christos Stavrakakis
            response = self.myget("servers/%d" % vm.id, vm.userid)
187 7e82ac17 Christos Stavrakakis
            server = json.loads(response.content)['server']
188 7e82ac17 Christos Stavrakakis
            self.assertEqual(server["SNF:fqdn"], "snf-%d.vm-%d.example.org" %
189 7e82ac17 Christos Stavrakakis
                             (vm.id, vm.id))
190 e08afd0b Christos Stavrakakis
191 2522e489 Christos Stavrakakis
    def test_server_port_forwarding(self):
192 2522e489 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
193 b3a43976 Christos Stavrakakis
        # test None if the server has no public IP
194 2522e489 Christos Stavrakakis
        ports = {
195 2522e489 Christos Stavrakakis
            22: ("foo", 61000),
196 2522e489 Christos Stavrakakis
            80: lambda ip, id, fqdn, user: ("bar", 61001)}
197 2522e489 Christos Stavrakakis
        with override_settings(settings,
198 2522e489 Christos Stavrakakis
                               CYCLADES_PORT_FORWARDING=ports):
199 2522e489 Christos Stavrakakis
            response = self.myget("servers/%d" % vm.id, vm.userid)
200 b3a43976 Christos Stavrakakis
        server = json.loads(response.content)['server']
201 b3a43976 Christos Stavrakakis
        self.assertEqual(server["SNF:port_forwarding"], {})
202 b3a43976 Christos Stavrakakis
203 b3a43976 Christos Stavrakakis
        # Add with public IP
204 b3a43976 Christos Stavrakakis
        mfactory.IPv4AddressFactory(nic__machine=vm, network__public=True)
205 b3a43976 Christos Stavrakakis
        with override_settings(settings,
206 b3a43976 Christos Stavrakakis
                               CYCLADES_PORT_FORWARDING=ports):
207 b3a43976 Christos Stavrakakis
            response = self.myget("servers/%d" % vm.id, vm.userid)
208 b3a43976 Christos Stavrakakis
        server = json.loads(response.content)['server']
209 b3a43976 Christos Stavrakakis
        self.assertEqual(server["SNF:port_forwarding"],
210 b3a43976 Christos Stavrakakis
                         {"22": {"host": "foo", "port": "61000"},
211 b3a43976 Christos Stavrakakis
                          "80": {"host": "bar", "port": "61001"}})
212 2522e489 Christos Stavrakakis
213 2522e489 Christos Stavrakakis
        def _port_from_ip(ip, base):
214 2522e489 Christos Stavrakakis
            fields = ip.split('.', 4)
215 2522e489 Christos Stavrakakis
            return (base + 256*int(fields[2]) + int(fields[3]))
216 2522e489 Christos Stavrakakis
217 2522e489 Christos Stavrakakis
        ports = {
218 2522e489 Christos Stavrakakis
            22: lambda ip, id, fqdn, user:
219 2522e489 Christos Stavrakakis
            ip and ("gate", _port_from_ip(ip, 10000)) or None}
220 e08afd0b Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
221 2522e489 Christos Stavrakakis
        with override_settings(settings,
222 2522e489 Christos Stavrakakis
                               CYCLADES_PORT_FORWARDING=ports):
223 2522e489 Christos Stavrakakis
            response = self.myget("servers/%d" % vm.id, vm.userid)
224 2522e489 Christos Stavrakakis
            server = json.loads(response.content)['server']
225 2522e489 Christos Stavrakakis
            self.assertEqual(server["SNF:port_forwarding"], {})
226 2522e489 Christos Stavrakakis
227 92d2d1ce Christos Stavrakakis
        mfactory.IPv4AddressFactory(nic__machine=vm,
228 92d2d1ce Christos Stavrakakis
                                    network__public=True,
229 92d2d1ce Christos Stavrakakis
                                    address="192.168.2.2")
230 2522e489 Christos Stavrakakis
        with override_settings(settings,
231 2522e489 Christos Stavrakakis
                               CYCLADES_PORT_FORWARDING=ports):
232 2522e489 Christos Stavrakakis
            response = self.myget("servers/%d" % vm.id, vm.userid)
233 2522e489 Christos Stavrakakis
            server = json.loads(response.content)['server']
234 2522e489 Christos Stavrakakis
            self.assertEqual(server["SNF:port_forwarding"],
235 2522e489 Christos Stavrakakis
                             {"22": {"host": "gate", "port": "10514"}})
236 2522e489 Christos Stavrakakis
237 939d71dd Christos Stavrakakis
    def test_server_building_nics(self):
238 939d71dd Christos Stavrakakis
        db_vm = self.vm2
239 939d71dd Christos Stavrakakis
        user = self.vm2.userid
240 939d71dd Christos Stavrakakis
        net1 = mfactory.NetworkFactory()
241 939d71dd Christos Stavrakakis
        net2 = mfactory.NetworkFactory()
242 939d71dd Christos Stavrakakis
        net3 = mfactory.NetworkFactory()
243 939d71dd Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net1,
244 3a6be177 Christos Stavrakakis
                                         state="BUILD")
245 939d71dd Christos Stavrakakis
        nic2 = mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net2,
246 939d71dd Christos Stavrakakis
                                                state="ACTIVE")
247 939d71dd Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net3,
248 3a6be177 Christos Stavrakakis
                                         state="BUILD")
249 939d71dd Christos Stavrakakis
250 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d' % db_vm.id, user)
251 939d71dd Christos Stavrakakis
        server = json.loads(response.content)['server']
252 2d04422f Christos Stavrakakis
        nics = server["attachments"]
253 939d71dd Christos Stavrakakis
        self.assertEqual(len(nics), 1)
254 939d71dd Christos Stavrakakis
        self.assertEqual(nics[0]["network_id"], str(nic2.network_id))
255 939d71dd Christos Stavrakakis
256 039e3e61 Christos Stavrakakis
    def test_noauthorized(self):
257 039e3e61 Christos Stavrakakis
        """Test 404 for detail of other user vm"""
258 039e3e61 Christos Stavrakakis
        db_vm = self.vm2
259 039e3e61 Christos Stavrakakis
260 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d' % db_vm.id, 'wrong_user')
261 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
262 039e3e61 Christos Stavrakakis
263 039e3e61 Christos Stavrakakis
    def test_wrong_server(self):
264 039e3e61 Christos Stavrakakis
        """Test 404 response if server does not exist."""
265 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d' % 5000)
266 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
267 039e3e61 Christos Stavrakakis
268 039e3e61 Christos Stavrakakis
    def test_create_server_empty(self):
269 039e3e61 Christos Stavrakakis
        """Test if the create server call returns a 400 badRequest if
270 039e3e61 Christos Stavrakakis
           no attributes are specified."""
271 039e3e61 Christos Stavrakakis
272 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers', params={})
273 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
274 039e3e61 Christos Stavrakakis
275 039e3e61 Christos Stavrakakis
    def test_rename_server(self):
276 039e3e61 Christos Stavrakakis
        vm = self.vm2
277 039e3e61 Christos Stavrakakis
        request = {'server': {'name': 'new_name'}}
278 a26e5a4d Georgios D. Tsoukalas
        response = self.myput('servers/%d' % vm.id, vm.userid,
279 a26e5a4d Georgios D. Tsoukalas
                              json.dumps(request), 'json')
280 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
281 039e3e61 Christos Stavrakakis
        self.assertEqual(VirtualMachine.objects.get(id=vm.id).name, "new_name")
282 039e3e61 Christos Stavrakakis
283 a3accf03 Georgios D. Tsoukalas
    def test_catch_wrong_api_paths(self):
284 a3accf03 Georgios D. Tsoukalas
        response = self.myget('nonexistent')
285 a3accf03 Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
286 a3accf03 Georgios D. Tsoukalas
        try:
287 e368ad39 Christos Stavrakakis
            json.loads(response.content)
288 a3accf03 Georgios D. Tsoukalas
        except ValueError:
289 a3accf03 Georgios D. Tsoukalas
            self.assertTrue(False)
290 a3accf03 Georgios D. Tsoukalas
291 16437e4d Kostas Papadimitriou
    def test_method_not_allowed(self, *args):
292 16437e4d Kostas Papadimitriou
        # /servers/ allows only POST, GET
293 16437e4d Kostas Papadimitriou
        response = self.myput('servers', '', '')
294 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
295 16437e4d Kostas Papadimitriou
        response = self.mydelete('servers')
296 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
297 16437e4d Kostas Papadimitriou
298 16437e4d Kostas Papadimitriou
        # /servers/<srvid>/ allows only GET, PUT, DELETE
299 16437e4d Kostas Papadimitriou
        response = self.mypost("servers/42")
300 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
301 16437e4d Kostas Papadimitriou
302 16437e4d Kostas Papadimitriou
        # /imags/<srvid>/metadata/ allows only POST, GET
303 16437e4d Kostas Papadimitriou
        response = self.myput('servers/42/metadata', '', '')
304 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
305 16437e4d Kostas Papadimitriou
        response = self.mydelete('servers/42/metadata')
306 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
307 16437e4d Kostas Papadimitriou
308 16437e4d Kostas Papadimitriou
        # /imags/<srvid>/metadata/ allows only POST, GET
309 16437e4d Kostas Papadimitriou
        response = self.myput('servers/42/metadata', '', '')
310 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
311 16437e4d Kostas Papadimitriou
        response = self.mydelete('servers/42/metadata')
312 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
313 16437e4d Kostas Papadimitriou
314 16437e4d Kostas Papadimitriou
        # /imags/<srvid>/metadata/<key> allows only PUT, GET, DELETE
315 16437e4d Kostas Papadimitriou
        response = self.mypost('servers/42/metadata/foo')
316 16437e4d Kostas Papadimitriou
        self.assertMethodNotAllowed(response)
317 16437e4d Kostas Papadimitriou
318 cb66110b Christos Stavrakakis
fixed_image = Mock()
319 cb66110b Christos Stavrakakis
fixed_image.return_value = {'location': 'pithos://foo',
320 cb66110b Christos Stavrakakis
                            'checksum': '1234',
321 cb66110b Christos Stavrakakis
                            "id": 1,
322 cb66110b Christos Stavrakakis
                            "name": "test_image",
323 dfcece01 Christos Stavrakakis
                            "size": "41242",
324 cb66110b Christos Stavrakakis
                            'disk_format': 'diskdump'}
325 cb66110b Christos Stavrakakis
326 cb66110b Christos Stavrakakis
327 cb66110b Christos Stavrakakis
@patch('synnefo.api.util.get_image', fixed_image)
328 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
329 a26e5a4d Georgios D. Tsoukalas
class ServerCreateAPITest(ComputeAPITest):
330 cb66110b Christos Stavrakakis
    def setUp(self):
331 cb66110b Christos Stavrakakis
        self.flavor = mfactory.FlavorFactory()
332 cb66110b Christos Stavrakakis
        self.backend = mfactory.BackendFactory()
333 cb66110b Christos Stavrakakis
        self.request = {
334 e368ad39 Christos Stavrakakis
            "server": {
335 e368ad39 Christos Stavrakakis
                "name": "new-server-test",
336 e368ad39 Christos Stavrakakis
                "userid": "test_user",
337 e368ad39 Christos Stavrakakis
                "imageRef": 1,
338 e368ad39 Christos Stavrakakis
                "flavorRef": self.flavor.id,
339 e368ad39 Christos Stavrakakis
                "metadata": {
340 e368ad39 Christos Stavrakakis
                    "My Server Name": "Apache1"
341 e368ad39 Christos Stavrakakis
                },
342 e368ad39 Christos Stavrakakis
                "personality": []
343 e368ad39 Christos Stavrakakis
            }
344 039e3e61 Christos Stavrakakis
        }
345 3aecadc8 Christos Stavrakakis
        # Create dummy public IPv6 network
346 3aecadc8 Christos Stavrakakis
        sub6 = mfactory.IPv6SubnetFactory(network__public=True)
347 3aecadc8 Christos Stavrakakis
        self.net6 = sub6.network
348 3aecadc8 Christos Stavrakakis
        self.network_settings = {
349 3aecadc8 Christos Stavrakakis
            "CYCLADES_DEFAULT_SERVER_NETWORKS": [],
350 3aecadc8 Christos Stavrakakis
            "CYCLADES_FORCED_SERVER_NETWORKS": ["SNF:ANY_PUBLIC_IPV6"]
351 3aecadc8 Christos Stavrakakis
        }
352 cb66110b Christos Stavrakakis
353 cb66110b Christos Stavrakakis
    def test_create_server(self, mrapi):
354 cb66110b Christos Stavrakakis
        """Test if the create server call returns the expected response
355 cb66110b Christos Stavrakakis
           if a valid request has been speficied."""
356 cb66110b Christos Stavrakakis
357 cb66110b Christos Stavrakakis
        mrapi().CreateInstance.return_value = 12
358 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **self.network_settings):
359 cb66110b Christos Stavrakakis
            with mocked_quotaholder():
360 2cd55da6 Christos Stavrakakis
                response = self.mypost('servers', 'test_user',
361 cb66110b Christos Stavrakakis
                                       json.dumps(self.request), 'json')
362 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
363 039e3e61 Christos Stavrakakis
        mrapi().CreateInstance.assert_called_once()
364 039e3e61 Christos Stavrakakis
365 039e3e61 Christos Stavrakakis
        api_server = json.loads(response.content)['server']
366 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['status'], "BUILD")
367 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['progress'], 0)
368 2d04422f Christos Stavrakakis
        self.assertEqual(api_server['metadata'],
369 e368ad39 Christos Stavrakakis
                         {"My Server Name":  "Apache1"})
370 039e3e61 Christos Stavrakakis
        self.assertTrue('adminPass' in api_server)
371 039e3e61 Christos Stavrakakis
372 039e3e61 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(userid='test_user')
373 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['name'], db_vm.name)
374 039e3e61 Christos Stavrakakis
        self.assertEqual(api_server['status'], db_vm.operstate)
375 039e3e61 Christos Stavrakakis
376 62b76f38 Christos Stavrakakis
    def test_create_server_wrong_flavor(self, mrapi):
377 62b76f38 Christos Stavrakakis
        # Test with a flavor that does not exist
378 99988465 Christos Stavrakakis
        request = deepcopy(self.request)
379 3aecadc8 Christos Stavrakakis
        request["server"]["flavorRef"] = 42
380 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **self.network_settings):
381 3aecadc8 Christos Stavrakakis
            with mocked_quotaholder():
382 3aecadc8 Christos Stavrakakis
                response = self.mypost('servers', 'test_user',
383 3aecadc8 Christos Stavrakakis
                                       json.dumps(request), 'json')
384 3aecadc8 Christos Stavrakakis
        self.assertItemNotFound(response)
385 3aecadc8 Christos Stavrakakis
386 62b76f38 Christos Stavrakakis
        # Test with an flavor that is not allowed
387 62b76f38 Christos Stavrakakis
        flavor = mfactory.FlavorFactory(allow_create=False)
388 62b76f38 Christos Stavrakakis
        request["server"]["flavorRef"] = flavor.id
389 62b76f38 Christos Stavrakakis
        with override_settings(settings, **self.network_settings):
390 62b76f38 Christos Stavrakakis
            with mocked_quotaholder():
391 62b76f38 Christos Stavrakakis
                response = self.mypost('servers', 'test_user',
392 62b76f38 Christos Stavrakakis
                                       json.dumps(request), 'json')
393 62b76f38 Christos Stavrakakis
        self.assertEqual(response.status_code, 403)
394 62b76f38 Christos Stavrakakis
395 3aecadc8 Christos Stavrakakis
    def test_create_server_error(self, mrapi):
396 3aecadc8 Christos Stavrakakis
        """Test if the create server call returns the expected response
397 3aecadc8 Christos Stavrakakis
           if a valid request has been speficied."""
398 3aecadc8 Christos Stavrakakis
        mrapi().CreateInstance.side_effect = GanetiApiError("..ganeti is down")
399 3aecadc8 Christos Stavrakakis
400 3aecadc8 Christos Stavrakakis
        request = self.request
401 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **self.network_settings):
402 3aecadc8 Christos Stavrakakis
            with mocked_quotaholder():
403 3aecadc8 Christos Stavrakakis
                response = self.mypost('servers', 'test_user',
404 3aecadc8 Christos Stavrakakis
                                       json.dumps(request), 'json')
405 99988465 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
406 3aecadc8 Christos Stavrakakis
        mrapi().CreateInstance.assert_called_once()
407 3aecadc8 Christos Stavrakakis
        vm = VirtualMachine.objects.get()
408 3aecadc8 Christos Stavrakakis
        # The VM has not been deleted
409 3aecadc8 Christos Stavrakakis
        self.assertFalse(vm.deleted)
410 3aecadc8 Christos Stavrakakis
        # but is in "ERROR" operstate
411 3aecadc8 Christos Stavrakakis
        self.assertEqual(vm.operstate, "ERROR")
412 99988465 Christos Stavrakakis
413 3aecadc8 Christos Stavrakakis
    def test_create_network_info(self, mrapi):
414 cb66110b Christos Stavrakakis
        mrapi().CreateInstance.return_value = 12
415 3aecadc8 Christos Stavrakakis
416 cb66110b Christos Stavrakakis
        # User requested private networks
417 3aecadc8 Christos Stavrakakis
        s1 = mfactory.IPv4SubnetFactory(network__userid="test")
418 3aecadc8 Christos Stavrakakis
        s2 = mfactory.IPv6SubnetFactory(network__userid="test")
419 3aecadc8 Christos Stavrakakis
        # and a public IPv6
420 cb66110b Christos Stavrakakis
        request = deepcopy(self.request)
421 3aecadc8 Christos Stavrakakis
        request["server"]["networks"] = [{"uuid": s1.network_id},
422 3aecadc8 Christos Stavrakakis
                                         {"uuid": s2.network_id}]
423 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **self.network_settings):
424 cb66110b Christos Stavrakakis
            with mocked_quotaholder():
425 3aecadc8 Christos Stavrakakis
                response = self.mypost('servers', "test",
426 cb66110b Christos Stavrakakis
                                       json.dumps(request), 'json')
427 cb66110b Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
428 cb66110b Christos Stavrakakis
        name, args, kwargs = mrapi().CreateInstance.mock_calls[0]
429 710b1c43 Christos Stavrakakis
        self.assertEqual(len(kwargs["nics"]), 3)
430 3aecadc8 Christos Stavrakakis
        self.assertEqual(kwargs["nics"][0]["network"], self.net6.backend_id)
431 3aecadc8 Christos Stavrakakis
        self.assertEqual(kwargs["nics"][1]["network"], s1.network.backend_id)
432 3aecadc8 Christos Stavrakakis
        self.assertEqual(kwargs["nics"][2]["network"], s2.network.backend_id)
433 710b1c43 Christos Stavrakakis
434 3aecadc8 Christos Stavrakakis
        # but fail if others user network
435 3aecadc8 Christos Stavrakakis
        s3 = mfactory.IPv6SubnetFactory(network__userid="test_other")
436 cb66110b Christos Stavrakakis
        request = deepcopy(self.request)
437 3aecadc8 Christos Stavrakakis
        request["server"]["networks"] = [{"uuid": s3.network_id}]
438 3aecadc8 Christos Stavrakakis
        response = self.mypost('servers', "test", json.dumps(request), 'json')
439 3aecadc8 Christos Stavrakakis
        self.assertEqual(response.status_code, 404)
440 cb66110b Christos Stavrakakis
441 3aecadc8 Christos Stavrakakis
        # User requested public networks
442 3aecadc8 Christos Stavrakakis
        # but no floating IP..
443 3aecadc8 Christos Stavrakakis
        s1 = mfactory.IPv4SubnetFactory(network__public=True)
444 816d7588 Christos Stavrakakis
        request = deepcopy(self.request)
445 3aecadc8 Christos Stavrakakis
        request["server"]["networks"] = [{"uuid": s1.network_id}]
446 3aecadc8 Christos Stavrakakis
        response = self.mypost('servers', "test", json.dumps(request), 'json')
447 3aecadc8 Christos Stavrakakis
        self.assertEqual(response.status_code, 409)
448 3aecadc8 Christos Stavrakakis
449 3aecadc8 Christos Stavrakakis
        # Add one floating IP
450 3aecadc8 Christos Stavrakakis
        fp1 = mfactory.IPv4AddressFactory(userid="test", subnet=s1,
451 3aecadc8 Christos Stavrakakis
                                          network=s1.network,
452 3aecadc8 Christos Stavrakakis
                                          floating_ip=True, nic=None)
453 3aecadc8 Christos Stavrakakis
        self.assertEqual(fp1.nic, None)
454 3aecadc8 Christos Stavrakakis
        request = deepcopy(self.request)
455 3aecadc8 Christos Stavrakakis
        request["server"]["networks"] = [{"uuid": s1.network_id,
456 3aecadc8 Christos Stavrakakis
                                          "fixed_ip": fp1.address}]
457 3aecadc8 Christos Stavrakakis
        with mocked_quotaholder():
458 3aecadc8 Christos Stavrakakis
            with override_settings(settings, **self.network_settings):
459 3aecadc8 Christos Stavrakakis
                response = self.mypost('servers', "test",
460 e368ad39 Christos Stavrakakis
                                       json.dumps(request), 'json')
461 816d7588 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
462 3aecadc8 Christos Stavrakakis
        server_id = json.loads(response.content)["server"]["id"]
463 3aecadc8 Christos Stavrakakis
        fp1 = IPAddress.objects.get(id=fp1.id)
464 3aecadc8 Christos Stavrakakis
        self.assertEqual(fp1.nic.machine_id, server_id)
465 3aecadc8 Christos Stavrakakis
466 3aecadc8 Christos Stavrakakis
        # check used floating IP
467 3aecadc8 Christos Stavrakakis
        response = self.mypost('servers', "test", json.dumps(request), 'json')
468 3aecadc8 Christos Stavrakakis
        self.assertEqual(response.status_code, 409)
469 3aecadc8 Christos Stavrakakis
470 3aecadc8 Christos Stavrakakis
        # Add more floating IP. but check auto-reserve
471 3aecadc8 Christos Stavrakakis
        fp2 = mfactory.IPv4AddressFactory(userid="test", subnet=s1,
472 3aecadc8 Christos Stavrakakis
                                          network=s1.network,
473 3aecadc8 Christos Stavrakakis
                                          floating_ip=True, nic=None)
474 3aecadc8 Christos Stavrakakis
        self.assertEqual(fp2.nic, None)
475 cb66110b Christos Stavrakakis
        request = deepcopy(self.request)
476 3aecadc8 Christos Stavrakakis
        request["server"]["networks"] = [{"uuid": s1.network_id}]
477 cb66110b Christos Stavrakakis
        with mocked_quotaholder():
478 3aecadc8 Christos Stavrakakis
            with override_settings(settings, **self.network_settings):
479 3aecadc8 Christos Stavrakakis
                response = self.mypost('servers', "test",
480 3aecadc8 Christos Stavrakakis
                                       json.dumps(request), 'json')
481 3aecadc8 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
482 3aecadc8 Christos Stavrakakis
        server_id = json.loads(response.content)["server"]["id"]
483 3aecadc8 Christos Stavrakakis
        fp2 = IPAddress.objects.get(id=fp2.id)
484 3aecadc8 Christos Stavrakakis
        self.assertEqual(fp2.nic.machine_id, server_id)
485 039e3e61 Christos Stavrakakis
486 3aecadc8 Christos Stavrakakis
        name, args, kwargs = mrapi().CreateInstance.mock_calls[-1]
487 3aecadc8 Christos Stavrakakis
        self.assertEqual(len(kwargs["nics"]), 2)
488 3aecadc8 Christos Stavrakakis
        self.assertEqual(kwargs["nics"][0]["network"], self.net6.backend_id)
489 3aecadc8 Christos Stavrakakis
        self.assertEqual(kwargs["nics"][1]["network"], fp2.network.backend_id)
490 f2080d16 Christos Stavrakakis
491 3aecadc8 Christos Stavrakakis
    def test_create_network_settings(self, mrapi):
492 3aecadc8 Christos Stavrakakis
        mrapi().CreateInstance.return_value = 12
493 3aecadc8 Christos Stavrakakis
        # User requested private networks
494 3aecadc8 Christos Stavrakakis
        # no public IPv4
495 3aecadc8 Christos Stavrakakis
        network_settings = {
496 3aecadc8 Christos Stavrakakis
            "CYCLADES_DEFAULT_SERVER_NETWORKS": [],
497 3aecadc8 Christos Stavrakakis
            "CYCLADES_FORCED_SERVER_NETWORKS": ["SNF:ANY_PUBLIC_IPV4"]
498 3aecadc8 Christos Stavrakakis
        }
499 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **network_settings):
500 3aecadc8 Christos Stavrakakis
            response = self.mypost('servers', "test", json.dumps(self.request),
501 3aecadc8 Christos Stavrakakis
                                   'json')
502 3aecadc8 Christos Stavrakakis
        self.assertEqual(response.status_code, 503)
503 3aecadc8 Christos Stavrakakis
        # no public IPv4, IPv6 exists
504 3aecadc8 Christos Stavrakakis
        network_settings = {
505 3aecadc8 Christos Stavrakakis
            "CYCLADES_DEFAULT_SERVER_NETWORKS": [],
506 3aecadc8 Christos Stavrakakis
            "CYCLADES_FORCED_SERVER_NETWORKS": ["SNF:ANY_PUBLIC"]
507 3aecadc8 Christos Stavrakakis
        }
508 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **network_settings):
509 3aecadc8 Christos Stavrakakis
            response = self.mypost('servers', "test", json.dumps(self.request),
510 3aecadc8 Christos Stavrakakis
                                   'json')
511 9dcfad23 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
512 3aecadc8 Christos Stavrakakis
        server_id = json.loads(response.content)["server"]["id"]
513 3aecadc8 Christos Stavrakakis
        vm = VirtualMachine.objects.get(id=server_id)
514 3aecadc8 Christos Stavrakakis
        self.assertEqual(vm.nics.get().ipv4_address, None)
515 3aecadc8 Christos Stavrakakis
516 3aecadc8 Christos Stavrakakis
        # IPv4 exists
517 3aecadc8 Christos Stavrakakis
        mfactory.IPv4SubnetFactory(network__public=True,
518 3aecadc8 Christos Stavrakakis
                                   cidr="192.168.2.0/24",
519 3aecadc8 Christos Stavrakakis
                                   pool__offset=2,
520 3aecadc8 Christos Stavrakakis
                                   pool__size=1)
521 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **network_settings):
522 3aecadc8 Christos Stavrakakis
            response = self.mypost('servers', "test", json.dumps(self.request),
523 3aecadc8 Christos Stavrakakis
                                   'json')
524 3aecadc8 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
525 3aecadc8 Christos Stavrakakis
        server_id = json.loads(response.content)["server"]["id"]
526 3aecadc8 Christos Stavrakakis
        vm = VirtualMachine.objects.get(id=server_id)
527 3aecadc8 Christos Stavrakakis
        self.assertEqual(vm.nics.get().ipv4_address, "192.168.2.2")
528 3aecadc8 Christos Stavrakakis
529 3aecadc8 Christos Stavrakakis
        # Fixed networks
530 3aecadc8 Christos Stavrakakis
        net1 = mfactory.NetworkFactory(userid="test")
531 3aecadc8 Christos Stavrakakis
        net2 = mfactory.NetworkFactory(userid="test")
532 3aecadc8 Christos Stavrakakis
        net3 = mfactory.NetworkFactory(userid="test")
533 3aecadc8 Christos Stavrakakis
        network_settings = {
534 3aecadc8 Christos Stavrakakis
            "CYCLADES_DEFAULT_SERVER_NETWORKS": [],
535 3aecadc8 Christos Stavrakakis
            "CYCLADES_FORCED_SERVER_NETWORKS": [net1.id, [net2.id, net3.id],
536 3aecadc8 Christos Stavrakakis
                                                (net3.id, net2.id)]
537 3aecadc8 Christos Stavrakakis
        }
538 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **network_settings):
539 3aecadc8 Christos Stavrakakis
            response = self.mypost('servers', "test", json.dumps(self.request),
540 3aecadc8 Christos Stavrakakis
                                   'json')
541 3aecadc8 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
542 3aecadc8 Christos Stavrakakis
        server_id = json.loads(response.content)["server"]["id"]
543 3aecadc8 Christos Stavrakakis
        vm = VirtualMachine.objects.get(id=server_id)
544 3aecadc8 Christos Stavrakakis
        self.assertEqual(len(vm.nics.all()), 3)
545 3aecadc8 Christos Stavrakakis
546 3aecadc8 Christos Stavrakakis
    def test_create_server_with_port(self, mrapi):
547 3aecadc8 Christos Stavrakakis
        mrapi().CreateInstance.return_value = 42
548 3aecadc8 Christos Stavrakakis
        ip = mfactory.IPv4AddressFactory(nic__machine=None)
549 3aecadc8 Christos Stavrakakis
        port1 = ip.nic
550 3aecadc8 Christos Stavrakakis
        request = deepcopy(self.request)
551 3aecadc8 Christos Stavrakakis
        request["server"]["networks"] = [{"port": port1.id}]
552 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **self.network_settings):
553 3aecadc8 Christos Stavrakakis
            with mocked_quotaholder():
554 3aecadc8 Christos Stavrakakis
                response = self.mypost("servers", port1.userid,
555 3aecadc8 Christos Stavrakakis
                                       json.dumps(request), 'json')
556 3aecadc8 Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
557 3aecadc8 Christos Stavrakakis
        vm_id = json.loads(response.content)["server"]["id"]
558 3aecadc8 Christos Stavrakakis
        port1 = NetworkInterface.objects.get(id=port1.id)
559 3aecadc8 Christos Stavrakakis
        self.assertEqual(port1.machine_id, vm_id)
560 3aecadc8 Christos Stavrakakis
        # 409 if already used
561 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **self.network_settings):
562 3aecadc8 Christos Stavrakakis
            with mocked_quotaholder():
563 3aecadc8 Christos Stavrakakis
                response = self.mypost("servers", port1.userid,
564 3aecadc8 Christos Stavrakakis
                                       json.dumps(request), 'json')
565 3aecadc8 Christos Stavrakakis
        self.assertConflict(response)
566 3aecadc8 Christos Stavrakakis
        # Test permissions
567 3aecadc8 Christos Stavrakakis
        ip = mfactory.IPv4AddressFactory(userid="user1", nic__userid="user1")
568 3aecadc8 Christos Stavrakakis
        port2 = ip.nic
569 3aecadc8 Christos Stavrakakis
        request["server"]["networks"] = [{"port": port2.id}]
570 3aecadc8 Christos Stavrakakis
        with override_settings(settings, **self.network_settings):
571 3aecadc8 Christos Stavrakakis
            with mocked_quotaholder():
572 3aecadc8 Christos Stavrakakis
                response = self.mypost("servers", "user2",
573 3aecadc8 Christos Stavrakakis
                                       json.dumps(request), 'json')
574 3aecadc8 Christos Stavrakakis
        self.assertEqual(response.status_code, 404)
575 f2080d16 Christos Stavrakakis
576 039e3e61 Christos Stavrakakis
577 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
578 a26e5a4d Georgios D. Tsoukalas
class ServerDestroyAPITest(ComputeAPITest):
579 039e3e61 Christos Stavrakakis
    def test_delete_server(self, mrapi):
580 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
581 41a7fae7 Christos Stavrakakis
        mrapi().DeleteInstance.return_value = 12
582 2cd55da6 Christos Stavrakakis
        response = self.mydelete('servers/%d' % vm.id, vm.userid)
583 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 204)
584 039e3e61 Christos Stavrakakis
        mrapi().DeleteInstance.assert_called_once()
585 039e3e61 Christos Stavrakakis
586 039e3e61 Christos Stavrakakis
    def test_non_existing_delete_server(self, mrapi):
587 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
588 a26e5a4d Georgios D. Tsoukalas
        response = self.mydelete('servers/%d' % 42, vm.userid)
589 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
590 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.mock_calls)
591 039e3e61 Christos Stavrakakis
592 039e3e61 Christos Stavrakakis
593 a26e5a4d Georgios D. Tsoukalas
class ServerMetadataAPITest(ComputeAPITest):
594 039e3e61 Christos Stavrakakis
    def setUp(self):
595 039e3e61 Christos Stavrakakis
        self.vm = mfactory.VirtualMachineFactory()
596 039e3e61 Christos Stavrakakis
        self.metadata = mfactory.VirtualMachineMetadataFactory(vm=self.vm)
597 a26e5a4d Georgios D. Tsoukalas
        super(ServerMetadataAPITest, self).setUp()
598 039e3e61 Christos Stavrakakis
599 039e3e61 Christos Stavrakakis
    def test_get_metadata(self):
600 039e3e61 Christos Stavrakakis
        vm = self.vm
601 039e3e61 Christos Stavrakakis
        create_meta = lambda: mfactory.VirtualMachineMetadataFactory(vm=vm)
602 039e3e61 Christos Stavrakakis
        metadata = [create_meta(), create_meta(), create_meta()]
603 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d/metadata' % vm.id, vm.userid)
604 039e3e61 Christos Stavrakakis
        self.assertTrue(response.status_code in [200, 203])
605 2d04422f Christos Stavrakakis
        api_metadata = json.loads(response.content)['metadata']
606 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_metadata), len(metadata) + 1)
607 039e3e61 Christos Stavrakakis
        for db_m in metadata:
608 039e3e61 Christos Stavrakakis
            self.assertEqual(api_metadata[db_m.meta_key], db_m.meta_value)
609 039e3e61 Christos Stavrakakis
610 e368ad39 Christos Stavrakakis
        request = {
611 e368ad39 Christos Stavrakakis
            'metadata': {
612 e368ad39 Christos Stavrakakis
                'foo': 'bar'
613 e368ad39 Christos Stavrakakis
            },
614 e368ad39 Christos Stavrakakis
            metadata[0].meta_key: 'bar2'
615 e368ad39 Christos Stavrakakis
        }
616 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/metadata' % vm.id,
617 e368ad39 Christos Stavrakakis
                               vm.userid, json.dumps(request), 'json')
618 039e3e61 Christos Stavrakakis
        metadata2 = VirtualMachineMetadata.objects.filter(vm=vm)
619 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d/metadata' % vm.id, vm.userid)
620 039e3e61 Christos Stavrakakis
        self.assertTrue(response.status_code in [200, 203])
621 2d04422f Christos Stavrakakis
        api_metadata2 = json.loads(response.content)['metadata']
622 039e3e61 Christos Stavrakakis
        self.assertTrue('foo' in api_metadata2.keys())
623 039e3e61 Christos Stavrakakis
        self.assertTrue(api_metadata2[metadata[0].meta_key], 'bar2')
624 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_metadata2), len(metadata2))
625 039e3e61 Christos Stavrakakis
        for db_m in metadata2:
626 039e3e61 Christos Stavrakakis
            self.assertEqual(api_metadata2[db_m.meta_key], db_m.meta_value)
627 039e3e61 Christos Stavrakakis
628 039e3e61 Christos Stavrakakis
        # Create new meta
629 039e3e61 Christos Stavrakakis
        request = {'meta': {'foo2': 'bar2'}}
630 a26e5a4d Georgios D. Tsoukalas
        response = self.myput('servers/%d/metadata/foo2' % vm.id,
631 a26e5a4d Georgios D. Tsoukalas
                              vm.userid, json.dumps(request), 'json')
632 039e3e61 Christos Stavrakakis
633 039e3e61 Christos Stavrakakis
        # Get the new meta
634 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d/metadata/foo2' % vm.id, vm.userid)
635 039e3e61 Christos Stavrakakis
        meta = json.loads(response.content)['meta']
636 039e3e61 Christos Stavrakakis
        self.assertEqual(meta['foo2'], 'bar2')
637 039e3e61 Christos Stavrakakis
638 039e3e61 Christos Stavrakakis
        # Delete the new meta
639 a26e5a4d Georgios D. Tsoukalas
        response = self.mydelete('servers/%d/metadata/foo2' % vm.id, vm.userid)
640 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 204)
641 039e3e61 Christos Stavrakakis
642 039e3e61 Christos Stavrakakis
        # Try to get the deleted meta: should raise 404
643 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d/metadata/foo2' % vm.id, vm.userid)
644 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 404)
645 039e3e61 Christos Stavrakakis
646 039e3e61 Christos Stavrakakis
    def test_invalid_metadata(self):
647 039e3e61 Christos Stavrakakis
        vm = self.vm
648 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/metadata' % vm.id, vm.userid)
649 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
650 039e3e61 Christos Stavrakakis
        self.assertEqual(len(vm.metadata.all()), 1)
651 039e3e61 Christos Stavrakakis
652 039e3e61 Christos Stavrakakis
    def test_invalid_metadata_server(self):
653 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/42/metadata', 'user')
654 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
655 039e3e61 Christos Stavrakakis
656 039e3e61 Christos Stavrakakis
    def test_get_meta_invalid_key(self):
657 039e3e61 Christos Stavrakakis
        vm = self.vm
658 a26e5a4d Georgios D. Tsoukalas
        response = self.myget('servers/%d/metadata/foo2' % vm.id, vm.userid)
659 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
660 039e3e61 Christos Stavrakakis
661 039e3e61 Christos Stavrakakis
662 039e3e61 Christos Stavrakakis
@patch('synnefo.api.util.get_image')
663 039e3e61 Christos Stavrakakis
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
664 a26e5a4d Georgios D. Tsoukalas
class ServerActionAPITest(ComputeAPITest):
665 039e3e61 Christos Stavrakakis
    def test_actions(self, mrapi, mimage):
666 039e3e61 Christos Stavrakakis
        actions = ['start', 'shutdown', 'reboot']
667 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
668 039e3e61 Christos Stavrakakis
        vm.operstate = "STOPPED"
669 039e3e61 Christos Stavrakakis
        vm.save()
670 41a7fae7 Christos Stavrakakis
        mrapi().StartupInstance.return_value = 0
671 41a7fae7 Christos Stavrakakis
        mrapi().ShutdownInstance.return_value = 1
672 41a7fae7 Christos Stavrakakis
        mrapi().RebootInstance.return_value = 2
673 41a7fae7 Christos Stavrakakis
        for jobId, action in enumerate(actions):
674 41a7fae7 Christos Stavrakakis
            if action in ["shutdown", "reboot"]:
675 41a7fae7 Christos Stavrakakis
                vm.operstate = "STARTED"
676 41a7fae7 Christos Stavrakakis
            else:
677 41a7fae7 Christos Stavrakakis
                vm.operstate = "STOPPED"
678 41a7fae7 Christos Stavrakakis
            vm.task = None
679 41a7fae7 Christos Stavrakakis
            vm.task_job_id = None
680 41a7fae7 Christos Stavrakakis
            vm.save()
681 039e3e61 Christos Stavrakakis
            val = {'type': 'HARD'} if action == 'reboot' else {}
682 039e3e61 Christos Stavrakakis
            request = {action: val}
683 a26e5a4d Georgios D. Tsoukalas
            response = self.mypost('servers/%d/action' % vm.id,
684 a26e5a4d Georgios D. Tsoukalas
                                   vm.userid, json.dumps(request), 'json')
685 039e3e61 Christos Stavrakakis
            self.assertEqual(response.status_code, 202)
686 039e3e61 Christos Stavrakakis
            if action == 'shutdown':
687 41a7fae7 Christos Stavrakakis
                self.assertEqual(VirtualMachine.objects.get(id=vm.id).task,
688 039e3e61 Christos Stavrakakis
                                 "STOP")
689 039e3e61 Christos Stavrakakis
            else:
690 41a7fae7 Christos Stavrakakis
                self.assertEqual(VirtualMachine.objects.get(id=vm.id).task,
691 039e3e61 Christos Stavrakakis
                                 action.upper())
692 41a7fae7 Christos Stavrakakis
            self.assertEqual(VirtualMachine.objects.get(id=vm.id).task_job_id,
693 41a7fae7 Christos Stavrakakis
                             jobId)
694 039e3e61 Christos Stavrakakis
695 039e3e61 Christos Stavrakakis
    def test_action_in_building_vm(self, mrapi, mimage):
696 039e3e61 Christos Stavrakakis
        """Test building in progress"""
697 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="BUILD")
698 41a7fae7 Christos Stavrakakis
        request = {'start': {}}
699 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
700 2cd55da6 Christos Stavrakakis
            response = self.mypost('servers/%d/action' % vm.id,
701 41a7fae7 Christos Stavrakakis
                                   vm.userid, json.dumps(request), 'json')
702 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 409)
703 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.mock_calls)
704 039e3e61 Christos Stavrakakis
705 039e3e61 Christos Stavrakakis
    def test_destroy_build_vm(self, mrapi, mimage):
706 039e3e61 Christos Stavrakakis
        """Test building in progress"""
707 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
708 41a7fae7 Christos Stavrakakis
        mrapi().DeleteInstance.return_value = 2
709 2cd55da6 Christos Stavrakakis
        response = self.mydelete('servers/%d' % vm.id,
710 41a7fae7 Christos Stavrakakis
                                 vm.userid)
711 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
712 039e3e61 Christos Stavrakakis
        mrapi().RemoveInstance.assert_called_once()
713 039e3e61 Christos Stavrakakis
714 039e3e61 Christos Stavrakakis
    def test_firewall(self, mrapi, mimage):
715 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
716 039e3e61 Christos Stavrakakis
        vm.operstate = "STOPPED"
717 039e3e61 Christos Stavrakakis
        vm.save()
718 039e3e61 Christos Stavrakakis
        request = {'firewallProfile': {'profile': 'PROTECTED'}}
719 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/action' % vm.id,
720 a26e5a4d Georgios D. Tsoukalas
                               vm.userid, json.dumps(request), 'json')
721 d0545590 Christos Stavrakakis
        self.assertBadRequest(response)
722 d0545590 Christos Stavrakakis
        request = {'firewallProfile': {'profile': 'PROTECTED', "nic": "10"}}
723 d0545590 Christos Stavrakakis
        response = self.mypost('servers/%d/action' % vm.id,
724 d0545590 Christos Stavrakakis
                               vm.userid, json.dumps(request), 'json')
725 d0545590 Christos Stavrakakis
        self.assertItemNotFound(response)
726 d0545590 Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=vm)
727 d0545590 Christos Stavrakakis
        request = {'firewallProfile': {'profile': 'PROTECTED', "nic": nic.id}}
728 d0545590 Christos Stavrakakis
        response = self.mypost('servers/%d/action' % vm.id,
729 d0545590 Christos Stavrakakis
                               vm.userid, json.dumps(request), 'json')
730 d0545590 Christos Stavrakakis
        self.assertSuccess(response)
731 039e3e61 Christos Stavrakakis
        mrapi().ModifyInstance.assert_called_once()
732 039e3e61 Christos Stavrakakis
733 039e3e61 Christos Stavrakakis
    def test_unsupported_firewall(self, mrapi, mimage):
734 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
735 039e3e61 Christos Stavrakakis
        vm.operstate = "STOPPED"
736 039e3e61 Christos Stavrakakis
        vm.save()
737 039e3e61 Christos Stavrakakis
        request = {'firewallProfile': {'profile': 'FOO'}}
738 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/action' % vm.id,
739 a26e5a4d Georgios D. Tsoukalas
                               vm.userid, json.dumps(request), 'json')
740 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
741 039e3e61 Christos Stavrakakis
        self.assertFalse(mrapi.mock_calls)
742 039e3e61 Christos Stavrakakis
743 1af851fd Christos Stavrakakis
    def test_resize_vm(self, mrapi, mimage):
744 1af851fd Christos Stavrakakis
        flavor = mfactory.FlavorFactory(cpu=1, ram=1024)
745 1af851fd Christos Stavrakakis
        # Check building VM
746 1af851fd Christos Stavrakakis
        vm = self.get_vm(flavor=flavor, operstate="BUILD")
747 1af851fd Christos Stavrakakis
        request = {'resize': {'flavorRef': flavor.id}}
748 2cd55da6 Christos Stavrakakis
        response = self.mypost('servers/%d/action' % vm.id,
749 e368ad39 Christos Stavrakakis
                               vm.userid, json.dumps(request), 'json')
750 1af851fd Christos Stavrakakis
        self.assertFault(response, 409, "buildInProgress")
751 1af851fd Christos Stavrakakis
        # Check same Flavor
752 1af851fd Christos Stavrakakis
        vm = self.get_vm(flavor=flavor, operstate="STOPPED")
753 1af851fd Christos Stavrakakis
        request = {'resize': {'flavorRef': flavor.id}}
754 2cd55da6 Christos Stavrakakis
        response = self.mypost('servers/%d/action' % vm.id,
755 e368ad39 Christos Stavrakakis
                               vm.userid, json.dumps(request), 'json')
756 41a7fae7 Christos Stavrakakis
        self.assertBadRequest(response)
757 1af851fd Christos Stavrakakis
        # Check flavor with different disk
758 1af851fd Christos Stavrakakis
        flavor2 = mfactory.FlavorFactory(disk=1024)
759 1af851fd Christos Stavrakakis
        flavor3 = mfactory.FlavorFactory(disk=2048)
760 1af851fd Christos Stavrakakis
        vm = self.get_vm(flavor=flavor2, operstate="STOPPED")
761 1af851fd Christos Stavrakakis
        request = {'resize': {'flavorRef': flavor3.id}}
762 2cd55da6 Christos Stavrakakis
        response = self.mypost('servers/%d/action' % vm.id,
763 e368ad39 Christos Stavrakakis
                               vm.userid, json.dumps(request), 'json')
764 1af851fd Christos Stavrakakis
        self.assertBadRequest(response)
765 1af851fd Christos Stavrakakis
        flavor2 = mfactory.FlavorFactory(disk_template="foo")
766 1af851fd Christos Stavrakakis
        flavor3 = mfactory.FlavorFactory(disk_template="baz")
767 1af851fd Christos Stavrakakis
        vm = self.get_vm(flavor=flavor2, operstate="STOPPED")
768 1af851fd Christos Stavrakakis
        request = {'resize': {'flavorRef': flavor3.id}}
769 2cd55da6 Christos Stavrakakis
        response = self.mypost('servers/%d/action' % vm.id,
770 e368ad39 Christos Stavrakakis
                               vm.userid, json.dumps(request), 'json')
771 1af851fd Christos Stavrakakis
        self.assertBadRequest(response)
772 1af851fd Christos Stavrakakis
        # Check success
773 1af851fd Christos Stavrakakis
        vm = self.get_vm(flavor=flavor, operstate="STOPPED")
774 1af851fd Christos Stavrakakis
        flavor4 = mfactory.FlavorFactory(disk_template=flavor.disk_template,
775 1af851fd Christos Stavrakakis
                                         disk=flavor.disk,
776 1af851fd Christos Stavrakakis
                                         cpu=4, ram=2048)
777 1af851fd Christos Stavrakakis
        request = {'resize': {'flavorRef': flavor4.id}}
778 1af851fd Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
779 2cd55da6 Christos Stavrakakis
        response = self.mypost('servers/%d/action' % vm.id,
780 e368ad39 Christos Stavrakakis
                               vm.userid, json.dumps(request), 'json')
781 1af851fd Christos Stavrakakis
        self.assertEqual(response.status_code, 202)
782 1af851fd Christos Stavrakakis
        vm = VirtualMachine.objects.get(id=vm.id)
783 41a7fae7 Christos Stavrakakis
        self.assertEqual(vm.task_job_id, 42)
784 1af851fd Christos Stavrakakis
        name, args, kwargs = mrapi().ModifyInstance.mock_calls[0]
785 1af851fd Christos Stavrakakis
        self.assertEqual(kwargs["beparams"]["vcpus"], 4)
786 1af851fd Christos Stavrakakis
        self.assertEqual(kwargs["beparams"]["minmem"], 2048)
787 1af851fd Christos Stavrakakis
        self.assertEqual(kwargs["beparams"]["maxmem"], 2048)
788 1af851fd Christos Stavrakakis
789 41a7fae7 Christos Stavrakakis
    def test_action_on_resizing_vm(self, mrapi, mimage):
790 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
791 41a7fae7 Christos Stavrakakis
        vm.operstate = "RESIZE"
792 41a7fae7 Christos Stavrakakis
        vm.save()
793 41a7fae7 Christos Stavrakakis
        for action in VirtualMachine.ACTIONS:
794 41a7fae7 Christos Stavrakakis
            request = {action[0]: ""}
795 2cd55da6 Christos Stavrakakis
            response = self.mypost('servers/%d/action' % vm.id,
796 e368ad39 Christos Stavrakakis
                                   vm.userid, json.dumps(request), 'json')
797 41a7fae7 Christos Stavrakakis
            self.assertBadRequest(response)
798 41a7fae7 Christos Stavrakakis
        # however you can destroy
799 41a7fae7 Christos Stavrakakis
        mrapi().DeleteInstance.return_value = 42
800 2cd55da6 Christos Stavrakakis
        response = self.mydelete('servers/%d' % vm.id,
801 2cd55da6 Christos Stavrakakis
                                 vm.userid)
802 41a7fae7 Christos Stavrakakis
        self.assertSuccess(response)
803 41a7fae7 Christos Stavrakakis
804 1af851fd Christos Stavrakakis
    def get_vm(self, flavor, operstate):
805 1af851fd Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(flavor=flavor)
806 1af851fd Christos Stavrakakis
        vm.operstate = operstate
807 1af851fd Christos Stavrakakis
        vm.backendjobstatus = "success"
808 1af851fd Christos Stavrakakis
        vm.save()
809 1af851fd Christos Stavrakakis
        return vm
810 1af851fd Christos Stavrakakis
811 039e3e61 Christos Stavrakakis
812 a26e5a4d Georgios D. Tsoukalas
class ServerVNCConsole(ComputeAPITest):
813 039e3e61 Christos Stavrakakis
    def test_not_active_server(self):
814 039e3e61 Christos Stavrakakis
        """Test console req for not ACTIVE server returns badRequest"""
815 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="BUILD")
816 039e3e61 Christos Stavrakakis
        data = json.dumps({'console': {'type': 'vnc'}})
817 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/action' % vm.id,
818 a26e5a4d Georgios D. Tsoukalas
                               vm.userid, data, 'json')
819 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)
820 039e3e61 Christos Stavrakakis
821 039e3e61 Christos Stavrakakis
    def test_active_server(self):
822 039e3e61 Christos Stavrakakis
        """Test console req for ACTIVE server"""
823 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
824 039e3e61 Christos Stavrakakis
        vm.operstate = 'STARTED'
825 039e3e61 Christos Stavrakakis
        vm.save()
826 039e3e61 Christos Stavrakakis
827 039e3e61 Christos Stavrakakis
        data = json.dumps({'console': {'type': 'vnc'}})
828 41a7fae7 Christos Stavrakakis
        with override_settings(settings, TEST=True):
829 2cd55da6 Christos Stavrakakis
            response = self.mypost('servers/%d/action' % vm.id,
830 41a7fae7 Christos Stavrakakis
                                   vm.userid, data, 'json')
831 039e3e61 Christos Stavrakakis
        self.assertEqual(response.status_code, 200)
832 039e3e61 Christos Stavrakakis
        reply = json.loads(response.content)
833 039e3e61 Christos Stavrakakis
        self.assertEqual(reply.keys(), ['console'])
834 039e3e61 Christos Stavrakakis
        console = reply['console']
835 039e3e61 Christos Stavrakakis
        self.assertEqual(console['type'], 'vnc')
836 039e3e61 Christos Stavrakakis
        self.assertEqual(set(console.keys()),
837 039e3e61 Christos Stavrakakis
                         set(['type', 'host', 'port', 'password']))
838 039e3e61 Christos Stavrakakis
839 039e3e61 Christos Stavrakakis
    def test_wrong_console_type(self):
840 039e3e61 Christos Stavrakakis
        """Test console req for ACTIVE server"""
841 039e3e61 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
842 039e3e61 Christos Stavrakakis
        vm.operstate = 'STARTED'
843 039e3e61 Christos Stavrakakis
        vm.save()
844 039e3e61 Christos Stavrakakis
845 039e3e61 Christos Stavrakakis
        data = json.dumps({'console': {'type': 'foo'}})
846 a26e5a4d Georgios D. Tsoukalas
        response = self.mypost('servers/%d/action' % vm.id,
847 a26e5a4d Georgios D. Tsoukalas
                               vm.userid, data, 'json')
848 039e3e61 Christos Stavrakakis
        self.assertBadRequest(response)