)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"bd513d466c5b41870a163d499796b11c6c0e3695","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Part 2 of 6: blueprint general-bare-metal-provisioning-framework"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Previously, bare-metal provisioning used text files to store information of"},{"line_number":12,"context_line":"bare-metal machines. In this patch, a MySQL is used to store the information."},{"line_number":13,"context_line":"The DB is designed to support PXE/non-PXE booting methods,"},{"line_number":14,"context_line":"heterogeneous hypervisor types, and architectures. Using a MySQL makes"},{"line_number":15,"context_line":"maintenance and upgrades easier than using text files. The DB for"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FOE0%3D","line":12,"updated":"2012-10-03 17:22:41.000000000","message":"From the code it looks like this can be any DB that SQLalchemy supports.","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"0aefc3de2a311fe73dc5ee69890ea9b8ff904711","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Part 2 of 6: blueprint general-bare-metal-provisioning-framework"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Previously, bare-metal provisioning used text files to store information of"},{"line_number":12,"context_line":"bare-metal machines. In this patch, a MySQL is used to store the information."},{"line_number":13,"context_line":"The DB is designed to support PXE/non-PXE booting methods,"},{"line_number":14,"context_line":"heterogeneous hypervisor types, and architectures. Using a MySQL makes"},{"line_number":15,"context_line":"maintenance and upgrades easier than using text files. The DB for"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FN9w%3D","line":12,"in_reply_to":"AAAALH%2F%2FN%2Bo%3D","updated":"2012-10-03 20:45:12.000000000","message":"If the code only supports MySQL, then saying just MySQL works for me.  Does your code support other databases?  Also if you stay with just MySQL it should say \"a MySQL server\" or \"a MySQL database\" instead of just \"a MySQL\"","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":221,"name":"Mikyung Kang","email":"mkkang@isi.edu","username":"mkkang"},"change_message_id":"74091e0faf6316aabb7b60514bf8b0d72c935546","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Part 2 of 6: blueprint general-bare-metal-provisioning-framework"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Previously, bare-metal provisioning used text files to store information of"},{"line_number":12,"context_line":"bare-metal machines. In this patch, a MySQL is used to store the information."},{"line_number":13,"context_line":"The DB is designed to support PXE/non-PXE booting methods,"},{"line_number":14,"context_line":"heterogeneous hypervisor types, and architectures. Using a MySQL makes"},{"line_number":15,"context_line":"maintenance and upgrades easier than using text files. The DB for"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FN8M%3D","line":12,"in_reply_to":"AAAALH%2F%2FN9w%3D","updated":"2012-10-03 21:16:17.000000000","message":"I\u0027ll add \"We target only MySQL database\" and database/server wording.","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":221,"name":"Mikyung Kang","email":"mkkang@isi.edu","username":"mkkang"},"change_message_id":"5a0bc59ce61e547cc38c2e381923b296358b7b44","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Part 2 of 6: blueprint general-bare-metal-provisioning-framework"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Previously, bare-metal provisioning used text files to store information of"},{"line_number":12,"context_line":"bare-metal machines. In this patch, a MySQL is used to store the information."},{"line_number":13,"context_line":"The DB is designed to support PXE/non-PXE booting methods,"},{"line_number":14,"context_line":"heterogeneous hypervisor types, and architectures. Using a MySQL makes"},{"line_number":15,"context_line":"maintenance and upgrades easier than using text files. The DB for"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FN%2Bo%3D","line":12,"in_reply_to":"AAAALH%2F%2FOE0%3D","updated":"2012-10-03 20:40:53.000000000","message":"For fault tolerance scheme, we considered MySQL.","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"bd513d466c5b41870a163d499796b11c6c0e3695","unresolved":false,"context_lines":[{"line_number":20,"context_line":"First, the information needed for bare-metal nodes is different from"},{"line_number":21,"context_line":"that for non-bare-metal nodes. With a separate database for bare-metal nodes,"},{"line_number":22,"context_line":"the database can be customized without affecting the main Nova DB."},{"line_number":23,"context_line":"Second, fault tolerance can be embedded in bare-metal nova-compute."},{"line_number":24,"context_line":"Since one bare-metal nova-compute manages multiple bare-metal nodes,"},{"line_number":25,"context_line":"fault tolerance of a bare-metal nova-compute node is very important."},{"line_number":26,"context_line":"With a separate DB for bare-metal nodes, fault-tolerance can be achieved"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FOEs%3D","line":23,"updated":"2012-10-03 17:22:41.000000000","message":"The phrasing \u0027bare-metal nova-compute\u0027 and \u0027bare-metal nodes\u0027 is a little confusing","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"0aefc3de2a311fe73dc5ee69890ea9b8ff904711","unresolved":false,"context_lines":[{"line_number":20,"context_line":"First, the information needed for bare-metal nodes is different from"},{"line_number":21,"context_line":"that for non-bare-metal nodes. With a separate database for bare-metal nodes,"},{"line_number":22,"context_line":"the database can be customized without affecting the main Nova DB."},{"line_number":23,"context_line":"Second, fault tolerance can be embedded in bare-metal nova-compute."},{"line_number":24,"context_line":"Since one bare-metal nova-compute manages multiple bare-metal nodes,"},{"line_number":25,"context_line":"fault tolerance of a bare-metal nova-compute node is very important."},{"line_number":26,"context_line":"With a separate DB for bare-metal nodes, fault-tolerance can be achieved"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FN90%3D","line":23,"in_reply_to":"AAAALH%2F%2FN%2Bk%3D","updated":"2012-10-03 20:45:12.000000000","message":"Right, but the wording is still confusing.","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":221,"name":"Mikyung Kang","email":"mkkang@isi.edu","username":"mkkang"},"change_message_id":"31d1abd82ed3f939d2ab7952135678455898bbc6","unresolved":false,"context_lines":[{"line_number":20,"context_line":"First, the information needed for bare-metal nodes is different from"},{"line_number":21,"context_line":"that for non-bare-metal nodes. With a separate database for bare-metal nodes,"},{"line_number":22,"context_line":"the database can be customized without affecting the main Nova DB."},{"line_number":23,"context_line":"Second, fault tolerance can be embedded in bare-metal nova-compute."},{"line_number":24,"context_line":"Since one bare-metal nova-compute manages multiple bare-metal nodes,"},{"line_number":25,"context_line":"fault tolerance of a bare-metal nova-compute node is very important."},{"line_number":26,"context_line":"With a separate DB for bare-metal nodes, fault-tolerance can be achieved"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FN7I%3D","line":23,"in_reply_to":"AAAALH%2F%2FN70%3D","updated":"2012-10-03 21:35:46.000000000","message":"We\u0027re going to add sentences as follows: \n\"In bare-metal provisioning, one \u0027nova-compute\u0027 manages multiple \u0027bare-metal machines. A bare-metal machine does not run openstack at all.\"\n\nAnd, how about changing all \"bare-metal nova-compute\" to just \"nova-compute\" and \"bare-metal node\" to \"bare-metal machines\"?","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"1cdbbd61a6001c0d40ecfe00cf2643575b88449a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"First, the information needed for bare-metal nodes is different from"},{"line_number":21,"context_line":"that for non-bare-metal nodes. With a separate database for bare-metal nodes,"},{"line_number":22,"context_line":"the database can be customized without affecting the main Nova DB."},{"line_number":23,"context_line":"Second, fault tolerance can be embedded in bare-metal nova-compute."},{"line_number":24,"context_line":"Since one bare-metal nova-compute manages multiple bare-metal nodes,"},{"line_number":25,"context_line":"fault tolerance of a bare-metal nova-compute node is very important."},{"line_number":26,"context_line":"With a separate DB for bare-metal nodes, fault-tolerance can be achieved"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FN7A%3D","line":23,"in_reply_to":"AAAALH%2F%2FN7I%3D","updated":"2012-10-03 21:39:42.000000000","message":"Works for me.  Also putting this in the devref or some other documentation would be nice.","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"b533b4ad13056179c41799b12a2172e30fe91664","unresolved":false,"context_lines":[{"line_number":20,"context_line":"First, the information needed for bare-metal nodes is different from"},{"line_number":21,"context_line":"that for non-bare-metal nodes. With a separate database for bare-metal nodes,"},{"line_number":22,"context_line":"the database can be customized without affecting the main Nova DB."},{"line_number":23,"context_line":"Second, fault tolerance can be embedded in bare-metal nova-compute."},{"line_number":24,"context_line":"Since one bare-metal nova-compute manages multiple bare-metal nodes,"},{"line_number":25,"context_line":"fault tolerance of a bare-metal nova-compute node is very important."},{"line_number":26,"context_line":"With a separate DB for bare-metal nodes, fault-tolerance can be achieved"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FN70%3D","line":23,"in_reply_to":"AAAALH%2F%2FN8Y%3D","updated":"2012-10-03 21:17:47.000000000","message":"when I think \u0027bare-metal nova-compute\u0027 I think of \u0027bare-metal nodes\u0027 since for standard nova-compute it runs on each compute node.","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":221,"name":"Mikyung Kang","email":"mkkang@isi.edu","username":"mkkang"},"change_message_id":"74091e0faf6316aabb7b60514bf8b0d72c935546","unresolved":false,"context_lines":[{"line_number":20,"context_line":"First, the information needed for bare-metal nodes is different from"},{"line_number":21,"context_line":"that for non-bare-metal nodes. With a separate database for bare-metal nodes,"},{"line_number":22,"context_line":"the database can be customized without affecting the main Nova DB."},{"line_number":23,"context_line":"Second, fault tolerance can be embedded in bare-metal nova-compute."},{"line_number":24,"context_line":"Since one bare-metal nova-compute manages multiple bare-metal nodes,"},{"line_number":25,"context_line":"fault tolerance of a bare-metal nova-compute node is very important."},{"line_number":26,"context_line":"With a separate DB for bare-metal nodes, fault-tolerance can be achieved"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FN8Y%3D","line":23,"in_reply_to":"AAAALH%2F%2FN90%3D","updated":"2012-10-03 21:16:17.000000000","message":"How about using \u0027bare-metal nova-compute\u0027 and \u0027bare-metal machines\"? Still confusing?","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":221,"name":"Mikyung Kang","email":"mkkang@isi.edu","username":"mkkang"},"change_message_id":"5a0bc59ce61e547cc38c2e381923b296358b7b44","unresolved":false,"context_lines":[{"line_number":20,"context_line":"First, the information needed for bare-metal nodes is different from"},{"line_number":21,"context_line":"that for non-bare-metal nodes. With a separate database for bare-metal nodes,"},{"line_number":22,"context_line":"the database can be customized without affecting the main Nova DB."},{"line_number":23,"context_line":"Second, fault tolerance can be embedded in bare-metal nova-compute."},{"line_number":24,"context_line":"Since one bare-metal nova-compute manages multiple bare-metal nodes,"},{"line_number":25,"context_line":"fault tolerance of a bare-metal nova-compute node is very important."},{"line_number":26,"context_line":"With a separate DB for bare-metal nodes, fault-tolerance can be achieved"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAALH%2F%2FN%2Bk%3D","line":23,"in_reply_to":"AAAALH%2F%2FOEs%3D","updated":"2012-10-03 20:40:53.000000000","message":"\u0027bare-metal nova-compute\u0027 means nova-compute which manages several bare-metal nodes and \u0027bare-metal node\u0027 means an individual physical node which will be accessed by user.","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"}],"nova/tests/baremetal/bmdb/__init__.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova import context as nova_context"},{"line_number":19,"context_line":"from nova import flags"},{"line_number":20,"context_line":"from nova import test"},{"line_number":21,"context_line":"from nova.virt.baremetal import bmdb"},{"line_number":22,"context_line":"from nova.virt.baremetal.bmdb.sqlalchemy import baremetal_models"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"flags.DECLARE(\u0027baremetal_sql_connection\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv7o%3D","line":21,"updated":"2012-08-14 21:37:46.000000000","message":"Might I suggest getting rid of the \"bm\" prefix here? You can have a /nova/virt/baremetal/db/ directory instead of a /nova/virt/baremetal/bmdb/ directory -- nobody will confuse it with the main Nova database. Similarly, I would just name the models file /nova/virt/baremetal/db/sqlalchemy/models.py instead of /nova/virt/baremetal/bmdb/sqlalchemy/baremetal_models.py. The latter is just redundant.\n\nThen you can just do:\n\n from nova.virt.baremetal import db\n from nova.virt.baremetal.db import models","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":25,"context_line":"              \u0027nova.virt.baremetal.bmdb.sqlalchemy.baremetal_session\u0027)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def new_bm_node(**kwargs):"},{"line_number":29,"context_line":"    h \u003d baremetal_models.BareMetalNode()"},{"line_number":30,"context_line":"    h.id \u003d kwargs.pop(\u0027id\u0027, None)"},{"line_number":31,"context_line":"    h.service_host \u003d kwargs.pop(\u0027service_host\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv7c%3D","line":28,"updated":"2012-08-14 21:37:46.000000000","message":"Is this just for testing? If so, probably best to move it to a /nova/virt/baremetal/tests/utils.py file","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    h.prov_vlan_id \u003d kwargs.pop(\u0027prov_vlan_id\u0027, None)"},{"line_number":43,"context_line":"    h.terminal_port \u003d kwargs.pop(\u0027terminal_port\u0027, 8000)"},{"line_number":44,"context_line":"    if len(kwargs) \u003e 0:"},{"line_number":45,"context_line":"        raise Exception(\"unknown field: %s\" % \u0027,\u0027.join(kwargs.keys()))"},{"line_number":46,"context_line":"    return h"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv7U%3D","line":45,"updated":"2012-08-14 21:37:46.000000000","message":"Is a generic Exception really the best thing to raise here? What is catching this exception?","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    baremetal_models.register_models()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class BMDBTestCase(test.TestCase):"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def setUp(self):"},{"line_number":57,"context_line":"        super(BMDBTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv7M%3D","line":54,"updated":"2012-08-14 21:37:46.000000000","message":"This should move into a /nova/virt/baremetal/tests/base.py file (or similar). It doesn\u0027t belong in regular dunderinit file IMHO.","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"}],"nova/tests/baremetal/db/base.py":[{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"630090b39d92bf0d9f3b2c93e7e7a781313b617d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF.import_opt(\u0027baremetal_sql_connection\u0027,"},{"line_number":28,"context_line":"                \u0027nova.virt.baremetal.db.sqlalchemy.session\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def _reset_bmdb():"},{"line_number":32,"context_line":"    global _DB"},{"line_number":33,"context_line":"    engine \u003d bm_session.get_engine()"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAALn%2F%2FxTE%3D","line":30,"updated":"2012-11-07 13:55:37.000000000","message":"I changed the way to reset bmdb. I borrowed it from tests/__init__.py","commit_id":"eaf236c72e6e05be96e025a97472c3fdf8f7c9a2"}],"nova/tests/baremetal/db/test_bm_interface.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa21b2d2dd8f9ef5482fcead3e2361d28ee56560","unresolved":false,"context_lines":[{"line_number":25,"context_line":"class BareMetalPxeIpTestCase(base.BMDBTestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(BareMetalPxeIpTestCase, self).setUp()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_unique_address(self):"},{"line_number":31,"context_line":"        pif1_id \u003d db.bm_interface_create(self.context, 1, \u002711:11:11:11:11:11\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAALH%2F%2FnYs%3D","line":28,"updated":"2012-08-27 12:42:20.000000000","message":"You can remove this. It will be called anyway. :)","commit_id":"4ddc4ae2916ec04d14dd6cbe77abc3922e2cbe6b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa21b2d2dd8f9ef5482fcead3e2361d28ee56560","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        db.bm_interface_destroy(self.context, pif1_id)"},{"line_number":39,"context_line":"        pif2_id \u003d db.bm_interface_create(self.context, 2, \u002711:11:11:11:11:11\u0027,"},{"line_number":40,"context_line":"                                         \u00270x2\u0027, 2)"},{"line_number":41,"context_line":"        self.assertTrue(pif2_id)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def test_unique_vif_uuid(self):"},{"line_number":44,"context_line":"        pif1_id \u003d db.bm_interface_create(self.context, 1, \u002711:11:11:11:11:11\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAALH%2F%2FnYo%3D","line":41,"updated":"2012-08-27 12:42:20.000000000","message":"What are we actually asserting here? :) Should this be instead something like this:\n\n expected_id \u003d \u002712345\u0027\n self.assertEqual(expected_id, pif2_id)","commit_id":"4ddc4ae2916ec04d14dd6cbe77abc3922e2cbe6b"}],"nova/tests/baremetal/db/test_bm_node.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa21b2d2dd8f9ef5482fcead3e2361d28ee56560","unresolved":false,"context_lines":[{"line_number":25,"context_line":"class BareMetalNodesTestCase(base.BMDBTestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(BareMetalNodesTestCase, self).setUp()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def _create_nodes(self):"},{"line_number":31,"context_line":"        nodes \u003d ["}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAALH%2F%2FnYk%3D","line":28,"updated":"2012-08-27 12:42:20.000000000","message":"Not needed :)","commit_id":"4ddc4ae2916ec04d14dd6cbe77abc3922e2cbe6b"}],"nova/tests/baremetal/db/test_bm_pxe_ip.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa21b2d2dd8f9ef5482fcead3e2361d28ee56560","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class BareMetalPxeIpTestCase(base.BMDBTestCase):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def setUp(self):"},{"line_number":29,"context_line":"        super(BareMetalPxeIpTestCase, self).setUp()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _create_pxe_ip(self):"},{"line_number":32,"context_line":"        i1 \u003d utils.new_bm_pxe_ip(address\u003d\u002710.1.1.1\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAALH%2F%2FnYc%3D","line":29,"updated":"2012-08-27 12:42:20.000000000","message":"Not needed :)","commit_id":"4ddc4ae2916ec04d14dd6cbe77abc3922e2cbe6b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa21b2d2dd8f9ef5482fcead3e2361d28ee56560","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        i \u003d utils.new_bm_pxe_ip(address\u003d\u002710.1.1.1\u0027,"},{"line_number":69,"context_line":"                                server_address\u003d\u002710.1.1.101\u0027)"},{"line_number":70,"context_line":"        ref \u003d db.bm_pxe_ip_create_direct(self.context, i)"},{"line_number":71,"context_line":"        self.assertTrue(ref)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def test_bm_pxe_ip_associate(self):"},{"line_number":74,"context_line":"        self._create_pxe_ip()"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAALH%2F%2FnYY%3D","line":71,"updated":"2012-08-27 12:42:20.000000000","message":"Similar comment as previous... better to be asserting something specific, like an expected return vs. just a not-None value.","commit_id":"4ddc4ae2916ec04d14dd6cbe77abc3922e2cbe6b"}],"nova/virt/baremetal/baremetal_states.py":[{"author":{"_account_id":1711,"name":"Yun Mao","email":"yunmao@gmail.com","username":"yunmao"},"change_message_id":"c6c05696fe74f1bf88684811583395e36f246090","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"ACTIVE \u003d \u0027active\u0027"},{"line_number":30,"context_line":"BUILDING \u003d \u0027building\u0027"},{"line_number":31,"context_line":"REBUILDING \u003d \u0027rebuilding\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"SUSPENDED \u003d \u0027suspended\u0027"},{"line_number":34,"context_line":"DELETED \u003d \u0027deleted\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAALH%2F%2F2eM%3D","line":31,"updated":"2012-08-07 20:18:53.000000000","message":"The vm state has been redesigned to present only \"stable\" state as in vm_states.py. As such, there is no REBUILDING state. I wonder if it makes sense for baremetal to take a similar approach?","commit_id":"ac3708f92013c98455d29ba210fce20f0c271bab"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3a4707d3e09fa13b50f68113c5a0852e760f11c0","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"ACTIVE \u003d \u0027active\u0027"},{"line_number":30,"context_line":"BUILDING \u003d \u0027building\u0027"},{"line_number":31,"context_line":"REBUILDING \u003d \u0027rebuilding\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"SUSPENDED \u003d \u0027suspended\u0027"},{"line_number":34,"context_line":"DELETED \u003d \u0027deleted\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAALH%2F%2F2F8%3D","line":31,"in_reply_to":"AAAALH%2F%2F2eM%3D","updated":"2012-08-08 02:56:21.000000000","message":"Rebuilding might make sense as a bm specific state because of the differences in timing?  IMO I think this is a useful state, I\u0027m trying to find if this has impacts anywhere else other than inconsistency with vm_states?","commit_id":"ac3708f92013c98455d29ba210fce20f0c271bab"}],"nova/virt/baremetal/bmdb/baremetal_api.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ee96bde71aeab030eba5aacbad322d8e5510dd99","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def bm_node_get(context, bm_node_id, session\u003dNone):"},{"line_number":71,"context_line":"    return IMPL.bm_node_get(context, bm_node_id)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def bm_node_get_by_instance_uuid(context, instance_uuid, session\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAALH%2F%2F0qU%3D","line":71,"updated":"2012-08-09 16:02:18.000000000","message":"I\u0027m confused about session argument in some of these calls.  You have them in the function signature, and the sqlalchemy/api takes them and uses them, but you never pass them in to the IMPL here?\n\nDo you intend for this to *never* be used?","commit_id":"3321f707660e6a97de3f3ec426cdd2b0879a7666"},{"author":{"_account_id":602,"name":"David Kang","email":"dkang@isi.edu","username":"dkang"},"change_message_id":"d33be2ef3377f7b58dd8894ed41152eadd6dd545","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def bm_node_get(context, bm_node_id, session\u003dNone):"},{"line_number":71,"context_line":"    return IMPL.bm_node_get(context, bm_node_id)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def bm_node_get_by_instance_uuid(context, instance_uuid, session\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAALH%2F%2F0lU%3D","line":71,"in_reply_to":"AAAALH%2F%2F0qU%3D","updated":"2012-08-09 17:03:04.000000000","message":"Good point. We are fixing it now.","commit_id":"3321f707660e6a97de3f3ec426cdd2b0879a7666"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2012 NTT DOCOMO, INC."},{"line_number":4,"context_line":"# Copyright (c) 2011 X.commerce, a business unit of eBay Inc."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv7A%3D","line":1,"updated":"2012-08-14 21:37:46.000000000","message":"I recommend renaming this file to:\n\n /nova/virt/baremetal/db/api.py","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"}],"nova/virt/baremetal/bmdb/sqlalchemy/baremetal_api.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2012 NTT DOCOMO, INC."},{"line_number":4,"context_line":"# Copyright (c) 2011 X.commerce, a business unit of eBay Inc."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv64%3D","line":1,"updated":"2012-08-14 21:37:46.000000000","message":"I recommend renaming this file to:\n\n /nova/virt/baremetal/db/sqlalchemy/api.py","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from sqlalchemy.sql.expression import asc"},{"line_number":35,"context_line":"from sqlalchemy.sql.expression import desc"},{"line_number":36,"context_line":"from sqlalchemy.sql.expression import literal_column"},{"line_number":37,"context_line":"from sqlalchemy.sql import func"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"from nova.db.sqlalchemy.api import is_user_context"},{"line_number":40,"context_line":"from nova.db.sqlalchemy.api import require_admin_context"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv60%3D","line":37,"updated":"2012-08-14 21:37:46.000000000","message":"sqlalchemy imports are 3rd party imports and as such should be above the nova imports and separated by a newline. Please see HACKING guidelines.","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"}],"nova/virt/baremetal/bmdb/sqlalchemy/baremetal_models.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3a4707d3e09fa13b50f68113c5a0852e760f11c0","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    __tablename__ \u003d \u0027bm_nodes\u0027"},{"line_number":43,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    service_host \u003d Column(String(255))"},{"line_number":45,"context_line":"    instance_id \u003d Column(Integer, nullable\u003dTrue)"},{"line_number":46,"context_line":"    cpus \u003d Column(Integer)"},{"line_number":47,"context_line":"    memory_mb \u003d Column(Integer)"},{"line_number":48,"context_line":"    local_gb \u003d Column(Integer)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAALH%2F%2F2F4%3D","line":45,"updated":"2012-08-08 02:56:21.000000000","message":"Shouldn\u0027t we convert these to UUID\u0027s?  At least the instance_id  columns?","commit_id":"ac3708f92013c98455d29ba210fce20f0c271bab"},{"author":{"_account_id":67,"name":"Vish Ishaya","email":"vishvananda@gmail.com","username":"vishvananda"},"change_message_id":"4b3b2cf7f2f0a1299546a0bed9bb1f3920b168cd","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    __tablename__ \u003d \u0027bm_nodes\u0027"},{"line_number":43,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    service_host \u003d Column(String(255))"},{"line_number":45,"context_line":"    instance_id \u003d Column(Integer, nullable\u003dTrue)"},{"line_number":46,"context_line":"    cpus \u003d Column(Integer)"},{"line_number":47,"context_line":"    memory_mb \u003d Column(Integer)"},{"line_number":48,"context_line":"    local_gb \u003d Column(Integer)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAALH%2F%2F1oY%3D","line":45,"in_reply_to":"AAAALH%2F%2F2F4%3D","updated":"2012-08-08 16:43:11.000000000","message":"+1, we are trying to get rid of instance_id and use uuid everywhere.","commit_id":"ac3708f92013c98455d29ba210fce20f0c271bab"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2012 NTT DOCOMO, INC."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv6w%3D","line":1,"updated":"2012-08-14 21:37:46.000000000","message":"See earlier comment. Recommend renaming this file to:\n\n /nova/virt/baremetal/db/sqlalchemy/models.py","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    __tablename__ \u003d \u0027bm_pxe_ips\u0027"},{"line_number":61,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":62,"context_line":"    address \u003d Column(String(255))"},{"line_number":63,"context_line":"    server_address \u003d Column(String(255))"},{"line_number":64,"context_line":"    bm_node_id \u003d Column(Integer, ForeignKey(\u0027bm_nodes.id\u0027), nullable\u003dTrue)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv6c%3D","line":63,"updated":"2012-08-14 21:37:46.000000000","message":"What is the difference between address and server_address? Why not put both of these columns in the BareMetalNode table, since these are attributes of the bare metal node entity? A bare metal node cannot have \u003e1 PXE IP address can it?","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"},{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"d871c7a2fa12f58a326b619b442095e41cf0ba87","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    __tablename__ \u003d \u0027bm_pxe_ips\u0027"},{"line_number":61,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":62,"context_line":"    address \u003d Column(String(255))"},{"line_number":63,"context_line":"    server_address \u003d Column(String(255))"},{"line_number":64,"context_line":"    bm_node_id \u003d Column(Integer, ForeignKey(\u0027bm_nodes.id\u0027), nullable\u003dTrue)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2FvO4%3D","line":63,"in_reply_to":"AAAALH%2F%2Fv6c%3D","updated":"2012-08-15 14:04:42.000000000","message":"If there is not a mechanism, a user can take other users\u0027 instance by spoofing MAC/IP on a PXE network. \n\nWe implement the antispoof mechanism in the followings.\n\nIf FLAGS.baremetal_pxe_vlan_per_host is true, nova-compute uses more secure PXE networks with tagged vlan. \nOn a baremetal instance creation, a nova-compute creates a vlan interface corresponding to the target baremetal node. The nova-compute uses \u0027server_address\u0027 for the interface and runs dnsmasq on the interface(using --interface option). It creates a PXE network, and the network is used by only one server(the compute node) and one client(the baremetal node). \nAs a result, a user cannot spoof MAC/IP in this network.\n\n\u0027server_address\u0027 is set to the vlan interface. \u0027address\u0027 is offered to the baremetal node by dnsmasq.\n\nFor more detail, please see pxe.py https://review.openstack.org/#/c/11354/.\n\nOne baremetal node can have at most one PXE IP. So, those columnes can be moved to BareMetalNodes table.","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":70,"context_line":"    bm_node_id \u003d Column(Integer, ForeignKey(\u0027bm_nodes.id\u0027), nullable\u003dTrue)"},{"line_number":71,"context_line":"    address \u003d Column(String(255), unique\u003dTrue)"},{"line_number":72,"context_line":"    datapath_id \u003d Column(String(255))"},{"line_number":73,"context_line":"    port_no \u003d Column(Integer)"},{"line_number":74,"context_line":"    vif_uuid \u003d Column(String(36))"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv6Y%3D","line":72,"updated":"2012-08-14 21:37:46.000000000","message":"What does this field contain?","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"},{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"d871c7a2fa12f58a326b619b442095e41cf0ba87","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":70,"context_line":"    bm_node_id \u003d Column(Integer, ForeignKey(\u0027bm_nodes.id\u0027), nullable\u003dTrue)"},{"line_number":71,"context_line":"    address \u003d Column(String(255), unique\u003dTrue)"},{"line_number":72,"context_line":"    datapath_id \u003d Column(String(255))"},{"line_number":73,"context_line":"    port_no \u003d Column(Integer)"},{"line_number":74,"context_line":"    vif_uuid \u003d Column(String(36))"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2FvOY%3D","line":72,"in_reply_to":"AAAALH%2F%2Fv6Y%3D","updated":"2012-08-15 14:04:42.000000000","message":"\u0027datapath_id\u0027 and \u0027port_no\u0027 is for network isolation by OpenFlow. \u0027port_no\u0027 is the port number on the switch (corresponding to datapath_id) the interface connected to","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"}],"nova/virt/baremetal/bmdb/sqlalchemy/baremetal_session.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91001ac28f9166d64507aabc25d9f27a6f132bc7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2012 NTT DOCOMO, INC."},{"line_number":4,"context_line":"# Copyright 2010 United States Government as represented by the"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAALH%2F%2Fv6I%3D","line":1,"updated":"2012-08-14 21:37:46.000000000","message":"Recommend renaming this file to:\n\n /nova/virt/baremetal/db/sqlalchemy/session.py","commit_id":"a9653ee356517106574b5f7df72c58891e7cfa9c"}],"nova/virt/baremetal/db/sqlalchemy/api.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"737aab4ed47f5c650d16b47d75595d19bb09bb8e","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"@require_admin_context"},{"line_number":143,"context_line":"def bm_pxe_ip_create(context, address, server_address, session\u003dNone):"},{"line_number":144,"context_line":"    if not session:"},{"line_number":145,"context_line":"        session \u003d get_session()"},{"line_number":146,"context_line":"    ref \u003d model_query(context, models.BareMetalPxeIp,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAALH%2F%2FsAU%3D","line":143,"updated":"2012-08-20 15:29:04.000000000","message":"There is race condition caused by \"ref \u003d SELECT..; if not ref: INSERT..;\". If two clients attempt to insert the same address at the same time, both may succeed.\n\nI\u0027m not sure exactly what the solution is because I can\u0027t tell from the code whether it is expected that address is unique, or server_address is unique, or both. In any case, there is clearly an expectation of uniqueness here, which is not modeled in the database.\n\nThe appropriate way to handle that uniqueness is to wrap the \"if not ref\" block with a try statement, and catch duplicate key errors.","commit_id":"770734c255d3373d798028e0ae1d7b4d5f88c2c0"},{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"5c765a4d327c26c0fb8aa778f6b18a65971d9393","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"@require_admin_context"},{"line_number":143,"context_line":"def bm_pxe_ip_create(context, address, server_address, session\u003dNone):"},{"line_number":144,"context_line":"    if not session:"},{"line_number":145,"context_line":"        session \u003d get_session()"},{"line_number":146,"context_line":"    ref \u003d model_query(context, models.BareMetalPxeIp,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAALH%2F%2FrYs%3D","line":143,"in_reply_to":"AAAALH%2F%2FsAU%3D","updated":"2012-08-21 11:00:27.000000000","message":"I add unique constrains to address and server_address, and simply save an object here.","commit_id":"770734c255d3373d798028e0ae1d7b4d5f88c2c0"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"737aab4ed47f5c650d16b47d75595d19bb09bb8e","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                         first()"},{"line_number":203,"context_line":"        if ip_ref:"},{"line_number":204,"context_line":"            return ip_ref.id"},{"line_number":205,"context_line":"        ip_ref \u003d model_query(context, models.BareMetalPxeIp,"},{"line_number":206,"context_line":"                             read_deleted\u003d\"no\", session\u003dsession).\\"},{"line_number":207,"context_line":"                         filter_by(bm_node_id\u003dNone).\\"},{"line_number":208,"context_line":"                         with_lockmode(\u0027update\u0027).\\"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAALH%2F%2FsAA%3D","line":205,"updated":"2012-08-20 15:29:04.000000000","message":"This SELECT .. WHERE bm_node_id IS NULL ... FOR UPDATE; query will lock *all* records, not just the first record, thereby potentially creating a concurrency problem. That being said, it is a reasonable approach for a low-concurrency environment.","commit_id":"770734c255d3373d798028e0ae1d7b4d5f88c2c0"},{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"5c765a4d327c26c0fb8aa778f6b18a65971d9393","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                         first()"},{"line_number":203,"context_line":"        if ip_ref:"},{"line_number":204,"context_line":"            return ip_ref.id"},{"line_number":205,"context_line":"        ip_ref \u003d model_query(context, models.BareMetalPxeIp,"},{"line_number":206,"context_line":"                             read_deleted\u003d\"no\", session\u003dsession).\\"},{"line_number":207,"context_line":"                         filter_by(bm_node_id\u003dNone).\\"},{"line_number":208,"context_line":"                         with_lockmode(\u0027update\u0027).\\"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAALH%2F%2FrYU%3D","line":205,"in_reply_to":"AAAALH%2F%2FsAA%3D","updated":"2012-08-21 11:00:27.000000000","message":"I looked ip allocation code in nova.db but could not find another way. This method is called only once every instance-creation, considered low-concurrency. I leave code unchanged and put comment that warns there is a concurrency problem.","commit_id":"770734c255d3373d798028e0ae1d7b4d5f88c2c0"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"@require_admin_context"},{"line_number":86,"context_line":"def bm_node_get_all(context, service_host\u003dNone, instantiated\u003dNone,"},{"line_number":87,"context_line":"                    sort\u003dFalse, session\u003dNone):"},{"line_number":88,"context_line":"    query \u003d model_query(context, models.BareMetalNode,"},{"line_number":89,"context_line":"                        read_deleted\u003d\"no\", session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3PY%3D","line":86,"updated":"2012-10-31 21:37:06.000000000","message":"This appears to be misleading. Default behaviour of bm_node_get_all is to return only not-instantiated nodes. When instantiated is not None, then it returns only instantiated nodes. At no point is it returning all nodes.\n\nPerhaps the function name could be clearer about this? Also, the instantiated parameter is being treated like a boolean. Perhaps it should default to False instead of None?","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":150,"context_line":"def bm_node_update(context, bm_node_id, values, session\u003dNone):"},{"line_number":151,"context_line":"    if not session:"},{"line_number":152,"context_line":"        session \u003d get_session()"},{"line_number":153,"context_line":"    bm_node_ref \u003d bm_node_get(context, bm_node_id, session\u003dsession)"},{"line_number":154,"context_line":"    bm_node_ref.update(values)"},{"line_number":155,"context_line":"    bm_node_ref.save(session\u003dsession)"},{"line_number":156,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3Ow%3D","line":153,"updated":"2012-10-31 21:37:06.000000000","message":"get-then-update creates a race condition. This should be rewritten as a single model_query().update()","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":196,"context_line":"    # Delete physically since it has unique columns"},{"line_number":197,"context_line":"    if not session:"},{"line_number":198,"context_line":"        session \u003d get_session()"},{"line_number":199,"context_line":"    with session.begin():"},{"line_number":200,"context_line":"        ip_ref \u003d bm_pxe_ip_get(context, ip_id, session)"},{"line_number":201,"context_line":"        session.delete(ip_ref)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3OI%3D","line":199,"updated":"2012-10-31 21:37:06.000000000","message":"get-then-delete is not as efficient as model_query().delete()","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    # Delete physically since it has unique columns"},{"line_number":207,"context_line":"    if not session:"},{"line_number":208,"context_line":"        session \u003d get_session()"},{"line_number":209,"context_line":"    with session.begin():"},{"line_number":210,"context_line":"        ip_ref \u003d model_query(context, models.BareMetalPxeIp,"},{"line_number":211,"context_line":"                             read_deleted\u003d\"no\", session\u003dsession).\\"},{"line_number":212,"context_line":"                         filter_by(address\u003daddress).\\"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3OA%3D","line":209,"updated":"2012-10-31 21:37:06.000000000","message":"session.begin() will throw an exception if session already had a transaction open. Either this method should not accept a session parameter, or this needs to say \"with session.begin(subtransaction\u003dTrue)\"\n\nSee http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#sqlalchemy.orm.session.Session.begin","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        ip_ref \u003d model_query(context, models.BareMetalPxeIp,"},{"line_number":211,"context_line":"                             read_deleted\u003d\"no\", session\u003dsession).\\"},{"line_number":212,"context_line":"                         filter_by(address\u003daddress).\\"},{"line_number":213,"context_line":"                         with_lockmode(\u0027update\u0027).\\"},{"line_number":214,"context_line":"                         first()"},{"line_number":215,"context_line":"        if not ip_ref:"},{"line_number":216,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3N8%3D","line":213,"updated":"2012-10-31 21:37:06.000000000","message":"with_lockmode should generally be avoided because it causes concurrency issues, especially if the query does not match any rows. \n\nPlease consider rewriting this method to use model_query().filter_by().delete()","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":231,"context_line":"def bm_pxe_ip_get_by_bm_node_id(context, bm_node_id, session\u003dNone):"},{"line_number":232,"context_line":"    ref \u003d model_query(context, models.BareMetalPxeIp,"},{"line_number":233,"context_line":"                      read_deleted\u003d\"no\", session\u003dsession).\\"},{"line_number":234,"context_line":"                     filter_by(bm_node_id\u003dbm_node_id).\\"},{"line_number":235,"context_line":"                     first()"},{"line_number":236,"context_line":"    return ref"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3Fk%3D","line":234,"updated":"2012-10-31 21:37:06.000000000","message":"bm_pxe_ips currently has no index on bm_node_id. Please add a migration for that.","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":240,"context_line":"def bm_pxe_ip_associate(context, bm_node_id, session\u003dNone):"},{"line_number":241,"context_line":"    if not session:"},{"line_number":242,"context_line":"        session \u003d get_session()"},{"line_number":243,"context_line":"    with session.begin():"},{"line_number":244,"context_line":"        node_ref \u003d bm_node_get(context, bm_node_id, session\u003dsession)"},{"line_number":245,"context_line":"        if not node_ref:"},{"line_number":246,"context_line":"            raise exception.NovaException(\"bm_node %s not found\" % bm_node_id)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3N4%3D","line":243,"updated":"2012-10-31 21:37:06.000000000","message":"as noted above, you can\u0027t call session.begin() if a transaction already exists. Either don\u0027t accept a session parameter (best solution, IMHO) or use session.begin(subtransactions\u003dTrue) here.","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        node_ref \u003d bm_node_get(context, bm_node_id, session\u003dsession)"},{"line_number":245,"context_line":"        if not node_ref:"},{"line_number":246,"context_line":"            raise exception.NovaException(\"bm_node %s not found\" % bm_node_id)"},{"line_number":247,"context_line":"        ip_ref \u003d model_query(context, models.BareMetalPxeIp,"},{"line_number":248,"context_line":"                             read_deleted\u003d\"no\", session\u003dsession).\\"},{"line_number":249,"context_line":"                         filter_by(bm_node_id\u003dnode_ref.id).\\"},{"line_number":250,"context_line":"                         first()"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3NE%3D","line":247,"updated":"2012-10-31 21:37:06.000000000","message":"Is this check just to see if bm_node_id already has an ip assocated? If so, a little comment making that clear would be helpful.","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":270,"context_line":"    if not session:"},{"line_number":271,"context_line":"        session \u003d get_session()"},{"line_number":272,"context_line":"    with session.begin():"},{"line_number":273,"context_line":"        ip \u003d bm_pxe_ip_get_by_bm_node_id(context, bm_node_id, session\u003dsession)"},{"line_number":274,"context_line":"        if ip:"},{"line_number":275,"context_line":"            ip.bm_node_id \u003d None"},{"line_number":276,"context_line":"            ip.save(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3M0%3D","line":273,"updated":"2012-10-31 21:37:06.000000000","message":"simplify to \nmodel_query(context, models.BareMetalPxeIp).\\\nfilter_by(bm_node_id\u003dbm_node_id).\\\nupdate({\u0027bm_node_id\u0027: None})","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    if not session:"},{"line_number":298,"context_line":"        session \u003d get_session()"},{"line_number":299,"context_line":"    with session.begin():"},{"line_number":300,"context_line":"        vif_ref \u003d bm_interface_get(context, if_id, session)"},{"line_number":301,"context_line":"        session.delete(vif_ref)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3Mw%3D","line":300,"updated":"2012-10-31 21:37:06.000000000","message":"can simplify this to model_query().delete()","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":326,"context_line":"                         with_lockmode(\u0027update\u0027).\\"},{"line_number":327,"context_line":"                         first()"},{"line_number":328,"context_line":"        if not ref:"},{"line_number":329,"context_line":"            raise exception.DBError()"},{"line_number":330,"context_line":"        ref.vif_uuid \u003d vif_uuid"},{"line_number":331,"context_line":"        try:"},{"line_number":332,"context_line":"            session.add(ref)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3Mo%3D","line":329,"updated":"2012-10-31 21:37:06.000000000","message":"please clarify the error","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":332,"context_line":"            session.add(ref)"},{"line_number":333,"context_line":"            session.flush()"},{"line_number":334,"context_line":"        except IntegrityError:"},{"line_number":335,"context_line":"            raise exception.DBError()"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"@require_admin_context"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3Mk%3D","line":335,"updated":"2012-10-31 21:37:06.000000000","message":"please clarify the error","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":348,"context_line":"def bm_interface_get_all_by_bm_node_id(context, bm_node_id, session\u003dNone):"},{"line_number":349,"context_line":"    result \u003d model_query(context, models.BareMetalInterface,"},{"line_number":350,"context_line":"                         read_deleted\u003d\"no\", session\u003dsession).\\"},{"line_number":351,"context_line":"                 filter_by(bm_node_id\u003dbm_node_id).\\"},{"line_number":352,"context_line":"                 all()"},{"line_number":353,"context_line":"    return result"},{"line_number":354,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3FU%3D","line":351,"updated":"2012-10-31 21:37:06.000000000","message":"bm_interfaces has no index on bm_node_id. Please add a migration for that.","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"},{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"630090b39d92bf0d9f3b2c93e7e7a781313b617d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    query \u003d model_query(context, models.BareMetalNode, read_deleted\u003d\"no\")"},{"line_number":94,"context_line":"    if service_host:"},{"line_number":95,"context_line":"        query \u003d query.filter_by(service_host\u003dservice_host)"},{"line_number":96,"context_line":"    if instantiated is not None:"},{"line_number":97,"context_line":"        if instantiated:"},{"line_number":98,"context_line":"            query \u003d query.filter(models.BareMetalNode.instance_uuid !\u003d None)"},{"line_number":99,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAALn%2F%2FxTQ%3D","line":96,"updated":"2012-11-07 13:55:37.000000000","message":"I left it unchanged despite Devananda\u0027s comment.\n\nWhat I intend about \"instantiated\" are these 3 patterns:\n* False: returns only \"free\" nodes\n* True: returns only \"in use\" nodes\n* None: Not filtered by instance_uuid (\u003dTrue+False)\n\nIn actual use, we call this function only with instantiated\u003dNone...\nSo removing this parameter is a reasonable option.","commit_id":"eaf236c72e6e05be96e025a97472c3fdf8f7c9a2"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"48d0deb1fedffd0c7289dcce1a1725876ca9e75e","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    query \u003d model_query(context, models.BareMetalNode, read_deleted\u003d\"no\")"},{"line_number":94,"context_line":"    if service_host:"},{"line_number":95,"context_line":"        query \u003d query.filter_by(service_host\u003dservice_host)"},{"line_number":96,"context_line":"    if instantiated is not None:"},{"line_number":97,"context_line":"        if instantiated:"},{"line_number":98,"context_line":"            query \u003d query.filter(models.BareMetalNode.instance_uuid !\u003d None)"},{"line_number":99,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAALn%2F%2FvyE%3D","line":96,"in_reply_to":"AAAALn%2F%2FxTQ%3D","updated":"2012-11-08 18:37:36.000000000","message":"While I dislike using None as a ternary operator, I can understand the logic now. Please add a docstring to this function to explain the parameter\u0027s behaviour. Or just remove the option as you suggest :)","commit_id":"eaf236c72e6e05be96e025a97472c3fdf8f7c9a2"},{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"6aace04999b3fcad45c1a30d9d7119563affb616","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"@require_admin_context"},{"line_number":91,"context_line":"def bm_node_get_all(context, service_host\u003dNone):"},{"line_number":92,"context_line":"    query \u003d model_query(context, models.BareMetalNode, read_deleted\u003d\"no\")"},{"line_number":93,"context_line":"    if service_host:"},{"line_number":94,"context_line":"        query \u003d query.filter_by(service_host\u003dservice_host)"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAALn%2F%2FvN4%3D","line":91,"updated":"2012-11-09 03:41:10.000000000","message":"unused parameter \"instantiated\" and \"sort\" ware removed","commit_id":"e9dd6ee22af695c61052856efedb48a08a6d431f"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"545ab3a636e52c9e9b2c2ca4478826f548f42093","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def model_query(context, *args, **kwargs):"},{"line_number":45,"context_line":"    \"\"\"Query helper that accounts for context\u0027s `read_deleted` field."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    :param context: context to query under"},{"line_number":48,"context_line":"    :param session: if present, the session to use"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMH%2F%2F71Q%3D","line":45,"updated":"2012-11-15 07:58:29.000000000","message":"For the record, I don\u0027t know how I feel about adding more \"read_deleted\" to the code base, but I don\u0027t think its worth blocking this.","commit_id":"56fe4c7620ae358bcbebf2a50dc8bce955334660"}],"nova/virt/baremetal/db/sqlalchemy/migrate_repo/migrate.cfg":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"bd513d466c5b41870a163d499796b11c6c0e3695","unresolved":false,"context_lines":[{"line_number":6,"context_line":"# The name of the database table used to track the schema version."},{"line_number":7,"context_line":"# This name shouldn\u0027t already be used by your project."},{"line_number":8,"context_line":"# If this is changed once a database is under version control, you\u0027ll need to "},{"line_number":9,"context_line":"# change the table name in each database too. "},{"line_number":10,"context_line":"version_table\u003dmigrate_version"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"# When committing a change script, Migrate will attempt to generate the "}],"source_content_type":"text/x-ttcn-cfg","patch_set":14,"id":"AAAALH%2F%2FOEo%3D","line":9,"updated":"2012-10-03 17:22:41.000000000","message":"Femtonit: White space at end of line","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":221,"name":"Mikyung Kang","email":"mkkang@isi.edu","username":"mkkang"},"change_message_id":"5a0bc59ce61e547cc38c2e381923b296358b7b44","unresolved":false,"context_lines":[{"line_number":6,"context_line":"# The name of the database table used to track the schema version."},{"line_number":7,"context_line":"# This name shouldn\u0027t already be used by your project."},{"line_number":8,"context_line":"# If this is changed once a database is under version control, you\u0027ll need to "},{"line_number":9,"context_line":"# change the table name in each database too. "},{"line_number":10,"context_line":"version_table\u003dmigrate_version"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"# When committing a change script, Migrate will attempt to generate the "}],"source_content_type":"text/x-ttcn-cfg","patch_set":14,"id":"AAAALH%2F%2FN%2Bc%3D","line":9,"in_reply_to":"AAAALH%2F%2FOEo%3D","updated":"2012-10-03 20:40:53.000000000","message":"Thanks for catching. Removed in the next patch set.","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"}],"nova/virt/baremetal/db/sqlalchemy/models.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"737aab4ed47f5c650d16b47d75595d19bb09bb8e","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    __tablename__ \u003d \u0027bm_nodes\u0027"},{"line_number":43,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    service_host \u003d Column(String(255))"},{"line_number":45,"context_line":"    instance_uuid \u003d Column(String(36), nullable\u003dTrue)"},{"line_number":46,"context_line":"    cpus \u003d Column(Integer)"},{"line_number":47,"context_line":"    memory_mb \u003d Column(Integer)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAALH%2F%2FsAk%3D","line":44,"updated":"2012-08-20 15:29:04.000000000","message":"need index on (service_host, deleted)","commit_id":"770734c255d3373d798028e0ae1d7b4d5f88c2c0"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"737aab4ed47f5c650d16b47d75595d19bb09bb8e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    __tablename__ \u003d \u0027bm_nodes\u0027"},{"line_number":43,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    service_host \u003d Column(String(255))"},{"line_number":45,"context_line":"    instance_uuid \u003d Column(String(36), nullable\u003dTrue)"},{"line_number":46,"context_line":"    cpus \u003d Column(Integer)"},{"line_number":47,"context_line":"    memory_mb \u003d Column(Integer)"},{"line_number":48,"context_line":"    local_gb \u003d Column(Integer)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAALH%2F%2FsAg%3D","line":45,"updated":"2012-08-20 15:29:04.000000000","message":"need index on (instance_uuid, deleted)","commit_id":"770734c255d3373d798028e0ae1d7b4d5f88c2c0"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"737aab4ed47f5c650d16b47d75595d19bb09bb8e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"class BareMetalPxeIp(BASE, models.NovaBase):"},{"line_number":60,"context_line":"    __tablename__ \u003d \u0027bm_pxe_ips\u0027"},{"line_number":61,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":62,"context_line":"    address \u003d Column(String(255))"},{"line_number":63,"context_line":"    server_address \u003d Column(String(255))"},{"line_number":64,"context_line":"    bm_node_id \u003d Column(Integer, ForeignKey(\u0027bm_nodes.id\u0027), nullable\u003dTrue)"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAALH%2F%2FsAY%3D","line":62,"updated":"2012-08-20 15:29:04.000000000","message":"need index on (address), and probably also an index on (server_address).\n\none or both of these may need to be a UNIQUE index.","commit_id":"770734c255d3373d798028e0ae1d7b4d5f88c2c0"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"737aab4ed47f5c650d16b47d75595d19bb09bb8e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    address \u003d Column(String(255), unique\u003dTrue)"},{"line_number":72,"context_line":"    datapath_id \u003d Column(String(255))"},{"line_number":73,"context_line":"    port_no \u003d Column(Integer)"},{"line_number":74,"context_line":"    vif_uuid \u003d Column(String(36))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"class BareMetalDeployment(BASE, models.NovaBase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAALH%2F%2Fr%2F8%3D","line":74,"updated":"2012-08-20 15:29:04.000000000","message":"need index on (vif_uuid, deleted)","commit_id":"770734c255d3373d798028e0ae1d7b4d5f88c2c0"}],"nova/virt/baremetal/db/sqlalchemy/session.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"737aab4ed47f5c650d16b47d75595d19bb09bb8e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"import nova.flags as flags"},{"line_number":30,"context_line":"from nova.openstack.common import cfg"},{"line_number":31,"context_line":"from nova.openstack.common import log as logging"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"from nova.db.sqlalchemy.session import get_maker"},{"line_number":34,"context_line":"from nova.db.sqlalchemy.session import is_db_connection_error"},{"line_number":35,"context_line":"from nova.db.sqlalchemy.session import ping_listener"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAALH%2F%2Fr%2Fs%3D","line":32,"updated":"2012-08-20 15:29:04.000000000","message":"Perhaps the answer should be obvious, but why not just use the nova.db.sqlalchemy.session class itself? I don\u0027t see how this is functionally any different, and after this patch, any change to nova.db.sqlalchemy.session will need to be duplicated here.","commit_id":"770734c255d3373d798028e0ae1d7b4d5f88c2c0"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"cf07874e7d648b11ddf5ff20ffb7fa04f4b2ed30","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2012 NTT DOCOMO, INC."},{"line_number":4,"context_line":"# Copyright 2010 United States Government as represented by the"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAALn%2F%2F3MY%3D","line":1,"updated":"2012-10-31 21:37:06.000000000","message":"You could simplify this file by adding a dependency on review 14598 and re-using session.py in that way.","commit_id":"5728a11a435984fde4f5e5e4dab5856566afb834"}],"nova/virt/baremetal/doc/README.rst":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"bd513d466c5b41870a163d499796b11c6c0e3695","unresolved":false,"context_lines":[{"line_number":1,"context_line":"General Bare-metal Provisioning README"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":":Authors:"},{"line_number":5,"context_line":"  [USC/ISI] Mikyung Kang \u003cmkkang@isi.edu\u003e, David Kang \u003cdkang@isi.edu\u003e"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAALH%2F%2FOEY%3D","line":2,"updated":"2012-10-03 17:22:41.000000000","message":"\"The underline/overline must be at least as long as the title text.\" http://docutils.sourceforge.net/docs/user/rst/quickref.html","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":221,"name":"Mikyung Kang","email":"mkkang@isi.edu","username":"mkkang"},"change_message_id":"5a0bc59ce61e547cc38c2e381923b296358b7b44","unresolved":false,"context_lines":[{"line_number":1,"context_line":"General Bare-metal Provisioning README"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":":Authors:"},{"line_number":5,"context_line":"  [USC/ISI] Mikyung Kang \u003cmkkang@isi.edu\u003e, David Kang \u003cdkang@isi.edu\u003e"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAALH%2F%2FN%2BU%3D","line":2,"in_reply_to":"AAAALH%2F%2FOEY%3D","updated":"2012-10-03 20:40:53.000000000","message":"Thanks for checking. Fixed all in the next patch set.","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"bd513d466c5b41870a163d499796b11c6c0e3695","unresolved":false,"context_lines":[{"line_number":12,"context_line":":Wiki: http://wiki.openstack.org/GeneralBareMetalProvisioningFramework"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Code changes"},{"line_number":15,"context_line":"-----"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"::"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAALH%2F%2FOEU%3D","line":15,"updated":"2012-10-03 17:22:41.000000000","message":"ditto","commit_id":"65813bad38282af0a07e4304e1f2a51f07b36a36"}],"nova/virt/baremetal/ipmi.py":[{"author":{"_account_id":1711,"name":"Yun Mao","email":"yunmao@gmail.com","username":"yunmao"},"change_message_id":"c6c05696fe74f1bf88684811583395e36f246090","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return \"%s: %s\" % (self.status, self.msg)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class Ipmi:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def __init__(self, address\u003dNone, user\u003dNone, password\u003dNone,"},{"line_number":91,"context_line":"                 interface\u003d\"lanplus\"):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAALH%2F%2F2eI%3D","line":88,"updated":"2012-08-07 20:18:53.000000000","message":"class Ipmi(object) is preferred as new style class","commit_id":"ac3708f92013c98455d29ba210fce20f0c271bab"},{"author":{"_account_id":1711,"name":"Yun Mao","email":"yunmao@gmail.com","username":"yunmao"},"change_message_id":"c6c05696fe74f1bf88684811583395e36f246090","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        return None"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"class DummyIpmi:"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    def __init__(self):"},{"line_number":241,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAALH%2F%2F2eE%3D","line":238,"updated":"2012-08-07 20:18:53.000000000","message":"see above.","commit_id":"ac3708f92013c98455d29ba210fce20f0c271bab"}],"nova/virt/baremetal/vif_driver.py":[{"author":{"_account_id":1711,"name":"Yun Mao","email":"yunmao@gmail.com","username":"yunmao"},"change_message_id":"c6c05696fe74f1bf88684811583395e36f246090","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def plug(self, instance, vif):"},{"line_number":37,"context_line":"        LOG.debug(\"plug: %s\", locals())"},{"line_number":38,"context_line":"        network, mapping \u003d vif"},{"line_number":39,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":40,"context_line":"        node \u003d bmdb.bm_node_get_by_instance_id(ctx, instance[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAALH%2F%2F2eA%3D","line":37,"updated":"2012-08-07 20:18:53.000000000","message":"the log message could be more explicit. What would you like to print? instance, vif?","commit_id":"ac3708f92013c98455d29ba210fce20f0c271bab"},{"author":{"_account_id":1711,"name":"Yun Mao","email":"yunmao@gmail.com","username":"yunmao"},"change_message_id":"c6c05696fe74f1bf88684811583395e36f246090","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                % (node[\u0027id\u0027], mapping[\u0027vif_uuid\u0027]))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def unplug(self, instance, vif):"},{"line_number":57,"context_line":"        LOG.debug(\"unplug: %s\", locals())"},{"line_number":58,"context_line":"        network, mapping \u003d vif"},{"line_number":59,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":60,"context_line":"        pif \u003d bmdb.bm_interface_get_by_vif_uuid(ctx, mapping[\u0027vif_uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAALH%2F%2F2d8%3D","line":57,"updated":"2012-08-07 20:18:53.000000000","message":"see above","commit_id":"ac3708f92013c98455d29ba210fce20f0c271bab"}]}
