diff --git a/nailgun/nailgun/db/migration/alembic_migrations/versions/fuel_9_2.py b/nailgun/nailgun/db/migration/alembic_migrations/versions/fuel_9_2.py index 6556af6335..06e95346e0 100644 --- a/nailgun/nailgun/db/migration/alembic_migrations/versions/fuel_9_2.py +++ b/nailgun/nailgun/db/migration/alembic_migrations/versions/fuel_9_2.py @@ -241,11 +241,15 @@ DEFAULT_RELEASE_BOND_ATTRIBUTES = { } } +# minimal RAM amount for OVS+DPDK in MB MIN_DPDK_HUGEPAGES_MEMORY = 1024 # version of Fuel when security group switch was added FUEL_SECURITY_GROUPS_VERSION = '9.0' +# version of Fuel when DPDK hugepages was introduced +FUEL_DPDK_HUGEPAGES_VERSION = '9.0' + def update_vmware_attributes_metadata(upgrade): connection = op.get_bind() @@ -401,14 +405,16 @@ def upgrade_cluster_attributes(connection): def upgrade_release_node_attributes(connection): select_query = sa.sql.text( - 'SELECT id, node_attributes FROM releases ' + 'SELECT id, node_attributes, version FROM releases ' 'WHERE node_attributes IS NOT NULL') update_query = sa.sql.text( 'UPDATE releases SET node_attributes = :node_attributes ' 'WHERE id = :release_id') - for release_id, node_attrs in connection.execute(select_query): + for release_id, node_attrs, version in connection.execute(select_query): + if not is_feature_supported(version, FUEL_DPDK_HUGEPAGES_VERSION): + continue node_attrs = jsonutils.loads(node_attrs) dpdk = node_attrs.setdefault('hugepages', {}).setdefault('dpdk', {}) dpdk['min'] = MIN_DPDK_HUGEPAGES_MEMORY @@ -421,14 +427,18 @@ def upgrade_release_node_attributes(connection): def upgrade_node_attributes(connection): select_query = sa.sql.text( - 'SELECT id, attributes FROM nodes ' - 'WHERE attributes IS NOT NULL') + 'SELECT nodes.id, attributes, version FROM nodes INNER JOIN clusters ' + 'ON clusters.id = nodes.cluster_id INNER JOIN releases ' + 'ON releases.id = clusters.release_id ' + 'WHERE nodes.attributes IS NOT NULL') update_query = sa.sql.text( 'UPDATE nodes SET attributes = :attributes ' 'WHERE id = :node_id') - for node_id, attrs in connection.execute(select_query): + for node_id, attrs, version in connection.execute(select_query): + if not is_feature_supported(version, FUEL_DPDK_HUGEPAGES_VERSION): + continue attrs = jsonutils.loads(attrs) dpdk = attrs.setdefault('hugepages', {}).setdefault('dpdk', {}) dpdk['min'] = MIN_DPDK_HUGEPAGES_MEMORY diff --git a/nailgun/nailgun/objects/node.py b/nailgun/nailgun/objects/node.py index 1ca33e48e3..755438f7e6 100644 --- a/nailgun/nailgun/objects/node.py +++ b/nailgun/nailgun/objects/node.py @@ -1578,7 +1578,7 @@ class NodeAttributes(object): """ hugepages = cls._safe_get_hugepages(node) - if (not Node.dpdk_enabled(node) and 'dpdk' not in hugepages or + if (not Node.dpdk_enabled(node) or 'dpdk' not in hugepages or not hugepages['dpdk']['value']): return {} diff --git a/nailgun/nailgun/test/unit/test_migration_fuel_9_2.py b/nailgun/nailgun/test/unit/test_migration_fuel_9_2.py index deca9077a1..eaa6beb374 100644 --- a/nailgun/nailgun/test/unit/test_migration_fuel_9_2.py +++ b/nailgun/nailgun/test/unit/test_migration_fuel_9_2.py @@ -216,6 +216,8 @@ MIN_DPDK_HUGEPAGES_VALUE = 1024 RELEASE_VERSION = '9.0' # version of Fuel when tags was introduced FUEL_TAGS_SUPPORT = '9.0' +# version of Fuel when DPDK hugepages was introduced +FUEL_DPDK_HUGEPAGES_VERSION = '9.0' NEW_ROLES_META = { 'controller': { @@ -593,22 +595,57 @@ class TestAttributesUpdate(base.BaseAlembicMigrationTest): def test_release_node_attributes_update(self): releases = self.meta.tables['releases'] results = db.execute( - sa.select([releases.c.node_attributes])) + sa.select([releases.c.node_attributes], + releases.c.id.in_( + self.get_release_ids(RELEASE_VERSION)))) for node_attrs in results: node_attrs = jsonutils.loads(node_attrs[0]) dpdk = node_attrs.setdefault('hugepages', {}).setdefault('dpdk', {}) self.assertEqual(dpdk.get('min'), MIN_DPDK_HUGEPAGES_VALUE) + def test_release_node_attributes_no_update(self): + releases = self.meta.tables['releases'] + releases_list = self.get_release_ids(RELEASE_VERSION, available=False) + results = db.execute( + sa.select([releases.c.node_attributes], + releases.c.id.in_(releases_list))) + for node_attrs in results: + node_attrs = jsonutils.loads(node_attrs[0]) + dpdk = node_attrs.setdefault('hugepages', {}).setdefault('dpdk', + {}) + self.assertEqual(dpdk.get('min'), 0) + def test_node_attributes_update(self): nodes = self.meta.tables['nodes'] + clusters = self.meta.tables['clusters'] + releases_list = self.get_release_ids(RELEASE_VERSION) results = db.execute( - sa.select([nodes.c.attributes])) + sa.select([nodes.c.attributes], + clusters.c.release_id.in_(releases_list) + ).select_from(sa.join(clusters, nodes, + clusters.c.id == + nodes.c.cluster_id))) for attrs in results: attrs = jsonutils.loads(attrs[0]) dpdk = attrs.setdefault('hugepages', {}).setdefault('dpdk', {}) self.assertEqual(dpdk.get('min'), MIN_DPDK_HUGEPAGES_VALUE) + def test_node_attributes_no_update(self): + nodes = self.meta.tables['nodes'] + clusters = self.meta.tables['clusters'] + releases_list = self.get_release_ids(RELEASE_VERSION, available=False) + results = db.execute( + sa.select([nodes.c.attributes], + clusters.c.release_id.in_(releases_list) + ).select_from(sa.join(clusters, nodes, + clusters.c.id == + nodes.c.cluster_id))) + for attrs in results: + attrs = jsonutils.loads(attrs[0]) + dpdk = attrs.setdefault('hugepages', {}).setdefault('dpdk', {}) + self.assertEqual(dpdk.get('min'), 0) + def get_release_ids(self, start_version, available=True): """Get release ids