)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"499de7c15bf6b66c04fef0bc86f9072cdb73ace8","unresolved":false,"context_lines":[{"line_number":16,"context_line":"there."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"DocImpact: the force_config_drive flag is only used on first boot"},{"line_number":19,"context_line":"of an instance. We should tell cloud admins about this."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I09107a7f1e9b2e67f0fcd19dce8fd063d69e1632"},{"line_number":22,"context_line":"Closes-Bug: #1303714"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1ae5cdf2_370fa889","line":19,"updated":"2014-06-05 01:16:55.000000000","message":"++","commit_id":"9065c9472b60d7ddbe3a59a2cf24d054e0b06b02"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"609ebc25c03c1e6bd92aef1cb11e826cfeae8dad","unresolved":false,"context_lines":[{"line_number":9,"context_line":"If you force a config drive for all instances, then it should result"},{"line_number":10,"context_line":"in the config_drive column for the instance being set to true in the"},{"line_number":11,"context_line":"instances table. Also, this should only happen on first boot of an"},{"line_number":12,"context_line":"instance, not for things like hard reboots."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This change means we can\u0027t just use force_config_drive as short"},{"line_number":15,"context_line":"hand in testing for virt drivers, so there\u0027s some related fallout"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"fa98f980_4eae6b99","line":12,"updated":"2014-09-04 13:51:55.000000000","message":"I\u0027m not quite sure the meaning comes across here.   It kind of reads as if a hard reboot could now change the state of a config drive.\n\nMaybe try something like:\n\"Also setting the force config drive option only has an impact at instance creation - config drives will be re-created even if the flag is changed and the instance subsequently rebooted.   Config drives can not be forced onto existing instances\" .","commit_id":"139fbfd0f73d3cd06ad4ec1d5ba1938a6712a7be"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"01e48957e243dd3a37f318626af3b3046bf12804","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     f435fd34 (force_config_drive: StrOpt -\u003e BoolOpt)"},{"line_number":2,"context_line":"Author:     Stephen Finucane \u003cstephen.finucane@intel.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2015-10-23 19:56:36 +0000"},{"line_number":4,"context_line":"Commit:     Stephen Finucane \u003cstephen.finucane@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-26 20:12:32 +0000"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"3a29b11f_3472977d","line":2,"updated":"2015-10-26 20:23:56.000000000","message":"Michael Still\u003cmikal@stillhq.com\u003e","commit_id":"3492eb522068d1fdc09a549ada3dcd13b160cf95"}],"nova/compute/api.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8427b0a40c04a8098e25ca2f36b3f09a1c77f1cb","unresolved":false,"context_lines":[{"line_number":1239,"context_line":"        # when that flag is set. It does not affect things like hard reboots."},{"line_number":1240,"context_line":"        if (\u0027always\u0027 \u003d\u003d CONF.force_config_drive or"},{"line_number":1241,"context_line":"            strutils.bool_from_string(CONF.force_config_drive)):"},{"line_number":1242,"context_line":"            instance[\u0027config_drive\u0027] \u003d \u0027true\u0027"},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"        return instance"},{"line_number":1245,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_695c7e4d","line":1242,"updated":"2014-06-17 08:54:19.000000000","message":"There should be instance object, we should use instance.config_drive.\n\nAnd I prefer move those code into _check_config_drive: https://github.com/openstack/nova/blob/ed965dff9c2f6330e5fa9dc36f58f64ebf24501e/nova/compute/api.py#L583\n\nAll the config_drive related code in same function is good for readability","commit_id":"be7639a6b0bc92e5d63cf51825eff1aacd7fe907"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"8e95e17f270b8cb6f72bb6f708a5423f00bb122d","unresolved":false,"context_lines":[{"line_number":1239,"context_line":"        # when that flag is set. It does not affect things like hard reboots."},{"line_number":1240,"context_line":"        if (\u0027always\u0027 \u003d\u003d CONF.force_config_drive or"},{"line_number":1241,"context_line":"            strutils.bool_from_string(CONF.force_config_drive)):"},{"line_number":1242,"context_line":"            instance[\u0027config_drive\u0027] \u003d \u0027true\u0027"},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"        return instance"},{"line_number":1245,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_a82856ef","line":1242,"in_reply_to":"1ae5cdf2_695c7e4d","updated":"2014-06-24 01:08:40.000000000","message":"I did this here because it is where database / object values are defaulted for new instances. I wanted to keep all that together.","commit_id":"be7639a6b0bc92e5d63cf51825eff1aacd7fe907"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"609ebc25c03c1e6bd92aef1cb11e826cfeae8dad","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        # If this compute node has config drive forced on, then this should be"},{"line_number":1228,"context_line":"        # persisted in the instance. Note that this has the side effect that"},{"line_number":1229,"context_line":"        # force_config_drive only has an effect for instances first started"},{"line_number":1230,"context_line":"        # when that flag is set. It does not affect things like hard reboots."},{"line_number":1231,"context_line":"        if (\u0027always\u0027 \u003d\u003d CONF.force_config_drive or"},{"line_number":1232,"context_line":"            strutils.bool_from_string(CONF.force_config_drive)):"},{"line_number":1233,"context_line":"            instance.config_drive \u003d \u0027true\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_ceb33b4b","line":1230,"updated":"2014-09-04 13:51:55.000000000","message":"Not sure I follow the logic here - if the config drive status is persisted then doesn\u0027t that mean that hard reboot will also have a config drive ?    The text seems to make it sound as if this isn;t the case.\n\nMaybe what you mean is \"changing force config drive only has an impact on instances created after that change is made\" ?","commit_id":"139fbfd0f73d3cd06ad4ec1d5ba1938a6712a7be"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"0b8ce4f2e14a99c08f3355bacce9f13e9d5bbd9f","unresolved":false,"context_lines":[{"line_number":1230,"context_line":"        # when that flag is set. It does not affect things like hard reboots."},{"line_number":1231,"context_line":"        if (\u0027always\u0027 \u003d\u003d CONF.force_config_drive or"},{"line_number":1232,"context_line":"            strutils.bool_from_string(CONF.force_config_drive)):"},{"line_number":1233,"context_line":"            instance.config_drive \u003d \u0027true\u0027"},{"line_number":1234,"context_line":""},{"line_number":1235,"context_line":"        return instance"},{"line_number":1236,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_f2110605","line":1233,"updated":"2014-08-27 19:30:14.000000000","message":"The review at https://review.openstack.org/#/c/77027/11/nova/virt/configdrive.py is updating this block.  Even though this method is being moved here rather than duplicated, it seems like it would be better in a utility method.","commit_id":"139fbfd0f73d3cd06ad4ec1d5ba1938a6712a7be"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"474a5c8a3bcdeaf2b0f160b4c5e2b483facfa199","unresolved":false,"context_lines":[{"line_number":1597,"context_line":"    values[\u0027system_metadata\u0027] \u003d _metadata_refs("},{"line_number":1598,"context_line":"            values.get(\u0027system_metadata\u0027), models.InstanceSystemMetadata)"},{"line_number":1599,"context_line":""},{"line_number":1600,"context_line":"    # NOTE(mikal): if we have force_config_drive set as True, then we"},{"line_number":1601,"context_line":"    # act as if config drive was requested in the API request. Note that"},{"line_number":1602,"context_line":"    # the DB column is a string for historical reasons."},{"line_number":1603,"context_line":"    if CONF.force_config_drive:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_022cc346","line":1600,"updated":"2014-05-08 19:40:10.000000000","message":"True, or just not None?  Because according to the docs it\u0027s None or \u0027always\u0027:\n\nhttp://docs.openstack.org/icehouse/config-reference/content/list-of-compute-config-options.html","commit_id":"06b957a641f4f41e271b50e281fcbc4f4877b85e"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"c18a26702550349634156ce16dc2a27ec3b7f614","unresolved":false,"context_lines":[{"line_number":1597,"context_line":"    values[\u0027system_metadata\u0027] \u003d _metadata_refs("},{"line_number":1598,"context_line":"            values.get(\u0027system_metadata\u0027), models.InstanceSystemMetadata)"},{"line_number":1599,"context_line":""},{"line_number":1600,"context_line":"    # NOTE(mikal): if we have force_config_drive set as True, then we"},{"line_number":1601,"context_line":"    # act as if config drive was requested in the API request. Note that"},{"line_number":1602,"context_line":"    # the DB column is a string for historical reasons."},{"line_number":1603,"context_line":"    if CONF.force_config_drive:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_bd8fb422","line":1600,"in_reply_to":"7adec928_022cc346","updated":"2014-05-08 20:40:00.000000000","message":"Yes, the string boolean logic here is an empty string means \"no config drive\", any other string value means \"use config drive\".","commit_id":"06b957a641f4f41e271b50e281fcbc4f4877b85e"}],"nova/tests/compute/test_compute.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"499de7c15bf6b66c04fef0bc86f9072cdb73ace8","unresolved":false,"context_lines":[{"line_number":7084,"context_line":"                                                    1,"},{"line_number":7085,"context_line":"                                                    security_groups\u003dNone,"},{"line_number":7086,"context_line":"                                                    instance_type\u003dinst_type)"},{"line_number":7087,"context_line":"            self.assertTrue(instance[\u0027config_drive\u0027])"},{"line_number":7088,"context_line":""},{"line_number":7089,"context_line":"    def test_populate_instance_for_create_unforce_config_drive(self):"},{"line_number":7090,"context_line":"        base_options \u003d {\u0027image_ref\u0027: self.fake_image[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_97e4fcac","line":7087,"updated":"2014-06-05 01:16:55.000000000","message":"Technically, you are setting instance[\u0027config_drive\u0027] to the string \u0027true\u0027, not True...","commit_id":"9065c9472b60d7ddbe3a59a2cf24d054e0b06b02"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d916d415cb0182b4f3fb1fe0f4a87438235e4778","unresolved":false,"context_lines":[{"line_number":7084,"context_line":"                                                    1,"},{"line_number":7085,"context_line":"                                                    security_groups\u003dNone,"},{"line_number":7086,"context_line":"                                                    instance_type\u003dinst_type)"},{"line_number":7087,"context_line":"            self.assertTrue(instance[\u0027config_drive\u0027])"},{"line_number":7088,"context_line":""},{"line_number":7089,"context_line":"    def test_populate_instance_for_create_unforce_config_drive(self):"},{"line_number":7090,"context_line":"        base_options \u003d {\u0027image_ref\u0027: self.fake_image[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_d8ecf12c","line":7087,"in_reply_to":"1ae5cdf2_97e4fcac","updated":"2014-06-05 03:32:46.000000000","message":"Well, python treats those string values as True, which is what the code in nova.virt.configdrive is checking for (ie. it treats a string as a boolean).","commit_id":"9065c9472b60d7ddbe3a59a2cf24d054e0b06b02"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"499de7c15bf6b66c04fef0bc86f9072cdb73ace8","unresolved":false,"context_lines":[{"line_number":7102,"context_line":"                                                    1,"},{"line_number":7103,"context_line":"                                                    security_groups\u003dNone,"},{"line_number":7104,"context_line":"                                                    instance_type\u003dinst_type)"},{"line_number":7105,"context_line":"            self.assertNone(instance[\u0027config_drive\u0027])"},{"line_number":7106,"context_line":""},{"line_number":7107,"context_line":"    def test_default_hostname_generator(self):"},{"line_number":7108,"context_line":"        fake_uuids \u003d [str(uuid.uuid4()) for x in xrange(4)]"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_17d1cccc","line":7105,"updated":"2014-06-05 01:16:55.000000000","message":"needs to be assertIsNone()  :)\n\nYou are getting this in your unit test failures:\n\n Traceback (most recent call last):\n   File \"nova/tests/compute/test_compute.py\", line 7105, in test_populate_instance_for_create_unforce_config_drive\n     self.assertNone(instance[\u0027config_drive\u0027])\n AttributeError: \u0027ComputeAPITestCase\u0027 object has no attribute \u0027assertNone\u0027","commit_id":"9065c9472b60d7ddbe3a59a2cf24d054e0b06b02"}],"nova/virt/configdrive.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8427b0a40c04a8098e25ca2f36b3f09a1c77f1cb","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    # force_config_drive is a string option, to allow for future behaviors"},{"line_number":43,"context_line":"    #  (e.g. use config_drive based on image properties)"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027force_config_drive\u0027,"},{"line_number":45,"context_line":"               help\u003d\u0027Set to force injection to take place on a config drive \u0027"},{"line_number":46,"context_line":"                    \u0027(if set, valid options are: always)\u0027),"},{"line_number":47,"context_line":"    cfg.StrOpt(\u0027mkisofs_cmd\u0027,"},{"line_number":48,"context_line":"               default\u003d\u0027genisoimage\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_493fc2d6","line":45,"updated":"2014-06-17 08:54:19.000000000","message":"Should we move this compute/api.py? Because it isn\u0027t used in this file anymore.","commit_id":"be7639a6b0bc92e5d63cf51825eff1aacd7fe907"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"8e95e17f270b8cb6f72bb6f708a5423f00bb122d","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    # force_config_drive is a string option, to allow for future behaviors"},{"line_number":43,"context_line":"    #  (e.g. use config_drive based on image properties)"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027force_config_drive\u0027,"},{"line_number":45,"context_line":"               help\u003d\u0027Set to force injection to take place on a config drive \u0027"},{"line_number":46,"context_line":"                    \u0027(if set, valid options are: always)\u0027),"},{"line_number":47,"context_line":"    cfg.StrOpt(\u0027mkisofs_cmd\u0027,"},{"line_number":48,"context_line":"               default\u003d\u0027genisoimage\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_4820b2f8","line":45,"in_reply_to":"1ae5cdf2_493fc2d6","updated":"2014-06-24 01:08:40.000000000","message":"I left it here because I wanted to keep them together. I feel its less confusing like this.","commit_id":"be7639a6b0bc92e5d63cf51825eff1aacd7fe907"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8427b0a40c04a8098e25ca2f36b3f09a1c77f1cb","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            LOG.error(_(\u0027Could not remove tmpdir: %s\u0027), str(e))"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def required_by(instance):"},{"line_number":180,"context_line":"    return instance.get(\u0027config_drive\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_c9011208","line":179,"updated":"2014-06-17 08:54:19.000000000","message":"We can remove this wrap function. It\u0027s meanless now.","commit_id":"be7639a6b0bc92e5d63cf51825eff1aacd7fe907"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"8e95e17f270b8cb6f72bb6f708a5423f00bb122d","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            LOG.error(_(\u0027Could not remove tmpdir: %s\u0027), str(e))"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def required_by(instance):"},{"line_number":180,"context_line":"    return instance.get(\u0027config_drive\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_a89216fa","line":179,"in_reply_to":"1ae5cdf2_c9011208","updated":"2014-06-24 01:08:40.000000000","message":"This is true, but there\u0027s at least one spec out there that wants to add to this logic, so I don\u0027t want to remove it in order to add it back later in juno.","commit_id":"be7639a6b0bc92e5d63cf51825eff1aacd7fe907"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9922329e4f62cb0caa0625885fba982eedf9f778","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    # NOTE(sfinucan): We don\u0027t use strict here because the underlying database"},{"line_number":172,"context_line":"    # column is a string and we need \u0027\u0027 to register as False. See bug ID"},{"line_number":173,"context_line":"    # 1193438 for more information."},{"line_number":174,"context_line":"    return strutils.bool_from_string(instance.get(\u0027config_drive\u0027))"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"def update_instance(instance):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a29b11f_74256f5a","line":174,"updated":"2015-10-26 20:32:25.000000000","message":"Even though at this point CONF.force_config_drive is a BoolOpt, instance.config_drive is still a nullable string in the database, and we could have entries with \u0027always\u0027 in there, right?  So wouldn\u0027t this make those change from being required to not being required now since strutils.bool_from_string(\u0027always\u0027) is going to return False.\n\nI would think that we should actually have an online data migration in the Instance object such that if the value of instance.config_drive is not a boolean, we convert it on first access after this change, so if we saw \u0027always\u0027 on first access after this change, we convert it to \u0027True\u0027.  Maybe that should happen in the dependent change that changes the option from a string to a boolean though.","commit_id":"3492eb522068d1fdc09a549ada3dcd13b160cf95"},{"author":{"_account_id":12898,"name":"Tony Breeds","email":"tony@bakeyournoodle.com","username":"tonyb"},"change_message_id":"135e2eaf602b69dd66dc136da18c9c013943bb44","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from oslo_config import cfg"},{"line_number":22,"context_line":"from oslo_log import log as logging"},{"line_number":23,"context_line":"from oslo_utils import fileutils"},{"line_number":24,"context_line":"from oslo_utils import strutils"},{"line_number":25,"context_line":"from oslo_utils import units"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from nova import exception"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa80f949_083a9bcc","line":24,"updated":"2015-11-06 00:39:47.000000000","message":"Ditch this (it\u0027s what PEP8 doesn\u0027t like) and it\u0027s a artifact from an intermediate revisions","commit_id":"d86fc91645c7f7034ac4ae045533afb08fd6bee0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8196a95febb3a603e3cc4bc99e80632909aba809","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        return \"\u003cConfigDriveBuilder: \" + str(self.mdfiles) + \"\u003e\""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"def required_by(instance):"},{"line_number":172,"context_line":"    # NOTE(sfinucan): We don\u0027t use \u0027strutils.bool_from_string\u0027 here because"},{"line_number":173,"context_line":"    # the underlying column is a string and we need \u0027\u0027 to register as False"},{"line_number":174,"context_line":"    # and all other strings to register as True. See bug ID 1193438 for more"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa80f949_7a36ad53","line":171,"updated":"2015-11-05 11:56:54.000000000","message":"Ideally we should add this function to instance object. And get rid of any call to this. But this is cleanup can be done later.","commit_id":"d86fc91645c7f7034ac4ae045533afb08fd6bee0"}]}
