Statistics
| Branch: | Tag: | Revision:

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

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