diff --git a/nailgun/nailgun/api/v1/validators/cluster.py b/nailgun/nailgun/api/v1/validators/cluster.py index 2cf47f79b3..430e8290ed 100644 --- a/nailgun/nailgun/api/v1/validators/cluster.py +++ b/nailgun/nailgun/api/v1/validators/cluster.py @@ -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") diff --git a/nailgun/nailgun/fixtures/openstack.yaml b/nailgun/nailgun/fixtures/openstack.yaml index 90e1c76fc8..a26af5615b 100644 --- a/nailgun/nailgun/fixtures/openstack.yaml +++ b/nailgun/nailgun/fixtures/openstack.yaml @@ -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: [] diff --git a/nailgun/nailgun/objects/release.py b/nailgun/nailgun/objects/release.py index 9793bfbf03..deb0778639 100644 --- a/nailgun/nailgun/objects/release.py +++ b/nailgun/nailgun/objects/release.py @@ -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 diff --git a/nailgun/nailgun/test/base.py b/nailgun/nailgun/test/base.py index 1c33d656ef..e6bf056463 100644 --- a/nailgun/nailgun/test/base.py +++ b/nailgun/nailgun/test/base.py @@ -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, }) diff --git a/nailgun/nailgun/test/integration/test_cluster_changes_handler.py b/nailgun/nailgun/test/integration/test_cluster_changes_handler.py index ea4b74c9c7..448c524cb1 100644 --- a/nailgun/nailgun/test/integration/test_cluster_changes_handler.py +++ b/nailgun/nailgun/test/integration/test_cluster_changes_handler.py @@ -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( diff --git a/nailgun/nailgun/test/integration/test_cluster_collection_handlers.py b/nailgun/nailgun/test/integration/test_cluster_collection_handlers.py index af6d038e68..11aa062c1e 100644 --- a/nailgun/nailgun/test/integration/test_cluster_collection_handlers.py +++ b/nailgun/nailgun/test/integration/test_cluster_collection_handlers.py @@ -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": { diff --git a/nailgun/nailgun/test/unit/fuel_statistics_tests/test_installation_info.py b/nailgun/nailgun/test/unit/fuel_statistics_tests/test_installation_info.py index 6b388233a0..3fdfe19aa3 100644 --- a/nailgun/nailgun/test/unit/fuel_statistics_tests/test_installation_info.py +++ b/nailgun/nailgun/test/unit/fuel_statistics_tests/test_installation_info.py @@ -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']}, diff --git a/nailgun/nailgun/test/unit/test_cluster_validator.py b/nailgun/nailgun/test/unit/test_cluster_validator.py index fea9273557..2c376045e5 100644 --- a/nailgun/nailgun/test/unit/test_cluster_validator.py +++ b/nailgun/nailgun/test/unit/test_cluster_validator.py @@ -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, diff --git a/nailgun/nailgun/test/unit/test_release_handler.py b/nailgun/nailgun/test/unit/test_release_handler.py index 4782342f35..c8feadacdd 100644 --- a/nailgun/nailgun/test/unit/test_release_handler.py +++ b/nailgun/nailgun/test/unit/test_release_handler.py @@ -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) diff --git a/nailgun/ui_tests/helpers.js b/nailgun/ui_tests/helpers.js index a466488264..5168d6f5bf 100644 --- a/nailgun/ui_tests/helpers.js +++ b/nailgun/ui_tests/helpers.js @@ -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',