Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (16.3 kB)

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