Deny using CentOS even in experimental mode

* Set release state for CentOS to 'unavailable'
  * Add release's deployability check in cluster validator

Change-Id: Ic48ed10530efab3823018709b1e072bcfc35d891
Closes-bug: #1486559
This commit is contained in:
Fedor Zhadaev 2015-08-21 12:58:10 +03:00
parent fece78c046
commit 648571cfe4
10 changed files with 51 additions and 7 deletions

View File

@ -64,6 +64,10 @@ class ClusterValidator(BasicValidator):
if not release:
raise errors.InvalidData(
"Invalid release ID", log_message=True)
if not objects.Release.is_deployable(release):
raise errors.NotAllowed(
"Release with ID '{0}' is not deployable.".format(
release_id), log_message=True)
cls._validate_mode(d, release)
pend_release_id = d.get("pending_release_id")

View File

@ -1474,6 +1474,7 @@
extend: *base_release
fields:
name: "Kilo on CentOS 6.5"
state: "unavailable"
version: "2015.1.0-7.0"
is_deployable: false
can_update_from_versions: []

View File

@ -141,6 +141,9 @@ class Release(NailgunObject):
:param instance: a Release instance
:returns: True if a given release is deployable; otherwise - False
"""
if instance.state == consts.RELEASE_STATES.unavailable:
return False
# in experimental mode we deploy all releases
if 'experimental' in settings.VERSION['feature_groups']:
return True

View File

@ -151,6 +151,7 @@ class EnvironmentManager(object):
release_data.update({
'name': u"release_name_" + version,
'version': version,
'state': consts.RELEASE_STATES.available,
'description': u"release_desc" + version,
})

View File

@ -1642,9 +1642,9 @@ class TestHandlers(BaseIntegrationTest):
def test_occurs_error_release_is_unavailable(self):
self.env.create(
nodes_kwargs=[
{'roles': ['controller'], 'pending_addition': True}],
release_kwargs={
'state': consts.RELEASE_STATES.unavailable})
{'roles': ['controller'], 'pending_addition': True}])
self.env.clusters[0].release.state = consts.RELEASE_STATES.unavailable
resp = self.app.put(
reverse(

View File

@ -128,7 +128,8 @@ class TestHandlers(BaseIntegrationTest):
release.version = "1111-6.0"
release.name = u"release_name_" + str(release.version)
release.description = u"release_desc" + str(release.version)
release.operating_system = "CentOS"
release.operating_system = consts.RELEASE_OS.ubuntu
release.state = consts.RELEASE_STATES.available
release.networks_metadata = self.env.get_default_networks_metadata()
release.attributes_metadata = {
"editable": {

View File

@ -36,6 +36,7 @@ class TestInstallationInfo(BaseTestCase):
self.assertDictEqual(f_info, settings.VERSION)
def test_get_attributes_centos(self):
self.skipTest('CentOS is unavailable in current release.')
self.env.upload_fixtures(['openstack'])
info = InstallationInfo()
release = ReleaseCollection.filter_by(None, operating_system='CentOS')
@ -90,7 +91,8 @@ class TestInstallationInfo(BaseTestCase):
def test_clusters_info_no_vmware_attributes_exception(self):
self.env.upload_fixtures(['openstack'])
info = InstallationInfo()
release = ReleaseCollection.filter_by(None, operating_system='CentOS')
release = ReleaseCollection.filter_by(
None, operating_system=consts.RELEASE_OS.ubuntu)
nodes_params = [
{'roles': ['compute']},
{'roles': ['compute']},
@ -112,7 +114,8 @@ class TestInstallationInfo(BaseTestCase):
def test_clusters_info(self):
self.env.upload_fixtures(['openstack'])
info = InstallationInfo()
release = ReleaseCollection.filter_by(None, operating_system='CentOS')
release = ReleaseCollection.filter_by(
None, operating_system=consts.RELEASE_OS.ubuntu)
nodes_params = [
{'roles': ['compute']},
{'roles': ['compute']},

View File

@ -15,6 +15,7 @@
from mock import Mock
from mock import patch
from mock import PropertyMock
from oslo_serialization import jsonutils
from nailgun.api.v1.validators.cluster import ClusterValidator
@ -70,6 +71,13 @@ class TestClusterValidator(BaseTestCase):
self.assertRaises(errors.InvalidData,
ClusterValidator.validate, self.cluster_data)
@patch('nailgun.api.v1.validators.cluster.objects.Release.get_by_uid')
def test_release_unavailable_validation(self, release_get_by_uid):
type(release_get_by_uid.return_value).state = PropertyMock(
return_value=consts.RELEASE_STATES.unavailable)
self.assertRaises(errors.NotAllowed,
ClusterValidator.validate, self.cluster_data)
def test_pending_release_validation_success(self):
curr_release = Mock(
id=1,

View File

@ -15,6 +15,7 @@
# under the License.
import mock
from nailgun import consts
from oslo_serialization import jsonutils
from nailgun.db.sqlalchemy.models import Release
@ -99,3 +100,25 @@ class TestHandlers(BaseIntegrationTest):
)
self.assertEqual(200, resp.status_code)
self.assertEqual(resp.json_body['is_deployable'], True)
@mock.patch.dict(settings.VERSION, {'feature_groups': ['experimental']})
def test_unavailable_release_not_deployable_in_experimental(self):
# set deployable to False and state to 'unavailable'
release = self.env.create_release(api=False)
resp = self.app.put(
reverse('ReleaseHandler', kwargs={'obj_id': release.id}),
params=jsonutils.dumps({
'is_deployable': False,
'state': consts.RELEASE_STATES.unavailable
}),
headers=self.default_headers)
self.assertEqual(200, resp.status_code)
# check that release is deployable
resp = self.app.get(
reverse('ReleaseHandler', kwargs={'obj_id': release.id}),
headers=self.default_headers,
)
self.assertEqual(200, resp.status_code)
self.assertEqual(resp.json_body['is_deployable'], False)

View File

@ -132,7 +132,7 @@ casper.skipWelcomeScreen = function() {
}
casper.createCluster = function(options) {
options.release = 1; // centos
options.release = 2; // ubuntu
this.then(function() {
return this.open(baseUrl + 'api/clusters', {
method: 'post',