Merge "Adding functional test cases for Kubernetes APIs"

This commit is contained in:
Jenkins 2015-06-29 13:41:54 +00:00 committed by Gerrit Code Review
commit c80e24203f
2 changed files with 121 additions and 20 deletions

View File

@ -70,7 +70,7 @@ nova keypair-add default
# Run functional tests # Run functional tests
echo "Running magnum functional test suite" echo "Running magnum functional test suite"
sudo -E -H -u jenkins tox -e functional sudo -E -H -u jenkins tox -e functional -- --concurrency=1
EXIT_CODE=$? EXIT_CODE=$?
# Delete the keypair used in the functional test. # Delete the keypair used in the functional test.

View File

@ -25,11 +25,12 @@ import time
import fixtures import fixtures
from magnum.common.pythonk8sclient.client import ApivbetaApi
from magnum.common.pythonk8sclient.client import swagger
from magnum.tests import base
from magnumclient.openstack.common.apiclient import exceptions from magnumclient.openstack.common.apiclient import exceptions
from magnumclient.openstack.common import cliutils from magnumclient.openstack.common import cliutils
from magnumclient.v1 import client from magnumclient.v1 import client as v1client
from magnum.tests import base
class BaseMagnumClient(base.TestCase): class BaseMagnumClient(base.TestCase):
@ -66,14 +67,14 @@ class BaseMagnumClient(base.TestCase):
cls.image_id = image_id cls.image_id = image_id
cls.nic_id = nic_id cls.nic_id = nic_id
cls.cs = client.Client(username=user, cls.cs = v1client.Client(username=user,
api_key=passwd, api_key=passwd,
project_id=tenant_id, project_id=tenant_id,
project_name=tenant, project_name=tenant,
auth_url=auth_url, auth_url=auth_url,
service_type='container', service_type='container',
region_name=region_name, region_name=region_name,
magnum_url=magnum_url) magnum_url=magnum_url)
@classmethod @classmethod
def _wait_on_status(cls, bay, wait_status, finish_status): def _wait_on_status(cls, bay, wait_status, finish_status):
@ -88,9 +89,9 @@ class BaseMagnumClient(base.TestCase):
raise Exception("Unknown Status : %s" % status) raise Exception("Unknown Status : %s" % status)
@classmethod @classmethod
def _create_baymodel(cls): def _create_baymodel(cls, name):
baymodel = cls.cs.baymodels.create( baymodel = cls.cs.baymodels.create(
name='default', name=name,
keypair_id='default', keypair_id='default',
external_network_id=cls.nic_id, external_network_id=cls.nic_id,
image_id=cls.image_id, image_id=cls.image_id,
@ -101,9 +102,9 @@ class BaseMagnumClient(base.TestCase):
return baymodel return baymodel
@classmethod @classmethod
def _create_bay(cls, baymodel_uuid, wait=True): def _create_bay(cls, name, baymodel_uuid, wait=True):
bay = cls.cs.bays.create( bay = cls.cs.bays.create(
name='k8s', name=name,
baymodel_id=baymodel_uuid, baymodel_id=baymodel_uuid,
node_count=None, node_count=None,
) )
@ -149,7 +150,7 @@ class TestListResources(BaseMagnumClient):
class TestBayModelResource(BaseMagnumClient): class TestBayModelResource(BaseMagnumClient):
def test_bay_model_create_and_delete(self): def test_bay_model_create_and_delete(self):
baymodel = self._create_baymodel() baymodel = self._create_baymodel('testbaymodel')
list = [item.uuid for item in self.cs.baymodels.list()] list = [item.uuid for item in self.cs.baymodels.list()]
self.assertTrue(baymodel.uuid in list) self.assertTrue(baymodel.uuid in list)
@ -171,7 +172,7 @@ class TestBayResource(BaseMagnumClient):
if test_timeout > 0: if test_timeout > 0:
self.useFixture(fixtures.Timeout(test_timeout, gentle=True)) self.useFixture(fixtures.Timeout(test_timeout, gentle=True))
self.baymodel = self._create_baymodel() self.baymodel = self._create_baymodel('testbay')
def tearDown(self): def tearDown(self):
super(TestBayResource, self).tearDown() super(TestBayResource, self).tearDown()
@ -181,7 +182,7 @@ class TestBayResource(BaseMagnumClient):
pass pass
def test_bay_create_and_delete(self): def test_bay_create_and_delete(self):
bay = self._create_bay(self.baymodel.uuid) bay = self._create_bay('testbay', self.baymodel.uuid)
list = [item.uuid for item in self.cs.bays.list()] list = [item.uuid for item in self.cs.bays.list()]
self.assertTrue(bay.uuid in list) self.assertTrue(bay.uuid in list)
@ -196,8 +197,108 @@ class TestBayResource(BaseMagnumClient):
self._wait_on_status(bay, self._wait_on_status(bay,
["CREATE_COMPLETE", ["CREATE_COMPLETE",
"DELETE_IN_PROGRESS"], "DELETE_IN_PROGRESS"],
["DELETE_FAILED", ["DELETE_FAILED", "CREATE_FAILED",
"DELETE_COMPLETE"]) "DELETE_COMPLETE"])
except exceptions.NotFound: except exceptions.NotFound:
# if bay/get fails, the bay has been deleted already # if bay/get fails, the bay has been deleted already
pass pass
class TestKubernetesAPIs(BaseMagnumClient):
@classmethod
def setUpClass(cls):
super(TestKubernetesAPIs, cls).setUpClass()
cls.baymodel = cls._create_baymodel('testk8sAPI')
cls.bay = cls._create_bay('testk8sAPI', cls.baymodel.uuid)
kube_master_ip = cls.cs.bays.get(cls.bay.uuid).api_address
kube_master_url = 'http://%s:8080' % kube_master_ip
k8s_client = swagger.ApiClient(kube_master_url)
cls.k8s_api = ApivbetaApi.ApivbetaApi(k8s_client)
@classmethod
def tearDownClass(cls):
cls._delete_bay(cls.bay.uuid)
try:
cls._wait_on_status(cls.bay,
["CREATE_COMPLETE",
"DELETE_IN_PROGRESS"],
["DELETE_FAILED", "CREATE_FAILED",
"DELETE_COMPLETE"])
except exceptions.NotFound:
pass
cls._delete_baymodel(cls.baymodel.uuid)
def test_pod_apis(self):
pod_manifest = {'apiVersion': 'v1beta3',
'kind': 'Pod',
'metadata': {'color': 'blue', 'name': 'test'},
'spec': {'containers': [{'image': 'dockerfile/redis',
'name': 'redis'}]}}
resp = self.k8s_api.createPod(body=pod_manifest, namespaces='default')
self.assertEqual(resp.metadata['name'], 'test')
self.assertTrue(resp.status.phase)
resp = self.k8s_api.readPod(name='test', namespaces='default')
self.assertEqual(resp.metadata['name'], 'test')
self.assertTrue(resp.status.phase)
resp = self.k8s_api.deletePod(name='test', namespaces='default')
self.assertFalse(resp.phase)
def test_service_apis(self):
service_manifest = {'apiVersion': 'v1beta3',
'kind': 'Service',
'metadata': {'labels': {'name': 'frontend'},
'name': 'frontend',
'resourceversion': 'v1beta3'},
'spec': {'ports': [{'port': 80,
'protocol': 'TCP',
'targetPort': 80}],
'selector': {'name': 'frontend'}}}
resp = self.k8s_api.createService(body=service_manifest,
namespaces='default')
self.assertEqual(resp.metadata['name'], 'frontend')
self.assertTrue(resp.status)
resp = self.k8s_api.readService(name='frontend', namespaces='default')
self.assertEqual(resp.metadata['name'], 'frontend')
self.assertTrue(resp.status)
resp = self.k8s_api.deleteService(name='frontend',
namespaces='default')
# TODO(madhuri) Currently the V1beta3_ServiceStatus
# has no attribute defined. Uncomment this assertion
# when the class is redefined to contain 'phase'.
# self.assertTrue(resp.phase)
def test_replication_controller_apis(self):
rc_manifest = {
'apiVersion': 'v1beta3',
'kind': 'ReplicationController',
'metadata': {'labels': {'name': 'frontend'},
'name': 'frontend'},
'spec': {'replicas': 2,
'selector': {'name': 'frontend'},
'template': {'metadata': {
'labels': {'name': 'frontend'}},
'spec': {'containers': [{
'image': 'nginx',
'name': 'nginx',
'ports': [{'containerPort': 80,
'protocol': 'TCP'}]}]}}}}
resp = self.k8s_api.createReplicationController(body=rc_manifest,
namespaces='default')
self.assertEqual(resp.metadata['name'], 'frontend')
self.assertEqual(resp.spec.replicas, 2)
resp = self.k8s_api.readReplicationController(name='frontend',
namespaces='default')
self.assertEqual(resp.metadata['name'], 'frontend')
self.assertEqual(resp.spec.replicas, 2)
resp = self.k8s_api.deleteReplicationController(name='frontend',
namespaces='default')
self.assertFalse(resp.replicas)