[openstack-nova] Fix compute_node_get_all() for Nova Baremetal

Nikola Dipanov ndipanov at fedoraproject.org
Tue Sep 10 10:57:46 UTC 2013


commit 6074f7b15e089d76d0531584f4c465a15f177ff1
Author: Nikola Dipanov <ndipanov at redhat.com>
Date:   Tue Sep 10 13:02:27 2013 +0200

    Fix compute_node_get_all() for Nova Baremetal

 ...x-compute_node_get_all-for-Nova-Baremetal.patch |   90 ++++++++++++++++++++
 openstack-nova.spec                                |    7 ++-
 2 files changed, 96 insertions(+), 1 deletions(-)
---
diff --git a/0004-Fix-compute_node_get_all-for-Nova-Baremetal.patch b/0004-Fix-compute_node_get_all-for-Nova-Baremetal.patch
new file mode 100644
index 0000000..d459e17
--- /dev/null
+++ b/0004-Fix-compute_node_get_all-for-Nova-Baremetal.patch
@@ -0,0 +1,90 @@
+From d8a90df043df32254f3274dbab12da94dc0fa02e Mon Sep 17 00:00:00 2001
+From: Roman Podolyaka <rpodolyaka at mirantis.com>
+Date: Fri, 6 Sep 2013 15:27:07 +0300
+Subject: [PATCH] Fix compute_node_get_all() for Nova Baremetal
+
+Change Ie5ef00c974b810336787e88c78c93c15ca2890d3 introduced
+a regression leading to KeyError when a new baremetal node
+is scheduled. This is due to the fact, that the mentioned
+change assumes, that ComputeNode <--> Service is a 1-1
+relationship, which is not true for Nova Baremetal driver.
+
+This patch fixes the tables join in compute_node_get_all()
+DB API method to work with 1-M relationship between ComputeNode
+and Service models.
+
+Closes-Bug: #1221620
+
+Change-Id: I7c218d06f63cc2bf7d0e358f2f76366601179b0c
+---
+ nova/db/sqlalchemy/api.py    | 15 ++++++++++-----
+ nova/tests/db/test_db_api.py | 27 +++++++++++++++++++++++++++
+ 2 files changed, 37 insertions(+), 5 deletions(-)
+
+diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
+index 70dfdc5..903b31f 100644
+--- a/nova/db/sqlalchemy/api.py
++++ b/nova/db/sqlalchemy/api.py
+@@ -554,14 +554,19 @@ def compute_node_get_all(context, no_date_fields):
+         stat_rows = conn.execute(stat_query).fetchall()
+ 
+     # NOTE(msdubov): Transferring sqla.RowProxy objects to dicts.
+-    compute_nodes = [dict(proxy.items()) for proxy in compute_node_rows]
+-    services = [dict(proxy.items()) for proxy in service_rows]
+     stats = [dict(proxy.items()) for proxy in stat_rows]
+ 
+     # Join ComputeNode & Service manually.
+-    # NOTE(msdubov): ComputeNodes and Services map 1-to-1.
+-    for node, service in itertools.izip(compute_nodes, services):
+-        node['service'] = service
++    services = {}
++    for proxy in service_rows:
++        services[proxy['id']] = dict(proxy.items())
++
++    compute_nodes = []
++    for proxy in compute_node_rows:
++        node = dict(proxy.items())
++        node['service'] = services.get(proxy['service_id'])
++
++        compute_nodes.append(node)
+ 
+     # Join ComputeNode & ComputeNodeStat manually.
+     # NOTE(msdubov): ComputeNode and ComputeNodeStat map 1-to-Many.
+diff --git a/nova/tests/db/test_db_api.py b/nova/tests/db/test_db_api.py
+index 370e192..2d5b892 100644
+--- a/nova/tests/db/test_db_api.py
++++ b/nova/tests/db/test_db_api.py
+@@ -5261,6 +5261,33 @@ class ComputeNodeTestCase(test.TestCase, ModelsObjectComparatorMixin):
+             new_stats = self._stats_as_dict(node['stats'])
+             self._stats_equal(self.stats, new_stats)
+ 
++    def test_compute_node_get_all_mult_compute_nodes_one_service_entry(self):
++        service_data = self.service_dict.copy()
++        service_data['host'] = 'host2'
++        service = db.service_create(self.ctxt, service_data)
++
++        existing_node = dict(self.item.iteritems())
++        existing_node['service'] = dict(self.service.iteritems())
++        expected = [existing_node]
++
++        for name in ['bm_node1', 'bm_node2']:
++            compute_node_data = self.compute_node_dict.copy()
++            compute_node_data['service_id'] = service['id']
++            compute_node_data['stats'] = self.stats
++            compute_node_data['hypervisor_hostname'] = 'bm_node_1'
++            node = db.compute_node_create(self.ctxt, compute_node_data)
++
++            node = dict(node.iteritems())
++            node['service'] = dict(service.iteritems())
++
++            expected.append(node)
++
++        result = sorted(db.compute_node_get_all(self.ctxt, False),
++                        key=lambda n: n['hypervisor_hostname'])
++
++        self._assertEqualListsOfObjects(expected, result,
++                                        ignored_keys=['stats'])
++
+     def test_compute_node_get(self):
+         compute_node_id = self.item['id']
+         node = db.compute_node_get(self.ctxt, compute_node_id)
diff --git a/openstack-nova.spec b/openstack-nova.spec
index 5b5ebf2..210e3cb 100644
--- a/openstack-nova.spec
+++ b/openstack-nova.spec
@@ -2,7 +2,7 @@
 
 Name:             openstack-nova
 Version:          2013.2
-Release:          0.18.b3%{?dist}
+Release:          0.19.b3%{?dist}
 Summary:          OpenStack Compute (nova)
 
 Group:            Applications/System
@@ -40,6 +40,7 @@ Source30:         openstack-nova-novncproxy.sysconfig
 Patch0001: 0001-Ensure-we-don-t-access-the-net-when-building-docs.patch
 Patch0002: 0002-remove-runtime-dep-on-python-pbr.patch
 Patch0003: 0003-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch
+Patch0004: 0004-Fix-compute_node_get_all-for-Nova-Baremetal.patch
 
 BuildArch:        noarch
 BuildRequires:    intltool
@@ -393,6 +394,7 @@ This package contains documentation files for nova.
 %patch0001 -p1
 %patch0002 -p1
 %patch0003 -p1
+%patch0004 -p1
 
 find . \( -name .gitignore -o -name .placeholder \) -delete
 
@@ -899,6 +901,9 @@ fi
 %endif
 
 %changelog
+* Mon Sep 09 2013 Nikola Đipanov <ndipanov at redhat.com> - 2013.2-0.19.b3
+- Fix compute_node_get_all() for Nova Baremetal
+
 * Mon Sep 09 2013 Pádraig Brady <pbrady at redhat.com> - 2013.2-0.18.b3
 - Avoid deprecated options in distribution config files
 


More information about the scm-commits mailing list