)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"64454fe06644248689cf7d4c62593a313b759971","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"The cloud provider can then expose custom data to all instances."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"blueprint vendor-data"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ie2aceff1bf68edab124cd5f889aa9a8adcdc73c0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAQn%2F%2Fghg%3D","line":27,"updated":"2013-07-30 02:27:50.000000000","message":"This commit message needs a DocImpact flag please. I don\u0027t think you need to add a lot more detail, we just need to make sure it makes it into the docs.","commit_id":"9aa76758cccebbbc8cdfe79e4d5b675d13a42cbd"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"4a6bf78064364e9b980dfa8793c41dd69ff3c7af","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"The cloud provider can then expose custom data to all instances."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"blueprint vendor-data"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ie2aceff1bf68edab124cd5f889aa9a8adcdc73c0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAQn%2F%2FgfA%3D","line":27,"in_reply_to":"AAAAQn%2F%2Fghg%3D","updated":"2013-07-30 02:49:38.000000000","message":"Done","commit_id":"9aa76758cccebbbc8cdfe79e4d5b675d13a42cbd"}],"nova/api/metadata/base.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"1056b892092ebae083a0012ad1a040cfcd190bdc","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        if not vendordata_driver:"},{"line_number":177,"context_line":"            vendordata_driver \u003d CONF.vendordata_driver"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        self.vddriver \u003d importutils.import_object(vendordata_driver,"},{"line_number":180,"context_line":"                                                  instance\u003dinstance,"},{"line_number":181,"context_line":"                                                  address\u003daddress,"},{"line_number":182,"context_line":"                                                  extra_md\u003dextra_md,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAQn%2F%2F0qY%3D","line":179,"updated":"2013-07-22 17:17:08.000000000","message":"Should there be an exception catch here to just skip using the vendora data if the driver doesn\u0027t load?? (or log a error message also) instead of just breaking the metadata object??","commit_id":"a78c1028fc0a91ae0e2b1ac7f0a0631622c4bcce"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"e1821036059d90710d0be35e66ec5e681ab7efb2","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        if not vendordata_driver:"},{"line_number":177,"context_line":"            vendordata_driver \u003d CONF.vendordata_driver"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        self.vddriver \u003d importutils.import_object(vendordata_driver,"},{"line_number":180,"context_line":"                                                  instance\u003dinstance,"},{"line_number":181,"context_line":"                                                  address\u003daddress,"},{"line_number":182,"context_line":"                                                  extra_md\u003dextra_md,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAQn%2F%2F0Rs%3D","line":179,"in_reply_to":"AAAAQn%2F%2F0Tg%3D","updated":"2013-07-22 19:35:07.000000000","message":"Well, i have 2 arguments for \"its critical\" neither one of which revolve around vendor-data actually being critical in and of itself.\na.) any program i\u0027ve ever used that took a \u0027--config\u0027 argument (my-program --config-file\u003d/etc/foo.conf) would exit failure if foo.conf did not exist or failed to parse. I think thats probably better behavior than just logging \"oh, by the way, you didn\u0027t have foo.conf, so I did something possibly completely different than you wanted\".\n b.) If you had a nova.conf that referenced a file that did not exist, most likely something else is foobar\u0027d in your installation (ie, something like puppet was probably supposed to write that file and failed to do so).","commit_id":"a78c1028fc0a91ae0e2b1ac7f0a0631622c4bcce"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"b97449c14647e7e8bd92aad3425ee64e265e7175","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        if not vendordata_driver:"},{"line_number":177,"context_line":"            vendordata_driver \u003d CONF.vendordata_driver"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        self.vddriver \u003d importutils.import_object(vendordata_driver,"},{"line_number":180,"context_line":"                                                  instance\u003dinstance,"},{"line_number":181,"context_line":"                                                  address\u003daddress,"},{"line_number":182,"context_line":"                                                  extra_md\u003dextra_md,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAQn%2F%2F0Tg%3D","line":179,"in_reply_to":"AAAAQn%2F%2F0n0%3D","updated":"2013-07-22 19:23:23.000000000","message":"Hmmm, unsure. If failing to fetch the vendordata will stop the instance from being built (?) then that seems bad. But maybe that\u0027s the right thing to do (is vendor data expected to be critical for a VM to boot?)","commit_id":"a78c1028fc0a91ae0e2b1ac7f0a0631622c4bcce"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"2a60828f8568aa3ce9ec43ebb4e67eb22c32b39e","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        if not vendordata_driver:"},{"line_number":177,"context_line":"            vendordata_driver \u003d CONF.vendordata_driver"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        self.vddriver \u003d importutils.import_object(vendordata_driver,"},{"line_number":180,"context_line":"                                                  instance\u003dinstance,"},{"line_number":181,"context_line":"                                                  address\u003daddress,"},{"line_number":182,"context_line":"                                                  extra_md\u003dextra_md,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAQn%2F%2F0n0%3D","line":179,"in_reply_to":"AAAAQn%2F%2F0qY%3D","updated":"2013-07-22 17:27:53.000000000","message":"I can add one.. I\u0027d just follow whatever the \"nova thing to do\" is.  Ie, is it better to just log exceptions ? What warrants a critical exception that should then cause stacktrace and exit?","commit_id":"a78c1028fc0a91ae0e2b1ac7f0a0631622c4bcce"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"1056b892092ebae083a0012ad1a040cfcd190bdc","unresolved":false,"context_lines":[{"line_number":299,"context_line":"            return password.handle_password"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        if path \u003d\u003d VD_JSON_NAME and self._check_os_version(HAVANA, version):"},{"line_number":302,"context_line":"            return json.dumps(self.vddriver.get())"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        if path !\u003d MD_JSON_NAME:"},{"line_number":305,"context_line":"            raise KeyError(path)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAQn%2F%2F0qQ%3D","line":302,"updated":"2013-07-22 17:17:08.000000000","message":"Same exception logic as above when getting fails.","commit_id":"a78c1028fc0a91ae0e2b1ac7f0a0631622c4bcce"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"64454fe06644248689cf7d4c62593a313b759971","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                        \u00272007-12-15 2008-02-01 2008-09-01\u0027),"},{"line_number":47,"context_line":"               help\u003d(\u0027List of metadata versions to skip placing into the \u0027"},{"line_number":48,"context_line":"                     \u0027config drive\u0027)),"},{"line_number":49,"context_line":"    cfg.StrOpt(\u0027vendordata_driver\u0027,"},{"line_number":50,"context_line":"               default\u003d\u0027nova.api.metadata.vendordata_json.JsonFileVendorData\u0027,"},{"line_number":51,"context_line":"               help\u003d\u0027Default driver to use for vendor data\u0027),"},{"line_number":52,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FghI%3D","line":49,"updated":"2013-07-30 02:27:50.000000000","message":"I wonder if this should be vendor_data_driver? It looks wrong with one less underscore.","commit_id":"9aa76758cccebbbc8cdfe79e4d5b675d13a42cbd"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"4bfe3b6bc73a53ace3ddea5a8b2977cb88ee4f33","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                        \u00272007-12-15 2008-02-01 2008-09-01\u0027),"},{"line_number":47,"context_line":"               help\u003d(\u0027List of metadata versions to skip placing into the \u0027"},{"line_number":48,"context_line":"                     \u0027config drive\u0027)),"},{"line_number":49,"context_line":"    cfg.StrOpt(\u0027vendordata_driver\u0027,"},{"line_number":50,"context_line":"               default\u003d\u0027nova.api.metadata.vendordata_json.JsonFileVendorData\u0027,"},{"line_number":51,"context_line":"               help\u003d\u0027Default driver to use for vendor data\u0027),"},{"line_number":52,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2Fgfk%3D","line":49,"in_reply_to":"AAAAQn%2F%2FghI%3D","updated":"2013-07-30 02:45:08.000000000","message":"Well, we use \u0027userdata\u0027 and \u0027metadata\u0027 in names (nova.api.metadata).  However, The exported values in configdrive are \u0027vendor_data.json\u0027.\n\nSo, it isn\u0027t 100% consistent to use \u0027vendordata_driver\u0027, but it wouldnt be 100% consistent to use \u0027vendor_data_driver\u0027 either.\n\nI think its 6 in one half a dozen in the other.\nI\u0027ll change if you insist.","commit_id":"9aa76758cccebbbc8cdfe79e4d5b675d13a42cbd"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"64454fe06644248689cf7d4c62593a313b759971","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                     \u0027config drive\u0027)),"},{"line_number":49,"context_line":"    cfg.StrOpt(\u0027vendordata_driver\u0027,"},{"line_number":50,"context_line":"               default\u003d\u0027nova.api.metadata.vendordata_json.JsonFileVendorData\u0027,"},{"line_number":51,"context_line":"               help\u003d\u0027Default driver to use for vendor data\u0027),"},{"line_number":52,"context_line":"]"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FghM%3D","line":51,"updated":"2013-07-30 02:27:50.000000000","message":"The help should just be \"Driver to use for vendor data\", right? Its only the default one if you don\u0027t set the flag.","commit_id":"9aa76758cccebbbc8cdfe79e4d5b675d13a42cbd"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"4a6bf78064364e9b980dfa8793c41dd69ff3c7af","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                     \u0027config drive\u0027)),"},{"line_number":49,"context_line":"    cfg.StrOpt(\u0027vendordata_driver\u0027,"},{"line_number":50,"context_line":"               default\u003d\u0027nova.api.metadata.vendordata_json.JsonFileVendorData\u0027,"},{"line_number":51,"context_line":"               help\u003d\u0027Default driver to use for vendor data\u0027),"},{"line_number":52,"context_line":"]"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2Fge8%3D","line":51,"in_reply_to":"AAAAQn%2F%2FghM%3D","updated":"2013-07-30 02:49:38.000000000","message":"Done","commit_id":"9aa76758cccebbbc8cdfe79e4d5b675d13a42cbd"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"32188a39886b609b83d36f3761a0dcec0e2562b5","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                \u0027content_path\u0027: \"/%s/%s\" % (CONTENT_DIR, key)})"},{"line_number":173,"context_line":"            self.content[key] \u003d contents"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        vd_kwargs \u003d {\u0027instance\u0027: instance, \u0027address\u0027: address,"},{"line_number":176,"context_line":"                     \u0027extra_md\u0027: extra_md, \u0027network_info\u0027: network_info}"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if vd_driver is None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2Ffzg%3D","line":175,"updated":"2013-07-30 08:03:50.000000000","message":"is this used?","commit_id":"1889d78b2897d742c2eb99133e0e612a275c56b8"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"f0d3417ffbcf5b3677ee373b598752e663120df6","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                \u0027content_path\u0027: \"/%s/%s\" % (CONTENT_DIR, key)})"},{"line_number":173,"context_line":"            self.content[key] \u003d contents"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        vd_kwargs \u003d {\u0027instance\u0027: instance, \u0027address\u0027: address,"},{"line_number":176,"context_line":"                     \u0027extra_md\u0027: extra_md, \u0027network_info\u0027: network_info}"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if vd_driver is None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2Fe8M%3D","line":175,"in_reply_to":"AAAAQn%2F%2Ffzg%3D","updated":"2013-07-30 14:04:33.000000000","message":"no. vestigial. good catch. done.","commit_id":"1889d78b2897d742c2eb99133e0e612a275c56b8"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"32188a39886b609b83d36f3761a0dcec0e2562b5","unresolved":false,"context_lines":[{"line_number":379,"context_line":"                today \u003d timeutils.utcnow().strftime(\"%Y-%m-%d\")"},{"line_number":380,"context_line":"                versions \u003d [v for v in OPENSTACK_VERSIONS if v \u003c\u003d today]"},{"line_number":381,"context_line":"                if OPENSTACK_VERSIONS !\u003d versions:"},{"line_number":382,"context_line":"                    LOG.debug(\"future versions %s are hidden in version list\","},{"line_number":383,"context_line":"                              [v for v in OPENSTACK_VERSIONS"},{"line_number":384,"context_line":"                               if v not in versions])"},{"line_number":385,"context_line":"                versions +\u003d [\"latest\"]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2Ffzc%3D","line":382,"updated":"2013-07-30 08:03:50.000000000","message":"please use the i18n format _()","commit_id":"1889d78b2897d742c2eb99133e0e612a275c56b8"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"32188a39886b609b83d36f3761a0dcec0e2562b5","unresolved":false,"context_lines":[{"line_number":426,"context_line":"            if self.userdata_raw is not None:"},{"line_number":427,"context_line":"                yield (path, self.lookup(path))"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"            if self._check_version(GRIZZLY, version):"},{"line_number":430,"context_line":"                path \u003d \u0027openstack/%s/%s\u0027 % (version, VD_JSON_NAME)"},{"line_number":431,"context_line":"                yield (path, self.lookup(path))"},{"line_number":432,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2FfzY%3D","line":429,"updated":"2013-07-30 08:03:50.000000000","message":"HAVANA?","commit_id":"1889d78b2897d742c2eb99133e0e612a275c56b8"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"f0d3417ffbcf5b3677ee373b598752e663120df6","unresolved":false,"context_lines":[{"line_number":426,"context_line":"            if self.userdata_raw is not None:"},{"line_number":427,"context_line":"                yield (path, self.lookup(path))"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"            if self._check_version(GRIZZLY, version):"},{"line_number":430,"context_line":"                path \u003d \u0027openstack/%s/%s\u0027 % (version, VD_JSON_NAME)"},{"line_number":431,"context_line":"                yield (path, self.lookup(path))"},{"line_number":432,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2Fe54%3D","line":429,"in_reply_to":"AAAAQn%2F%2FfzY%3D","updated":"2013-07-30 14:04:33.000000000","message":"good catch.\ndone","commit_id":"1889d78b2897d742c2eb99133e0e612a275c56b8"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"6ad0915999c91416f303df2b026b9a4f2277ffe1","unresolved":false,"context_lines":[{"line_number":376,"context_line":"                today \u003d timeutils.utcnow().strftime(\"%Y-%m-%d\")"},{"line_number":377,"context_line":"                versions \u003d [v for v in OPENSTACK_VERSIONS if v \u003c\u003d today]"},{"line_number":378,"context_line":"                if OPENSTACK_VERSIONS !\u003d versions:"},{"line_number":379,"context_line":"                    LOG.debug(\"future versions %s are hidden in version list\","},{"line_number":380,"context_line":"                              [v for v in OPENSTACK_VERSIONS"},{"line_number":381,"context_line":"                               if v not in versions])"},{"line_number":382,"context_line":"                versions +\u003d [\"latest\"]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAQn%2F%2Fa6Q%3D","line":379,"updated":"2013-07-31 13:40:50.000000000","message":"please use the _() format. that is, this should be:\nLOG.debug(_(\"future versions %s are hidden in version list\"),","commit_id":"4083ff4c0c6459740be201a1e93d55dce719feb8"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"9e2ac91c4f49e47f1baa1737886696086bfcfbf3","unresolved":false,"context_lines":[{"line_number":376,"context_line":"                today \u003d timeutils.utcnow().strftime(\"%Y-%m-%d\")"},{"line_number":377,"context_line":"                versions \u003d [v for v in OPENSTACK_VERSIONS if v \u003c\u003d today]"},{"line_number":378,"context_line":"                if OPENSTACK_VERSIONS !\u003d versions:"},{"line_number":379,"context_line":"                    LOG.debug(\"future versions %s are hidden in version list\","},{"line_number":380,"context_line":"                              [v for v in OPENSTACK_VERSIONS"},{"line_number":381,"context_line":"                               if v not in versions])"},{"line_number":382,"context_line":"                versions +\u003d [\"latest\"]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAQn%2F%2Fa3U%3D","line":379,"in_reply_to":"AAAAQn%2F%2Fa6Q%3D","updated":"2013-07-31 13:51:42.000000000","message":"Done","commit_id":"4083ff4c0c6459740be201a1e93d55dce719feb8"},{"author":{"_account_id":67,"name":"Vish Ishaya","email":"vishvananda@gmail.com","username":"vishvananda"},"change_message_id":"8f38943bfdf6f3910551ccb68cb4df8e1b96765a","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"from nova.openstack.common.gettextutils import _"},{"line_number":38,"context_line":"from nova.openstack.common import importutils"},{"line_number":39,"context_line":"from nova.openstack.common import log"},{"line_number":40,"context_line":"from nova.openstack.common import timeutils"},{"line_number":41,"context_line":"from nova.virt import netutils"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAQn%2F%2FZKI%3D","line":39,"updated":"2013-07-31 21:16:31.000000000","message":"we usually use import log as logging to keep compatibility with python logging module but this is a minor issue. It is also odd that these are totally out of order. The nova.openstack shoudl be between import network and import utils and this space should not be here.","commit_id":"bd02a9189a7416097c274660d510eb85b8cd27e5"}],"nova/api/metadata/vendordata_json.py":[{"author":{"_account_id":642,"name":"Matt Dietz","email":"matthew.dietz@gmail.com","username":"cerberus"},"change_message_id":"da2717b423fedcbedf5442a2d9f749723ae66c36","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            with open(fpath, \"r\") as fp:"},{"line_number":40,"context_line":"                data \u003d jsonutils.load(fp)"},{"line_number":41,"context_line":"        else:"},{"line_number":42,"context_line":"            data \u003d {}"},{"line_number":43,"context_line":"        self._data \u003d data"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def get(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2F1GQ%3D","line":42,"updated":"2013-07-22 15:24:43.000000000","message":"Either this or the data \u003d {} above are superfluous.","commit_id":"e6db1449258b61e833312af07e8839870c090d5b"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"fb9475b5defd59e04eb3b9fa391ed28e9ed05ec5","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(JsonFileVendorData, self).__init__(*args, **kwargs)"},{"line_number":36,"context_line":"        data \u003d {}"},{"line_number":37,"context_line":"        fpath \u003d CONF.vendordata_jsonfile_path"},{"line_number":38,"context_line":"        if fpath:"},{"line_number":39,"context_line":"            with open(fpath, \"r\") as fp:"},{"line_number":40,"context_line":"                data \u003d jsonutils.load(fp)"},{"line_number":41,"context_line":"        self._data \u003d data"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAQn%2F%2F0q0%3D","line":38,"updated":"2013-07-22 17:15:54.000000000","message":"What about doing this lazily?? Wondering if the file doesn\u0027t exist what should happen...","commit_id":"a78c1028fc0a91ae0e2b1ac7f0a0631622c4bcce"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"b97449c14647e7e8bd92aad3425ee64e265e7175","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(JsonFileVendorData, self).__init__(*args, **kwargs)"},{"line_number":36,"context_line":"        data \u003d {}"},{"line_number":37,"context_line":"        fpath \u003d CONF.vendordata_jsonfile_path"},{"line_number":38,"context_line":"        if fpath:"},{"line_number":39,"context_line":"            with open(fpath, \"r\") as fp:"},{"line_number":40,"context_line":"                data \u003d jsonutils.load(fp)"},{"line_number":41,"context_line":"        self._data \u003d data"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAQn%2F%2F0Tc%3D","line":38,"in_reply_to":"AAAAQn%2F%2F0oI%3D","updated":"2013-07-22 19:23:23.000000000","message":"Ok dokie, thx!","commit_id":"a78c1028fc0a91ae0e2b1ac7f0a0631622c4bcce"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"2a60828f8568aa3ce9ec43ebb4e67eb22c32b39e","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(JsonFileVendorData, self).__init__(*args, **kwargs)"},{"line_number":36,"context_line":"        data \u003d {}"},{"line_number":37,"context_line":"        fpath \u003d CONF.vendordata_jsonfile_path"},{"line_number":38,"context_line":"        if fpath:"},{"line_number":39,"context_line":"            with open(fpath, \"r\") as fp:"},{"line_number":40,"context_line":"                data \u003d jsonutils.load(fp)"},{"line_number":41,"context_line":"        self._data \u003d data"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAQn%2F%2F0oI%3D","line":38,"in_reply_to":"AAAAQn%2F%2F0q0%3D","updated":"2013-07-22 17:27:53.000000000","message":"I\u0027m not terribly opposed to this, but the InstanceMetadata object says:\n\"Creation of this object should basically cover all time consuming collection.  Methods after that should not cause time delays due to network operations or lengthy cpu operations.\"\nSo I figured we should just keep with that same philosophy.  It means that .get() is really just local operations so caching is more thorough.","commit_id":"a78c1028fc0a91ae0e2b1ac7f0a0631622c4bcce"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"64454fe06644248689cf7d4c62593a313b759971","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from nova.api.metadata import base"},{"line_number":23,"context_line":"from nova.openstack.common import jsonutils"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"file_opt \u003d cfg.StrOpt(\u0027vendordata_jsonfile_path\u0027,"},{"line_number":26,"context_line":"                      default\u003dNone,"},{"line_number":27,"context_line":"                      help\u003d\u0027File to load json formated vendor data from\u0027)"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2Fggo%3D","line":25,"updated":"2013-07-30 02:27:50.000000000","message":"Can we add an underscore here as well?","commit_id":"9aa76758cccebbbc8cdfe79e4d5b675d13a42cbd"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"4bfe3b6bc73a53ace3ddea5a8b2977cb88ee4f33","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from nova.api.metadata import base"},{"line_number":23,"context_line":"from nova.openstack.common import jsonutils"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"file_opt \u003d cfg.StrOpt(\u0027vendordata_jsonfile_path\u0027,"},{"line_number":26,"context_line":"                      default\u003dNone,"},{"line_number":27,"context_line":"                      help\u003d\u0027File to load json formated vendor data from\u0027)"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2Fgfg%3D","line":25,"in_reply_to":"AAAAQn%2F%2Fggo%3D","updated":"2013-07-30 02:45:08.000000000","message":"well, if we did, i\u0027d probably rename this file to vendor_data_json also.\nbut because \u0027userdata\u0027 and \u0027metadata\u0027 are used as one word... I dont know.","commit_id":"9aa76758cccebbbc8cdfe79e4d5b675d13a42cbd"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"2d0ee4a6c0e4d3bce5cfdc479b56481cd2e5e277","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        fpath \u003d CONF.vendordata_jsonfile_path"},{"line_number":38,"context_line":"        if fpath:"},{"line_number":39,"context_line":"            with open(fpath, \"r\") as fp:"},{"line_number":40,"context_line":"                data \u003d jsonutils.load(fp)"},{"line_number":41,"context_line":"        self._data \u003d data"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def get(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2FgWg%3D","line":40,"updated":"2013-07-30 03:57:41.000000000","message":"I think that its probably a good idea to handle errors here a bit better (say the JSON is of an invalid format). At least logging when something goes wrong. And perhaps generally catching exceptions in metadata/base.py when the vddriver is created.","commit_id":"1889d78b2897d742c2eb99133e0e612a275c56b8"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"f0d3417ffbcf5b3677ee373b598752e663120df6","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        fpath \u003d CONF.vendordata_jsonfile_path"},{"line_number":38,"context_line":"        if fpath:"},{"line_number":39,"context_line":"            with open(fpath, \"r\") as fp:"},{"line_number":40,"context_line":"                data \u003d jsonutils.load(fp)"},{"line_number":41,"context_line":"        self._data \u003d data"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def get(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2Fe7g%3D","line":40,"in_reply_to":"AAAAQn%2F%2FfwE%3D","updated":"2013-07-30 14:04:33.000000000","message":"Josh Harlow also raised this. I don\u0027t personally think its necessary or even desireable.\n\nthe metadata server will stack trace and exit on failure, and I think thats not unreasonable.\n\nEvery program I\u0027ve ever used has exited failure on \"invalid or non-existent config file\".  If you\u0027re hitting this, most likely there are general issues with your installation (ie, your config management system screwed up).","commit_id":"1889d78b2897d742c2eb99133e0e612a275c56b8"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8e3ad32611d94cb1d37860983b1a5012316b73c0","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        fpath \u003d CONF.vendordata_jsonfile_path"},{"line_number":38,"context_line":"        if fpath:"},{"line_number":39,"context_line":"            with open(fpath, \"r\") as fp:"},{"line_number":40,"context_line":"                data \u003d jsonutils.load(fp)"},{"line_number":41,"context_line":"        self._data \u003d data"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def get(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2FfwE%3D","line":40,"in_reply_to":"AAAAQn%2F%2FgWg%3D","updated":"2013-07-30 08:36:41.000000000","message":"+1 on logging the exception somewhere, and having a VendorDataNotAvailable exception or something like that.","commit_id":"1889d78b2897d742c2eb99133e0e612a275c56b8"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"938c1dfc745cb9db60338ff9ff57c05adb12964d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        fpath \u003d CONF.vendordata_jsonfile_path"},{"line_number":38,"context_line":"        if fpath:"},{"line_number":39,"context_line":"            with open(fpath, \"r\") as fp:"},{"line_number":40,"context_line":"                data \u003d jsonutils.load(fp)"},{"line_number":41,"context_line":"        self._data \u003d data"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def get(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAQn%2F%2FbUg%3D","line":40,"updated":"2013-07-31 11:26:09.000000000","message":"Seems worth a friendly warn log message, but yes, lets not overcook the error handling.","commit_id":"4083ff4c0c6459740be201a1e93d55dce719feb8"},{"author":{"_account_id":1082,"name":"Scott Moser","email":"smoser@ubuntu.com","username":"smoser"},"change_message_id":"8b97618be002e75ab809dd896c0a2b3fa1f4a42e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        fpath \u003d CONF.vendordata_jsonfile_path"},{"line_number":38,"context_line":"        if fpath:"},{"line_number":39,"context_line":"            with open(fpath, \"r\") as fp:"},{"line_number":40,"context_line":"                data \u003d jsonutils.load(fp)"},{"line_number":41,"context_line":"        self._data \u003d data"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def get(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAQn%2F%2Fa6I%3D","line":40,"in_reply_to":"AAAAQn%2F%2FbUg%3D","updated":"2013-07-31 13:41:52.000000000","message":"Done","commit_id":"4083ff4c0c6459740be201a1e93d55dce719feb8"},{"author":{"_account_id":67,"name":"Vish Ishaya","email":"vishvananda@gmail.com","username":"vishvananda"},"change_message_id":"8f38943bfdf6f3910551ccb68cb4df8e1b96765a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from nova.api.metadata import base"},{"line_number":25,"context_line":"from nova.openstack.common.gettextutils import _"},{"line_number":26,"context_line":"from nova.openstack.common import jsonutils"},{"line_number":27,"context_line":"from nova.openstack.common import log"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"file_opt \u003d cfg.StrOpt(\u0027vendordata_jsonfile_path\u0027,"},{"line_number":30,"context_line":"                      default\u003dNone,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAQn%2F%2FZJw%3D","line":27,"updated":"2013-07-31 21:16:31.000000000","message":"again logging","commit_id":"bd02a9189a7416097c274660d510eb85b8cd27e5"}]}
