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:
parent
fece78c046
commit
648571cfe4
|
@ -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")
|
||||
|
|
|
@ -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: []
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
})
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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']},
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue