Statistics
| Branch: | Tag: | Revision:

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

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