Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / tests / flavors.py @ b9364b15

History | View | Annotate | Download (5.9 kB)

1 9582e68e Christos Stavrakakis
# Copyright 2013 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 d2b8ec7b Christos Stavrakakis
from snf_django.utils.testing import BaseAPITest
37 039e3e61 Christos Stavrakakis
from synnefo.db.models import Flavor
38 039e3e61 Christos Stavrakakis
from synnefo.db.models_factory import FlavorFactory
39 a28c5998 Georgios D. Tsoukalas
from synnefo.lib.services import get_service_path
40 a28c5998 Georgios D. Tsoukalas
from synnefo.cyclades_settings import cyclades_services
41 a28c5998 Georgios D. Tsoukalas
from synnefo.lib import join_urls
42 039e3e61 Christos Stavrakakis
43 039e3e61 Christos Stavrakakis
44 039e3e61 Christos Stavrakakis
class FlavorAPITest(BaseAPITest):
45 039e3e61 Christos Stavrakakis
46 039e3e61 Christos Stavrakakis
    def setUp(self):
47 039e3e61 Christos Stavrakakis
        self.flavor1 = FlavorFactory()
48 039e3e61 Christos Stavrakakis
        self.flavor2 = FlavorFactory(deleted=True)
49 039e3e61 Christos Stavrakakis
        self.flavor3 = FlavorFactory()
50 a28c5998 Georgios D. Tsoukalas
        self.compute_path = get_service_path(cyclades_services, 'compute',
51 a28c5998 Georgios D. Tsoukalas
                                             version='v2.0')
52 a28c5998 Georgios D. Tsoukalas
53 a28c5998 Georgios D. Tsoukalas
    def myget(self, path):
54 a28c5998 Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
55 a28c5998 Georgios D. Tsoukalas
        return self.get(path)
56 a28c5998 Georgios D. Tsoukalas
57 039e3e61 Christos Stavrakakis
    def test_flavor_list(self):
58 039e3e61 Christos Stavrakakis
        """Test if the expected list of flavors is returned."""
59 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors')
60 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
61 039e3e61 Christos Stavrakakis
62 2d04422f Christos Stavrakakis
        api_flavors = json.loads(response.content)['flavors']
63 039e3e61 Christos Stavrakakis
        db_flavors = Flavor.objects.filter(deleted=False)
64 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_flavors), len(db_flavors))
65 039e3e61 Christos Stavrakakis
        for api_flavor in api_flavors:
66 039e3e61 Christos Stavrakakis
            db_flavor = Flavor.objects.get(id=api_flavor['id'])
67 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['id'], db_flavor.id)
68 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['name'], db_flavor.name)
69 039e3e61 Christos Stavrakakis
70 039e3e61 Christos Stavrakakis
    def test_flavors_details(self):
71 039e3e61 Christos Stavrakakis
        """Test if the flavors details are returned."""
72 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors/detail')
73 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
74 039e3e61 Christos Stavrakakis
75 039e3e61 Christos Stavrakakis
        db_flavors = Flavor.objects.filter(deleted=False)
76 2d04422f Christos Stavrakakis
        api_flavors = json.loads(response.content)['flavors']
77 039e3e61 Christos Stavrakakis
78 039e3e61 Christos Stavrakakis
        self.assertEqual(len(db_flavors), len(api_flavors))
79 039e3e61 Christos Stavrakakis
80 039e3e61 Christos Stavrakakis
        for i in range(0, len(db_flavors)):
81 039e3e61 Christos Stavrakakis
            api_flavor = api_flavors[i]
82 039e3e61 Christos Stavrakakis
            db_flavor = Flavor.objects.get(id=db_flavors[i].id)
83 a333c901 Christos Stavrakakis
            self.assertEqual(api_flavor['vcpus'], db_flavor.cpu)
84 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['id'], db_flavor.id)
85 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['disk'], db_flavor.disk)
86 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['name'], db_flavor.name)
87 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['ram'], db_flavor.ram)
88 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['SNF:disk_template'],
89 9582e68e Christos Stavrakakis
                             db_flavor.disk_template)
90 039e3e61 Christos Stavrakakis
91 039e3e61 Christos Stavrakakis
    def test_flavor_details(self):
92 039e3e61 Christos Stavrakakis
        """Test if the expected flavor is returned."""
93 039e3e61 Christos Stavrakakis
        flavor = self.flavor3
94 039e3e61 Christos Stavrakakis
95 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors/%d' % flavor.id)
96 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
97 039e3e61 Christos Stavrakakis
98 039e3e61 Christos Stavrakakis
        api_flavor = json.loads(response.content)['flavor']
99 039e3e61 Christos Stavrakakis
        db_flavor = Flavor.objects.get(id=flavor.id)
100 a333c901 Christos Stavrakakis
        self.assertEqual(api_flavor['vcpus'], db_flavor.cpu)
101 039e3e61 Christos Stavrakakis
        self.assertEqual(api_flavor['id'], db_flavor.id)
102 039e3e61 Christos Stavrakakis
        self.assertEqual(api_flavor['disk'], db_flavor.disk)
103 039e3e61 Christos Stavrakakis
        self.assertEqual(api_flavor['name'], db_flavor.name)
104 039e3e61 Christos Stavrakakis
        self.assertEqual(api_flavor['ram'], db_flavor.ram)
105 039e3e61 Christos Stavrakakis
        self.assertEqual(api_flavor['SNF:disk_template'],
106 039e3e61 Christos Stavrakakis
                         db_flavor.disk_template)
107 039e3e61 Christos Stavrakakis
108 039e3e61 Christos Stavrakakis
    def test_deleted_flavor_details(self):
109 039e3e61 Christos Stavrakakis
        """Test that API returns details for deleted flavors"""
110 039e3e61 Christos Stavrakakis
        flavor = self.flavor2
111 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors/%d' % flavor.id)
112 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
113 039e3e61 Christos Stavrakakis
        api_flavor = json.loads(response.content)['flavor']
114 039e3e61 Christos Stavrakakis
        self.assertEquals(api_flavor['name'], flavor.name)
115 039e3e61 Christos Stavrakakis
116 039e3e61 Christos Stavrakakis
    def test_deleted_flavors_list(self):
117 039e3e61 Christos Stavrakakis
        """Test that deleted flavors do not appear to flavors list"""
118 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors')
119 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
120 2d04422f Christos Stavrakakis
        api_flavors = json.loads(response.content)['flavors']
121 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_flavors), 2)
122 039e3e61 Christos Stavrakakis
123 039e3e61 Christos Stavrakakis
    def test_deleted_flavors_details(self):
124 039e3e61 Christos Stavrakakis
        """Test that deleted flavors do not appear to flavors detail list"""
125 039e3e61 Christos Stavrakakis
        FlavorFactory(deleted=True)
126 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors/detail')
127 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
128 2d04422f Christos Stavrakakis
        api_flavors = json.loads(response.content)['flavors']
129 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_flavors), 2)
130 039e3e61 Christos Stavrakakis
131 039e3e61 Christos Stavrakakis
    def test_wrong_flavor(self):
132 039e3e61 Christos Stavrakakis
        """Test 404 result when requesting a flavor that does not exist."""
133 039e3e61 Christos Stavrakakis
134 9582e68e Christos Stavrakakis
        flavor_id = max(Flavor.objects.values_list('id', flat=True)) + 1
135 9582e68e Christos Stavrakakis
        response = self.myget('flavors/%d' % flavor_id)
136 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
137 a3accf03 Georgios D. Tsoukalas
138 a3accf03 Georgios D. Tsoukalas
    def test_catch_wrong_api_paths(self, *args):
139 a3accf03 Georgios D. Tsoukalas
        response = self.myget('nonexistent')
140 a3accf03 Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
141 a3accf03 Georgios D. Tsoukalas
        try:
142 9582e68e Christos Stavrakakis
            json.loads(response.content)
143 a3accf03 Georgios D. Tsoukalas
        except ValueError:
144 a3accf03 Georgios D. Tsoukalas
            self.assertTrue(False)