sahara/savanna/tests/unit/test_api_v02.py

333 lines
11 KiB
Python

# Copyright (c) 2013 Mirantis Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import eventlet
import json
import unittest
from savanna.openstack.common import log as logging
from savanna.tests.unit.base import SavannaTestCase
LOG = logging.getLogger(__name__)
class TestApiV02(SavannaTestCase):
def test_list_node_templates(self):
rv = self.app.get('/v0.2/some-tenant-id/node-templates.json')
self.assertEquals(rv.status_code, 200)
data = json.loads(rv.data)
# clean all ids
for idx in xrange(0, len(data.get(u'node_templates'))):
del data.get(u'node_templates')[idx][u'id']
self.assertEquals(data, _get_templates_stub_data())
def test_create_node_template(self):
rv = self.app.post('/v0.2/some-tenant-id/node-templates.json',
data=json.dumps(dict(
node_template=dict(
name='test-template',
node_type='JT+NN',
flavor_id='test_flavor',
job_tracker={
'heap_size': '1234'
},
name_node={
'heap_size': '2345'
}
))))
self.assertEquals(rv.status_code, 202)
data = json.loads(rv.data)
data = data['node_template']
# clean all ids
del data[u'id']
self.assertEquals(data, {
u'job_tracker': {
u'heap_size': u'1234'
}, u'name': u'test-template',
u'node_type': {
u'processes': [
u'job_tracker', u'name_node'
],
u'name': u'JT+NN'
},
u'flavor_id': u'test_flavor',
u'name_node': {
u'heap_size': u'2345'
}
})
def test_list_clusters(self):
rv = self.app.get('/v0.2/some-tenant-id/clusters.json')
self.assertEquals(rv.status_code, 200)
data = json.loads(rv.data)
self.assertEquals(data, {
u'clusters': []
})
def test_create_clusters(self):
rv = self.app.post('/v0.2/some-tenant-id/clusters.json',
data=json.dumps(dict(
cluster=dict(
name='test-cluster',
base_image_id='base-image-id',
node_templates={
'jt_nn.medium': 1,
'tt_dn.small': 5
}
))))
self.assertEquals(rv.status_code, 202)
data = json.loads(rv.data)
data = data['cluster']
cluster_id = data.pop(u'id')
self.assertEquals(data, {
u'status': u'Starting',
u'service_urls': {},
u'name': u'test-cluster',
u'base_image_id': u'base-image-id',
u'node_templates': {
u'jt_nn.medium': 1,
u'tt_dn.small': 5
},
u'nodes': []
})
eventlet.sleep(4)
rv = self.app.get('/v0.2/some-tenant-id/clusters/%s.json' % cluster_id)
self.assertEquals(rv.status_code, 200)
data = json.loads(rv.data)
data = data['cluster']
self.assertEquals(data.pop(u'id'), cluster_id)
# clean all ids
for idx in xrange(0, len(data.get(u'nodes'))):
del data.get(u'nodes')[idx][u'vm_id']
del data.get(u'nodes')[idx][u'node_template'][u'id']
nodes = data.pop(u'nodes')
self.assertEquals(data, {
u'status': u'Active',
u'service_urls': {},
u'name': u'test-cluster',
u'base_image_id': u'base-image-id',
u'node_templates': {
u'jt_nn.medium': 1,
u'tt_dn.small': 5
}
})
self.assertEquals(_sorted_nodes(nodes), _sorted_nodes([
{u'node_template': {u'name': u'tt_dn.small'}},
{u'node_template': {u'name': u'tt_dn.small'}},
{u'node_template': {u'name': u'tt_dn.small'}},
{u'node_template': {u'name': u'tt_dn.small'}},
{u'node_template': {u'name': u'tt_dn.small'}},
{u'node_template': {u'name': u'jt_nn.medium'}}
]))
def test_delete_node_template(self):
rv = self.app.post('/v0.2/some-tenant-id/node-templates.json',
data=json.dumps(dict(
node_template=dict(
name='test-template-2',
node_type='JT+NN',
flavor_id='test_flavor_2',
job_tracker={
'heap_size': '1234'
},
name_node={
'heap_size': '2345'
}
))))
self.assertEquals(rv.status_code, 202)
data = json.loads(rv.data)
data = data['node_template']
node_template_id = data.pop(u'id')
rv = self.app.get(
'/v0.2/some-tenant-id/node-templates/%s.json' % node_template_id)
self.assertEquals(rv.status_code, 200)
data = json.loads(rv.data)
data = data['node_template']
# clean all ids
del data[u'id']
self.assertEquals(data, {
u'job_tracker': {
u'heap_size': u'1234'
}, u'name': u'test-template-2',
u'node_type': {
u'processes': [
u'job_tracker', u'name_node'
],
u'name': u'JT+NN'
},
u'flavor_id': u'test_flavor_2',
u'name_node': {
u'heap_size': u'2345'
}
})
rv = self.app.delete(
'/v0.2/some-tenant-id/node-templates/%s.json' % node_template_id)
self.assertEquals(rv.status_code, 204)
rv = self.app.get(
'/v0.2/some-tenant-id/node-templates/%s.json' % node_template_id)
self.assertEquals(rv.status_code, 404)
def test_delete_cluster(self):
rv = self.app.post('/v0.2/some-tenant-id/clusters.json',
data=json.dumps(dict(
cluster=dict(
name='test-cluster-2',
base_image_id='base-image-id_2',
node_templates={
'jt_nn.medium': 1,
'tt_dn.small': 5
}
))))
self.assertEquals(rv.status_code, 202)
data = json.loads(rv.data)
data = data['cluster']
cluster_id = data.pop(u'id')
rv = self.app.get('/v0.2/some-tenant-id/clusters/%s.json' % cluster_id)
self.assertEquals(rv.status_code, 200)
data = json.loads(rv.data)
data = data['cluster']
# delete all ids
del data[u'id']
self.assertEquals(data, {
u'status': u'Starting',
u'service_urls': {},
u'name': u'test-cluster-2',
u'base_image_id': u'base-image-id_2',
u'node_templates': {
u'jt_nn.medium': 1,
u'tt_dn.small': 5
},
u'nodes': []
})
rv = self.app.delete(
'/v0.2/some-tenant-id/clusters/%s.json' % cluster_id)
self.assertEquals(rv.status_code, 204)
eventlet.sleep(1)
rv = self.app.get('/v0.2/some-tenant-id/clusters/%s.json' % cluster_id)
self.assertEquals(rv.status_code, 404)
def _sorted_nodes(nodes):
return sorted(nodes, key=lambda elem: elem[u'node_template'][u'name'])
def _get_templates_stub_data():
return {
u'node_templates': [
{
u'job_tracker': {
u'heap_size': u'896'
},
u'name': u'jt_nn.small',
u'node_type': {
u'processes': [
u'job_tracker', u'name_node'
],
u'name': u'JT+NN'
},
u'flavor_id': u'm1.small',
u'name_node': {
u'heap_size': u'896'
}
},
{
u'job_tracker': {
u'heap_size': u'1792'
},
u'name': u'jt_nn.medium',
u'node_type': {
u'processes': [
u'job_tracker', u'name_node'
], u'name': u'JT+NN'
},
u'flavor_id': u'm1.medium',
u'name_node': {
u'heap_size': u'1792'
}
},
{
u'name': u'tt_dn.small',
u'task_tracker': {
u'heap_size': u'896'
},
u'data_node': {
u'heap_size': u'896'
},
u'node_type': {
u'processes': [
u'task_tracker', u'data_node'
],
u'name': u'TT+DN'
},
u'flavor_id': u'm1.small'
},
{
u'name': u'tt_dn.medium',
u'task_tracker': {
u'heap_size': u'1792',
},
u'data_node': {
u'heap_size': u'1792'
},
u'node_type': {
u'processes': [
u'task_tracker', u'data_node'
],
u'name': u'TT+DN'
},
u'flavor_id': u'm1.medium'
}
]
}
if __name__ == '__main__':
unittest.main()