Merge "Test case for cluster module"

This commit is contained in:
Jenkins 2015-05-11 03:00:47 +00:00 committed by Gerrit Code Review
commit afd4259b8d
2 changed files with 294 additions and 14 deletions

View File

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
import datetime
from oslo_config import cfg
from oslo_log import log as logging
from oslo_utils import timeutils
@ -78,7 +76,7 @@ class Cluster(periodic_task.PeriodicTasks):
self.data = kwargs.get('data', {})
self.metadata = kwargs.get('metadata', {})
# heathy checking
# TODO(anyone): Move these to health policy
self.detect_enabled = False
self.detect_interval = 1 # times of global periodic task interval.
self.detect_counter = 0
@ -129,7 +127,9 @@ class Cluster(periodic_task.PeriodicTasks):
db_api.cluster_update(context, self.id, values)
event_mod.info(context, self, 'update')
else:
values['init_time'] = datetime.datetime.utcnow()
timestamp = timeutils.utcnow()
self.init_time = timestamp
values['init_time'] = timestamp
cluster = db_api.cluster_create(context, values)
self.id = cluster.id
event_mod.info(context, self, 'create')
@ -226,25 +226,25 @@ class Cluster(periodic_task.PeriodicTasks):
}
return info
@classmethod
def from_dict(cls, **kwargs):
return cls(**kwargs)
def set_status(self, context, status, reason=None):
'''Set status of the cluster.'''
values = {}
now = datetime.datetime.utcnow()
now = timeutils.utcnow()
if status == self.ACTIVE and self.status == self.CREATING:
self.created_time = now
values['created_time'] = now
elif status == self.DELETED:
self.deleted_time = now
values['deleted_time'] = now
elif status == self.ACTIVE and self.status == self.UPDATING:
self.updated_time = now
values['updated_time'] = now
self.status = status
values['status'] = status
if reason:
self.status_reason = reason
values['status_reason'] = reason
db_api.cluster_update(context, self.id, values)
@ -268,7 +268,8 @@ class Cluster(periodic_task.PeriodicTasks):
Set cluster status to DELETED.
'''
db_api.cluster_delete(context, self.id)
self.set_status(context, self.DELETING, reason='Deletion in progress')
return True
def do_update(self, context, **kwargs):
@ -276,10 +277,7 @@ class Cluster(periodic_task.PeriodicTasks):
This method is intended to be called only from an action.
'''
kwargs['status_reason'] = 'Updating in progress'
kwargs['status'] = self.UPDATING
kwargs['updated_time'] = datetime.datetime.utcnow()
db_api.cluster_update(context, self.id, kwargs)
self.set_status(context, self.UPDATING, reason='Update in progress')
# TODO(anyone): generate event record
return True

View File

@ -0,0 +1,282 @@
# 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.
from oslo_config import cfg
import six
from senlin.common import exception
from senlin.db.sqlalchemy import api as db_api
from senlin.engine import cluster as clusterm
from senlin.engine import event as eventm
from senlin.tests.common import base
from senlin.tests.common import utils
class TestCluster(base.SenlinTestCase):
def setUp(self):
super(TestCluster, self).setUp()
self.context = utils.dummy_context()
self.profile = self._create_profile('PROFILE_ID')
def _create_cluster(self, cluster_id):
values = {
'id': cluster_id,
'profile_id': self.profile.id,
'name': 'test-cluster',
'user': self.context.user,
'project': self.context.project,
}
return db_api.cluster_create(self.context, values)
def _create_profile(self, policy_id):
values = {
'id': policy_id,
'type': 'os.heat.stack',
'name': 'test-profile',
'context': self.context.to_dict()
}
return db_api.profile_create(self.context, values)
def test_cluster_init(self):
cluster = clusterm.Cluster('test-cluster', 0, 'PROFILE_ID')
self.assertIsNone(cluster.id)
self.assertEqual('test-cluster', cluster.name)
self.assertEqual('PROFILE_ID', cluster.profile_id)
self.assertEqual('', cluster.user)
self.assertEqual('', cluster.project)
self.assertEqual('', cluster.domain)
self.assertEqual('', cluster.parent)
self.assertIsNone(cluster.init_time)
self.assertIsNone(cluster.created_time)
self.assertIsNone(cluster.updated_time)
self.assertIsNone(cluster.deleted_time)
self.assertEqual(0, cluster.min_size)
self.assertEqual(-1, cluster.max_size)
self.assertEqual(0, cluster.desired_capacity)
self.assertEqual(1, cluster.next_index)
self.assertEqual(cfg.CONF.default_action_timeout, cluster.timeout)
self.assertEqual('INIT', cluster.status)
self.assertEqual('Initializing', cluster.status_reason)
self.assertEqual({}, cluster.data)
self.assertEqual({}, cluster.metadata)
self.assertEqual({}, cluster.rt)
def test_cluster_store_init(self):
mock_info = self.patchobject(eventm, 'info')
cluster = clusterm.Cluster('test-cluster', 0, self.profile.id,
user=self.context.user,
project=self.context.project)
self.assertIsNone(cluster.id)
cluster_id = cluster.store(self.context)
self.assertIsNotNone(cluster_id)
result = db_api.cluster_get(self.context, cluster_id=cluster_id)
self.assertIsNotNone(result)
self.assertEqual('test-cluster', result.name)
self.assertEqual(self.profile.id, result.profile_id)
self.assertEqual(self.context.user, result.user)
self.assertEqual(self.context.project, result.project)
self.assertEqual('', result.domain)
self.assertEqual('', result.parent)
self.assertIsNotNone(result.init_time)
self.assertIsNone(result.created_time)
self.assertIsNone(result.updated_time)
self.assertIsNone(result.deleted_time)
self.assertEqual(0, result.min_size)
self.assertEqual(-1, result.max_size)
self.assertEqual(0, result.desired_capacity)
self.assertEqual(1, result.next_index)
self.assertEqual(cfg.CONF.default_action_timeout, result.timeout)
self.assertEqual('INIT', result.status)
self.assertEqual('Initializing', result.status_reason)
self.assertEqual({}, result.data)
self.assertEqual({}, result.meta_data)
mock_info.assert_called_once_with(self.context, cluster, 'create')
def test_cluster_store_update(self):
mock_info = self.patchobject(eventm, 'info')
cluster = clusterm.Cluster('test-cluster', 0, self.profile.id,
user=self.context.user,
project=self.context.project)
self.assertIsNone(cluster.id)
cluster_id = cluster.store(self.context)
self.assertIsNotNone(cluster_id)
mock_info.assert_called_once_with(self.context, cluster, 'create')
mock_info.reset_mock()
# do an update
cluster.name = 'test-cluster-1'
cluster.parent = 'another-cluster'
cluster.min_size = 1
cluster.max_size = 3
cluster.desired_capacity = 2
cluster.timeout = 120
cluster.data = {'FOO': 'BAR'}
cluster.metadata = {'KEY': 'VALUE'}
new_id = cluster.store(self.context)
self.assertEqual(cluster_id, new_id)
result = db_api.cluster_get(self.context, cluster_id)
self.assertIsNotNone(result)
self.assertEqual('test-cluster-1', result.name)
self.assertEqual(self.context.user, result.user)
self.assertEqual(self.context.project, result.project)
self.assertEqual('another-cluster', result.parent)
self.assertEqual(1, result.min_size)
self.assertEqual(3, result.max_size)
self.assertEqual(2, result.desired_capacity)
self.assertEqual(120, result.timeout)
self.assertEqual({'FOO': 'BAR'}, result.data)
self.assertEqual({'KEY': 'VALUE'}, result.meta_data)
mock_info.assert_called_once_with(self.context, cluster, 'update')
def test_cluster_load(self):
ex = self.assertRaises(exception.ClusterNotFound,
clusterm.Cluster.load,
self.context, 'non-existent', None)
self.assertEqual('The cluster (non-existent) could not be found.',
six.text_type(ex))
cluster = self._create_cluster('CLUSTER_ID')
result = clusterm.Cluster.load(self.context, 'CLUSTER_ID')
self.assertEqual(cluster.id, result.id)
self.assertEqual(cluster.name, result.name)
self.assertEqual(cluster.user, result.user)
self.assertEqual(cluster.project, result.project)
self.assertEqual(cluster.domain, result.domain)
self.assertEqual(cluster.parent, result.parent)
self.assertEqual(cluster.init_time, result.init_time)
self.assertEqual(cluster.created_time, result.created_time)
self.assertEqual(cluster.updated_time, result.updated_time)
self.assertEqual(cluster.deleted_time, result.deleted_time)
self.assertEqual(cluster.min_size, result.min_size)
self.assertEqual(cluster.max_size, result.max_size)
self.assertEqual(cluster.desired_capacity, result.desired_capacity)
self.assertEqual(cluster.next_index, result.next_index)
self.assertEqual(cluster.profile_id, result.profile_id)
self.assertEqual(cluster.status, result.status)
self.assertEqual(cluster.status_reason, result.status_reason)
self.assertEqual(cluster.data, result.data)
self.assertEqual(cluster.meta_data, result.metadata)
def test_cluster_load_all(self):
result = clusterm.Cluster.load_all(self.context)
self.assertEqual([], [c for c in result])
cluster1 = self._create_cluster('CLUSTER1')
cluster2 = self._create_cluster('CLUSTER2')
# NOTE: we don't test all other parameters because the db api tests
# already covered that
result = clusterm.Cluster.load_all(self.context)
clusters = [c for c in result]
self.assertEqual(2, len(clusters))
self.assertEqual(cluster1.id, clusters[0].id)
self.assertEqual(cluster2.id, clusters[1].id)
def test_cluster_to_dict(self):
cluster = self._create_cluster('CLUSTER123')
self.assertIsNotNone(cluster.id)
expected = {
'id': cluster.id,
'name': cluster.name,
'profile_id': cluster.profile_id,
'user': cluster.user,
'project': cluster.project,
'domain': cluster.domain,
'parent': cluster.parent,
'init_time': cluster.init_time,
'created_time': cluster.created_time,
'updated_time': cluster.updated_time,
'deleted_time': cluster.deleted_time,
'min_size': cluster.min_size,
'max_size': cluster.max_size,
'desired_capacity': cluster.desired_capacity,
'timeout': cluster.timeout,
'status': cluster.status,
'status_reason': cluster.status_reason,
'metadata': cluster.meta_data,
'data': cluster.data,
'nodes': [],
'policies': [],
'profile_name': self.profile.name,
}
result = clusterm.Cluster.load(self.context, cluster_id='CLUSTER123')
self.assertEqual(expected, result.to_dict())
def test_cluster_set_status(self):
cluster = clusterm.Cluster('test-cluster', 0, self.profile.id,
project=self.context.project)
cluster.store(self.context)
self.assertEqual(clusterm.Cluster.INIT, cluster.status)
self.assertIsNotNone(cluster.init_time)
self.assertIsNone(cluster.created_time)
self.assertIsNone(cluster.updated_time)
# create
cluster.do_create(self.context)
self.assertEqual(cluster.CREATING, cluster.status)
self.assertEqual('Creation in progress', cluster.status_reason)
self.assertIsNone(cluster.created_time)
self.assertIsNone(cluster.updated_time)
cluster.set_status(self.context, cluster.ACTIVE, 'Creation succeeded')
self.assertEqual(cluster.ACTIVE, cluster.status)
self.assertEqual('Creation succeeded', cluster.status_reason)
self.assertIsNotNone(cluster.created_time)
self.assertIsNone(cluster.updated_time)
# update
cluster.do_update(self.context)
self.assertEqual(cluster.UPDATING, cluster.status)
self.assertEqual('Update in progress', cluster.status_reason)
self.assertIsNotNone(cluster.created_time)
self.assertIsNone(cluster.updated_time)
cluster.set_status(self.context, cluster.ACTIVE, 'Update succeeded')
self.assertEqual(cluster.ACTIVE, cluster.status)
self.assertEqual('Update succeeded', cluster.status_reason)
self.assertIsNotNone(cluster.created_time)
self.assertIsNotNone(cluster.updated_time)
# Delete
cluster.do_delete(self.context)
self.assertEqual(cluster.DELETING, cluster.status)
self.assertEqual('Deletion in progress', cluster.status_reason)
self.assertIsNone(cluster.deleted_time)
cluster.set_status(self.context, cluster.DELETED, 'Deletion succeeded')
self.assertEqual(cluster.DELETED, cluster.status)
self.assertEqual('Deletion succeeded', cluster.status_reason)
self.assertIsNotNone(cluster.created_time)
self.assertIsNotNone(cluster.updated_time)
self.assertIsNotNone(cluster.deleted_time)