mistral/functionaltests/api/base.py

194 lines
6.2 KiB
Python

# Copyright 2013 Mirantis, Inc.
# All Rights Reserved.
#
# 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 json
import os
import time
from tempest import clients
from tempest.common import rest_client
from tempest import config
from tempest import exceptions
import tempest.test
CONF = config.CONF
class MistralClient(rest_client.RestClient):
def __init__(self, auth_provider):
super(MistralClient, self).__init__(auth_provider)
self.service = 'workflow_service'
self.endpoint_url = 'publicURL'
def get_list_obj(self, name):
resp, body = self.get(name)
return resp, json.loads(body)
def create_obj(self, path, name):
post_body = '{"name": "%s"}' % name
resp, body = self.post(path, post_body)
return resp, json.loads(body)
def delete_obj(self, path, name):
return self.delete('{path}/{name}'.format(path=path, name=name))
def update_obj(self, path, name):
post_body = '{"name": "%s"}' % (name + 'updated')
resp, body = self.put('{path}/{name}'.format(path=path, name=name),
post_body)
return resp, json.loads(body)
def get_workbook_definition(self, name):
headers = {'X-Auth-Token': self.auth_provider.get_token()}
return self.get('workbooks/{name}/definition'.format(name=name),
headers)
def upload_workbook_definition(self, name):
headers = {'Content-Type': 'text/plain',
'X-Auth-Token': self.auth_provider.get_token()}
__location = os.path.realpath(os.path.join(os.getcwd(),
os.path.dirname(__file__)))
file = open(os.path.join(__location, 'v1/demo.yaml'), 'rb').read()
return self.put('workbooks/{name}/definition'.format(name=name),
file, headers)
def create_execution(self, workbook_name, body):
return self.post('workbooks/{name}/executions'.format(
name=workbook_name), json.dumps(body))
def get_execution(self, workbook_name, execution_id):
return self.get('/workbooks/{name}/executions/{execution}'.format(
name=workbook_name, execution=execution_id))
def update_execution(self, workbook_name, execution_id, put_body):
return self.put('/workbooks/{name}/executions/{execution}'.format(
name=workbook_name, execution=execution_id), json.dumps(put_body))
def get_tasks_list(self, workbook_name, execution_id):
resp, body = self.get(
'/workbooks/{name}/executions/{execution}/tasks'.format(
name=workbook_name,
execution=execution_id))
return resp, json.loads(body)['tasks']
def get_task(self, workbook_name, execution_id, task_id):
resp, body = self.get(
'/workbooks/{name}/executions/{execution}/tasks/{task}'.format(
name=workbook_name,
execution=execution_id,
task=task_id))
return resp, json.loads(body)
def update_task(self, workbook_name, execution_id, task_id, put_body):
resp, body = self.put(
'/workbooks/{name}/executions/{execution}/tasks/{task}'.format(
name=workbook_name,
execution=execution_id,
task=task_id), json.dumps(put_body))
return resp, json.loads(body)
class TestCase(tempest.test.BaseTestCase):
@classmethod
def setUpClass(cls):
"""This method allows to initialize authentication before
each test case and define parameters of Mistral API Service.
"""
super(TestCase, cls).setUpClass()
cls.mgr = clients.Manager()
cls.client = MistralClient(cls.mgr.auth_provider)
def setUp(self):
super(TestCase, self).setUp()
self.obj = []
def tearDown(self):
super(TestCase, self).tearDown()
for i in self.obj:
try:
self.client.delete_obj(i[0], i[1])
except exceptions.NotFound:
pass
class TestCaseAdvanced(TestCase):
@classmethod
def setUpClass(cls):
super(TestCaseAdvanced, cls).setUpClass()
cls.server_client = cls.mgr.servers_client
cls.image_ref = CONF.compute.image_ref
cls.flavor_ref = CONF.compute.flavor_ref
def setUp(self):
super(TestCaseAdvanced, self).setUp()
self.server_ids = []
self.client.create_obj('workbooks', 'test123')
self.obj.append(['workbooks', 'test123'])
self.client.upload_workbook_definition('test123')
def tearDown(self):
super(TestCaseAdvanced, self).tearDown()
for server_id in self.server_ids:
try:
self.server_client.delete_server(server_id)
self.server_client.wait_for_server_termination(server_id)
except exceptions.NotFound:
pass
def _create_execution(self, workbook_name, server_name):
nova_url = "/".join(self.server_client.base_url.split('/')[:-1])
context = {
"server_name": server_name,
"nova_url": nova_url,
"image_id": self.image_ref,
"flavor_id": self.flavor_ref
}
post_body = {
"workbook_name": workbook_name,
"task": "create-vm",
"context": json.dumps(context)
}
resp, body = self.client.create_execution(workbook_name, post_body)
while not self.server_client.list_servers()[1]['servers']:
time.sleep(2)
for server in self.server_client.list_servers()[1]['servers']:
if server['name'] == server_name:
self.server_ids.append(server['id'])
return resp, json.loads(body)