Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / test / flavors.py @ a3accf03

History | View | Annotate | Download (5.9 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 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
54 a28c5998 Georgios D. Tsoukalas
    def myget(self, path):
55 a28c5998 Georgios D. Tsoukalas
        path = join_urls(self.compute_path, path)
56 a28c5998 Georgios D. Tsoukalas
        return self.get(path)
57 a28c5998 Georgios D. Tsoukalas
58 039e3e61 Christos Stavrakakis
59 039e3e61 Christos Stavrakakis
    def test_flavor_list(self):
60 039e3e61 Christos Stavrakakis
        """Test if the expected list of flavors is returned."""
61 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors')
62 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
63 039e3e61 Christos Stavrakakis
64 2d04422f Christos Stavrakakis
        api_flavors = json.loads(response.content)['flavors']
65 039e3e61 Christos Stavrakakis
        db_flavors = Flavor.objects.filter(deleted=False)
66 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_flavors), len(db_flavors))
67 039e3e61 Christos Stavrakakis
        for api_flavor in api_flavors:
68 039e3e61 Christos Stavrakakis
            db_flavor = Flavor.objects.get(id=api_flavor['id'])
69 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['id'], db_flavor.id)
70 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['name'], db_flavor.name)
71 039e3e61 Christos Stavrakakis
72 039e3e61 Christos Stavrakakis
    def test_flavors_details(self):
73 039e3e61 Christos Stavrakakis
        """Test if the flavors details are returned."""
74 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors/detail')
75 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
76 039e3e61 Christos Stavrakakis
77 039e3e61 Christos Stavrakakis
        db_flavors = Flavor.objects.filter(deleted=False)
78 2d04422f Christos Stavrakakis
        api_flavors = json.loads(response.content)['flavors']
79 039e3e61 Christos Stavrakakis
80 039e3e61 Christos Stavrakakis
        self.assertEqual(len(db_flavors), len(api_flavors))
81 039e3e61 Christos Stavrakakis
82 039e3e61 Christos Stavrakakis
        for i in range(0, len(db_flavors)):
83 039e3e61 Christos Stavrakakis
            api_flavor = api_flavors[i]
84 039e3e61 Christos Stavrakakis
            db_flavor = Flavor.objects.get(id=db_flavors[i].id)
85 a333c901 Christos Stavrakakis
            self.assertEqual(api_flavor['vcpus'], db_flavor.cpu)
86 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['id'], db_flavor.id)
87 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['disk'], db_flavor.disk)
88 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['name'], db_flavor.name)
89 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['ram'], db_flavor.ram)
90 039e3e61 Christos Stavrakakis
            self.assertEqual(api_flavor['SNF:disk_template'],
91 039e3e61 Christos Stavrakakis
                                        db_flavor.disk_template)
92 039e3e61 Christos Stavrakakis
93 039e3e61 Christos Stavrakakis
    def test_flavor_details(self):
94 039e3e61 Christos Stavrakakis
        """Test if the expected flavor is returned."""
95 039e3e61 Christos Stavrakakis
        flavor = self.flavor3
96 039e3e61 Christos Stavrakakis
97 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors/%d' % flavor.id)
98 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
99 039e3e61 Christos Stavrakakis
100 039e3e61 Christos Stavrakakis
        api_flavor = json.loads(response.content)['flavor']
101 039e3e61 Christos Stavrakakis
        db_flavor = Flavor.objects.get(id=flavor.id)
102 a333c901 Christos Stavrakakis
        self.assertEqual(api_flavor['vcpus'], db_flavor.cpu)
103 039e3e61 Christos Stavrakakis
        self.assertEqual(api_flavor['id'], db_flavor.id)
104 039e3e61 Christos Stavrakakis
        self.assertEqual(api_flavor['disk'], db_flavor.disk)
105 039e3e61 Christos Stavrakakis
        self.assertEqual(api_flavor['name'], db_flavor.name)
106 039e3e61 Christos Stavrakakis
        self.assertEqual(api_flavor['ram'], db_flavor.ram)
107 039e3e61 Christos Stavrakakis
        self.assertEqual(api_flavor['SNF:disk_template'],
108 039e3e61 Christos Stavrakakis
                         db_flavor.disk_template)
109 039e3e61 Christos Stavrakakis
110 039e3e61 Christos Stavrakakis
    def test_deleted_flavor_details(self):
111 039e3e61 Christos Stavrakakis
        """Test that API returns details for deleted flavors"""
112 039e3e61 Christos Stavrakakis
        flavor = self.flavor2
113 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors/%d' % flavor.id)
114 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
115 039e3e61 Christos Stavrakakis
        api_flavor = json.loads(response.content)['flavor']
116 039e3e61 Christos Stavrakakis
        self.assertEquals(api_flavor['name'], flavor.name)
117 039e3e61 Christos Stavrakakis
118 039e3e61 Christos Stavrakakis
    def test_deleted_flavors_list(self):
119 039e3e61 Christos Stavrakakis
        """Test that deleted flavors do not appear to flavors list"""
120 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors')
121 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
122 2d04422f Christos Stavrakakis
        api_flavors = json.loads(response.content)['flavors']
123 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_flavors), 2)
124 039e3e61 Christos Stavrakakis
125 039e3e61 Christos Stavrakakis
    def test_deleted_flavors_details(self):
126 039e3e61 Christos Stavrakakis
        """Test that deleted flavors do not appear to flavors detail list"""
127 039e3e61 Christos Stavrakakis
        FlavorFactory(deleted=True)
128 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors/detail')
129 039e3e61 Christos Stavrakakis
        self.assertSuccess(response)
130 2d04422f Christos Stavrakakis
        api_flavors = json.loads(response.content)['flavors']
131 039e3e61 Christos Stavrakakis
        self.assertEqual(len(api_flavors), 2)
132 039e3e61 Christos Stavrakakis
133 039e3e61 Christos Stavrakakis
    def test_wrong_flavor(self):
134 039e3e61 Christos Stavrakakis
        """Test 404 result when requesting a flavor that does not exist."""
135 039e3e61 Christos Stavrakakis
136 a28c5998 Georgios D. Tsoukalas
        # XXX: flavors/22 below fails for no apparent reason
137 a28c5998 Georgios D. Tsoukalas
        response = self.myget('flavors/%d' % 23)
138 039e3e61 Christos Stavrakakis
        self.assertItemNotFound(response)
139 a3accf03 Georgios D. Tsoukalas
140 a3accf03 Georgios D. Tsoukalas
    def test_catch_wrong_api_paths(self, *args):
141 a3accf03 Georgios D. Tsoukalas
        response = self.myget('nonexistent')
142 a3accf03 Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
143 a3accf03 Georgios D. Tsoukalas
        try:
144 a3accf03 Georgios D. Tsoukalas
            error = json.loads(response.content)
145 a3accf03 Georgios D. Tsoukalas
        except ValueError:
146 a3accf03 Georgios D. Tsoukalas
            self.assertTrue(False)