)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"238f22e7500d5b1bcb06062cd716af67dd908e06","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Nisha Agarwal \u003cagarwalnisha1980@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-17 00:38:42 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Pass on the capabilities to instance_info"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commit is to pass on the `capabilities` defined in `extra-spec`"},{"line_number":10,"context_line":"key of the flavor to node\u0027s instance_info field."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a961159_27e2ac2f","line":7,"updated":"2014-12-17 08:47:25.000000000","message":"please prefix this with Ironic:","commit_id":"4b6be87ed72af2d1bda4bf777ff65b3d69b6046a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb5f89b36fc1979c46c057db2d24bca0b43e91cc","unresolved":false,"context_lines":[{"line_number":10,"context_line":"key of the flavor to node\u0027s instance_info field."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements : blueprint pass-flavor-capabilities-to-ironic-virt-driver"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Id8ae681ce69f66da4b6579c40aff8d2eda96666d"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a961159_47d33838","line":13,"updated":"2014-12-17 08:47:59.000000000","message":"Please add DocImpact","commit_id":"4b6be87ed72af2d1bda4bf777ff65b3d69b6046a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c21c10fc108ba18e0961b7b36c91f92150814482","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Nisha Agarwal \u003cagarwalnisha1980@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-17 01:26:23 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Pass on the capabilities to instance_info"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commit is to pass on the `capabilities` defined in `extra-spec`"},{"line_number":10,"context_line":"key of the flavor to node\u0027s instance_info field."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a961159_cae64f16","line":7,"updated":"2014-12-17 09:34:00.000000000","message":"Please add prefix Ironic","commit_id":"222abd8dff7883b7495c813983350e132dfd7f81"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c21c10fc108ba18e0961b7b36c91f92150814482","unresolved":false,"context_lines":[{"line_number":10,"context_line":"key of the flavor to node\u0027s instance_info field."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements : blueprint pass-flavor-capabilities-to-ironic-virt-driver"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Id8ae681ce69f66da4b6579c40aff8d2eda96666d"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a961159_2aec33f3","line":13,"updated":"2014-12-17 09:34:00.000000000","message":"Please add DocImpact","commit_id":"222abd8dff7883b7495c813983350e132dfd7f81"}],"nova/tests/unit/virt/ironic/test_patcher.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f3c63458a05c7bbf19bb5c3f22820acd9495616d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":65,"context_line":"        self.flavor[\u0027extra_specs\u0027][\u0027capabilities:boot_mode\u0027] \u003d \u0027bios\u0027"},{"line_number":66,"context_line":"        expected \u003d [{\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":67,"context_line":"                     \u0027value\u0027: \"{\u0027boot_mode\u0027: \u0027bios\u0027}\","},{"line_number":68,"context_line":"                     \u0027op\u0027: \u0027add\u0027}]"},{"line_number":69,"context_line":"        expected +\u003d self._expected_deploy_patch"},{"line_number":70,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_d671a60d","line":67,"updated":"2015-01-12 17:15:27.000000000","message":"shouldn\u0027t this be a real dict, not encoded one? Ironic started supporting nested structures recently","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"8689989f21e46e7d056a001187a982dca0623d60","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":65,"context_line":"        self.flavor[\u0027extra_specs\u0027][\u0027capabilities:boot_mode\u0027] \u003d \u0027bios\u0027"},{"line_number":66,"context_line":"        expected \u003d [{\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":67,"context_line":"                     \u0027value\u0027: \"{\u0027boot_mode\u0027: \u0027bios\u0027}\","},{"line_number":68,"context_line":"                     \u0027op\u0027: \u0027add\u0027}]"},{"line_number":69,"context_line":"        expected +\u003d self._expected_deploy_patch"},{"line_number":70,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_21a64a55","line":67,"in_reply_to":"3a961159_1dc1b44e","updated":"2015-01-19 18:43:28.000000000","message":"It requires it to be string because other test cases also have the \u0027value\u0027 explicitly converted to string. if it is not string then it gives error.","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c50a87f1dcb9eeeb12f70bb5bbf1dc05e1146f0d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":65,"context_line":"        self.flavor[\u0027extra_specs\u0027][\u0027capabilities:boot_mode\u0027] \u003d \u0027bios\u0027"},{"line_number":66,"context_line":"        expected \u003d [{\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":67,"context_line":"                     \u0027value\u0027: \"{\u0027boot_mode\u0027: \u0027bios\u0027}\","},{"line_number":68,"context_line":"                     \u0027op\u0027: \u0027add\u0027}]"},{"line_number":69,"context_line":"        expected +\u003d self._expected_deploy_patch"},{"line_number":70,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_2f4c3c70","line":67,"in_reply_to":"3a961159_21a64a55","updated":"2015-01-22 14:47:51.000000000","message":"Ironic does now supports having values which are not strings or ints. We allow any json type in our API as a valid value.","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"54858c7dce84f8e1ef14887ddee2959d67d410a5","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":65,"context_line":"        self.flavor[\u0027extra_specs\u0027][\u0027capabilities:boot_mode\u0027] \u003d \u0027bios\u0027"},{"line_number":66,"context_line":"        expected \u003d [{\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":67,"context_line":"                     \u0027value\u0027: \"{\u0027boot_mode\u0027: \u0027bios\u0027}\","},{"line_number":68,"context_line":"                     \u0027op\u0027: \u0027add\u0027}]"},{"line_number":69,"context_line":"        expected +\u003d self._expected_deploy_patch"},{"line_number":70,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_1dc1b44e","line":67,"in_reply_to":"3a961159_91c37a38","updated":"2015-01-19 16:51:43.000000000","message":"I think the question is whether it should be \"{key: value}\" or {key: value}.","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"36441a27d32d4450c1231fa80e03b01570944651","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":65,"context_line":"        self.flavor[\u0027extra_specs\u0027][\u0027capabilities:boot_mode\u0027] \u003d \u0027bios\u0027"},{"line_number":66,"context_line":"        expected \u003d [{\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":67,"context_line":"                     \u0027value\u0027: \"{\u0027boot_mode\u0027: \u0027bios\u0027}\","},{"line_number":68,"context_line":"                     \u0027op\u0027: \u0027add\u0027}]"},{"line_number":69,"context_line":"        expected +\u003d self._expected_deploy_patch"},{"line_number":70,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_91c37a38","line":67,"in_reply_to":"3a961159_d671a60d","updated":"2015-01-13 19:33:14.000000000","message":"Dmitry i didnt understand. I will ask you on IRC and then update accordingly.","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7a34f57415928ecd0c3f9d05ef0e386790000f51","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("},{"line_number":90,"context_line":"                self.instance, self.image_meta, self.flavor)"},{"line_number":91,"context_line":"        self.assertEqual(sorted(expected), sorted(patch))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test_generic_get_deploy_patch_ephemeral(self):"},{"line_number":94,"context_line":"        CONF.set_override(\u0027default_ephemeral_format\u0027, \u0027testfmt\u0027)"},{"line_number":95,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_9d5d8aef","line":92,"updated":"2015-02-09 10:43:58.000000000","message":"Just to make sure we should also add a test for the \u003cor\u003e operator if it\u0027s not going to be supported.","commit_id":"6c02cd070acd7adbbc066e871a500d55b14b121e"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"7b4227ec5c595779cfd9ce07730cdf63364802c7","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("},{"line_number":90,"context_line":"                self.instance, self.image_meta, self.flavor)"},{"line_number":91,"context_line":"        self.assertEqual(sorted(expected), sorted(patch))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test_generic_get_deploy_patch_ephemeral(self):"},{"line_number":94,"context_line":"        CONF.set_override(\u0027default_ephemeral_format\u0027, \u0027testfmt\u0027)"},{"line_number":95,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_bc4debc6","line":92,"in_reply_to":"da86d52c_9d5d8aef","updated":"2015-02-09 13:58:01.000000000","message":"ok.","commit_id":"6c02cd070acd7adbbc066e871a500d55b14b121e"}],"nova/tests/unit/virt/ironic/utils.py":[{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"beb8d1b5b2b73a687cd49a4a4107d8d488e279c9","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                                       \u0027aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa\u0027,"},{"line_number":64,"context_line":"                           \u0027baremetal:deploy_ramdisk_id\u0027:"},{"line_number":65,"context_line":"                                       \u0027bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb\u0027,"},{"line_number":66,"context_line":"                           \u0027capabilities:boot_mode\u0027:\u0027bios\u0027}"},{"line_number":67,"context_line":"    return {\u0027name\u0027: kw.get(\u0027name\u0027, \u0027fake.flavor\u0027),"},{"line_number":68,"context_line":"            \u0027extra_specs\u0027: kw.get(\u0027extra_specs\u0027, default_extra_specs),"},{"line_number":69,"context_line":"            \u0027swap\u0027: kw.get(\u0027swap\u0027, 0),"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_47c03150","line":66,"range":{"start_line":66,"start_character":51,"end_line":66,"end_character":53},"updated":"2014-12-20 01:17:26.000000000","message":"E231 missing whitespace after \u0027:\u0027","commit_id":"fd59a5c10c0b2a78e55bafc005ea891976660446"}],"nova/virt/ironic/patcher.py":[{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"681244a9913128c02d23f4590bccf162357a6ef7","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        if preserve_ephemeral is not None:"},{"line_number":78,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/preserve_ephemeral\u0027,"},{"line_number":79,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(preserve_ephemeral)})"},{"line_number":80,"context_line":"        cap \u003d {}"},{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs\u003dflavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_64504e5f","line":80,"updated":"2014-12-16 16:02:13.000000000","message":"F841 local variable \u0027cap\u0027 is assigned to but never used","commit_id":"36da76bd61df2a4e433b1a3c9da22b125033687a"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"681244a9913128c02d23f4590bccf162357a6ef7","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(preserve_ephemeral)})"},{"line_number":80,"context_line":"        cap \u003d {}"},{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs\u003dflavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            cap_key\u003dkey.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if cap_key[0] \u003d\u003d \u0027capabilities\u0027:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_e4f27e6e","line":82,"range":{"start_line":82,"start_character":19,"end_line":82,"end_character":20},"updated":"2014-12-16 16:02:13.000000000","message":"E225 missing whitespace around operator","commit_id":"36da76bd61df2a4e433b1a3c9da22b125033687a"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"681244a9913128c02d23f4590bccf162357a6ef7","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs\u003dflavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            cap_key\u003dkey.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if cap_key[0] \u003d\u003d \u0027capabilities\u0027:"},{"line_number":86,"context_line":"                capabilities[cap_key[1]]\u003dval"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_c494a2ea","line":84,"range":{"start_line":84,"start_character":18,"end_line":84,"end_character":20},"updated":"2014-12-16 16:02:13.000000000","message":"E225 missing whitespace around operator","commit_id":"36da76bd61df2a4e433b1a3c9da22b125033687a"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"681244a9913128c02d23f4590bccf162357a6ef7","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            cap_key\u003dkey.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if cap_key[0] \u003d\u003d \u0027capabilities\u0027:"},{"line_number":86,"context_line":"                capabilities[cap_key[1]]\u003dval"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities is not None:"},{"line_number":89,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_84929af4","line":86,"range":{"start_line":86,"start_character":38,"end_line":86,"end_character":41},"updated":"2014-12-16 16:02:13.000000000","message":"E225 missing whitespace around operator","commit_id":"36da76bd61df2a4e433b1a3c9da22b125033687a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"238f22e7500d5b1bcb06062cd716af67dd908e06","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            if cap_key[0] \u003d\u003d \u0027capabilities\u0027:"},{"line_number":86,"context_line":"                capabilities[cap_key[1]] \u003d val"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities is not None:"},{"line_number":89,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":90,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":91,"context_line":"        return patch"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_a7293c39","line":88,"updated":"2014-12-17 08:47:25.000000000","message":"This should be:\n\nif capabilities:","commit_id":"4b6be87ed72af2d1bda4bf777ff65b3d69b6046a"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c50a87f1dcb9eeeb12f70bb5bbf1dc05e1146f0d","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            cap_key \u003d key.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if cap_key[0] \u003d\u003d \u0027capabilities\u0027:"},{"line_number":86,"context_line":"                capabilities[cap_key[1]] \u003d val"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_68ffaa01","line":84,"updated":"2015-01-22 14:47:51.000000000","message":"nit cap_key, cap_value \u003d key.split(\u0027:\u0027)","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"8673386a04c88b0c553497630aca6c67cd9fa4f4","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            cap_key \u003d key.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if cap_key[0] \u003d\u003d \u0027capabilities\u0027:"},{"line_number":86,"context_line":"                capabilities[cap_key[1]] \u003d val"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_3503a60e","line":84,"in_reply_to":"1a930d6b_db48d689","updated":"2015-01-22 17:36:36.000000000","message":"ok.","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"277e84cd436c3bc6b86c2fdc7a28d94d5ea17d34","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            cap_key \u003d key.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if cap_key[0] \u003d\u003d \u0027capabilities\u0027:"},{"line_number":86,"context_line":"                capabilities[cap_key[1]] \u003d val"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_db48d689","line":84,"in_reply_to":"3a961159_68ffaa01","updated":"2015-01-22 16:47:18.000000000","message":"+1. You\u0027d need to put a try/except around that though in case the key doesn\u0027t have \u0027:\u0027 in it.\n\nmaybe \u0027spec_name\u0027, \u0027capability_name\u0027 instead of cap_key, cap_value? Or something to distinguish that the first is some sort of identifier, the 2nd is the actual capability.","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"8673386a04c88b0c553497630aca6c67cd9fa4f4","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            cap_key \u003d key.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if cap_key[0] \u003d\u003d \u0027capabilities\u0027:"},{"line_number":86,"context_line":"                capabilities[cap_key[1]] \u003d val"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_750d2e37","line":84,"in_reply_to":"3a961159_68ffaa01","updated":"2015-01-22 17:36:36.000000000","message":"ok.","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"c50a87f1dcb9eeeb12f70bb5bbf1dc05e1146f0d","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities:"},{"line_number":89,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":90,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":91,"context_line":"        return patch"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_cleanup_patch(self, instance, network_info, flavor):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_4f30a8e8","line":90,"updated":"2015-01-22 14:47:51.000000000","message":"Don\u0027t need to convert it to string, a dict is a supported (and encouraged) value for this.","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"76cc09db039496a5eedcdd27fe649a0fad64da13","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities:"},{"line_number":89,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":90,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":91,"context_line":"        return patch"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_cleanup_patch(self, instance, network_info, flavor):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_af42ec0d","line":90,"in_reply_to":"1a930d6b_4f30a8e8","updated":"2015-01-22 14:51:08.000000000","message":"Won\u0027t we break backward compatibility by doing it?","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"8673386a04c88b0c553497630aca6c67cd9fa4f4","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities:"},{"line_number":89,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":90,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":91,"context_line":"        return patch"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_cleanup_patch(self, instance, network_info, flavor):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_31073b1e","line":90,"in_reply_to":"1a930d6b_518f67cc","updated":"2015-01-22 17:36:36.000000000","message":"Thanks Lucas.","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f9bfb5ebb7f121010e197d0afcfc1c26f81d3455","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities:"},{"line_number":89,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":90,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":91,"context_line":"        return patch"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_cleanup_patch(self, instance, network_info, flavor):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_518f67cc","line":90,"in_reply_to":"1a930d6b_8f99b021","updated":"2015-01-22 17:34:13.000000000","message":"So after some IRC conversation it\u0027s still unclear whether we should keep the backwards compat with strings here or not. I will send it to the ML so we can continue the discussion there.\n\nThat said, I think that having it as a string for now is fine then, because it keeps the backward compat and is easy to migrate to a normal dict if needed.","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"eec6af2b9ec9640e0d5600f992fa51149f78dc0a","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if capabilities:"},{"line_number":89,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":90,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":91,"context_line":"        return patch"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_cleanup_patch(self, instance, network_info, flavor):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_8f99b021","line":90,"in_reply_to":"1a930d6b_af42ec0d","updated":"2015-01-22 15:06:42.000000000","message":"Hmm... \n\nI\u0027m wondering, because it\u0027s new code and if someone updates de Nova Ironic driver I would expect them to update Ironic as well. So I\u0027m not sure whether we should expect things to work by using a new nova ironic driver with an old Ironic service (I would expect the other way around, old driver with a new Ironic service with an old nova ironic driver)\n\nThoughts? I will bring it to the IRC channel","commit_id":"77b91d685656e7e315a2139ca8a7898cfe6062dd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"feb806274979e71cc45190c2ff1f6bc0bd3fa57a","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            extraspec_key, extraspec_value \u003d key.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if extraspec_key \u003d\u003d \u0027capabilities\u0027:"},{"line_number":86,"context_line":"                capabilities[extraspec_value] \u003d val"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a930d6b_97e1b500","line":84,"updated":"2015-01-22 22:55:05.000000000","message":"I don\u0027t know if all the extraspec keys are/will be of the form \u0027a:b\u0027. If the key is eg \u0027foo\u0027, this will raise an exception that we should handle (ie ignore) here.\n\nI had also suggested \u0027capability_name\u0027 (instead of your \u0027extraspec_value\u0027) because it more accurately describes what that is.","commit_id":"35b7d7188ed9cdceb8a3cae42a2b80c004b01807"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"6ab918dd93801791e53e6f5b58d487fb4eac1a05","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            extraspec_key, extraspec_value \u003d key.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if extraspec_key \u003d\u003d \u0027capabilities\u0027:"},{"line_number":86,"context_line":"                capabilities[extraspec_value] \u003d val"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a930d6b_cd51e9d9","line":84,"in_reply_to":"1a930d6b_97e1b500","updated":"2015-01-23 05:16:56.000000000","message":"Ruby,\nThe extra_spec capability keys are defined as :\n\ncapabilities:act_key\u003dvalue\n\ni.e.\n\n{\u0027capabilities:act_key\u0027:\u0027value\u0027}\n\nso in for loop, key \u003d \u0027capabilities:act_key\u0027 and val \u003d \u0027value\u0027.\n\nAfter splitting key on colon, extraspec_key\u003d\u0027capabilities\u0027 and extraspec_value \u003d \u0027act_key\u0027. We want to discard \u0027capabilities\u0027 after splitting on colon to get the actual key. \n\nDoes this help?\n\nI will repost the patch with naming convention as \n\nextraspec_key as capability_string and extraspec_value as capability_key.\n\nI think this should be fine.","commit_id":"35b7d7188ed9cdceb8a3cae42a2b80c004b01807"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"87da47385e93b7a3cd6919241f10b0dceb218dcc","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if(capabilities_string \u003d\u003d \u0027capabilities\u0027"},{"line_number":86,"context_line":"               and capabilities_key is not None):"},{"line_number":87,"context_line":"                capabilities[capabilities_key] \u003d val"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_b95d7b7b","line":84,"updated":"2015-01-26 12:15:53.000000000","message":"Not all items in extra_spec will have the \u0027:\u0027 name spacing.\n\n try:\n     capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)\n except ValueError:\n     continue\n\n...\n\nYou can also check if the string starts with a specific name, and if you do you may skip the conditional at L85 as well, eg:\n\n for key, val in extra_specs.iteritems():\n     if not key.startswith(\u0027capabilities:\u0027):\n         continue\n\n     capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)\n     if capabilities_key:\n         capabilities[capabilities_key] \u003d val\n     \n     ...","commit_id":"a08ff075f3c083f9a765edc19155622f023e0f49"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"34237c82cf58facf419aded678687fb38784e1f8","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if(capabilities_string \u003d\u003d \u0027capabilities\u0027"},{"line_number":86,"context_line":"               and capabilities_key is not None):"},{"line_number":87,"context_line":"                capabilities[capabilities_key] \u003d val"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_2c4ba9b1","line":84,"in_reply_to":"1a930d6b_b95d7b7b","updated":"2015-01-28 04:30:11.000000000","message":"Ok Lucas. I actually tried try...except clause but it was giving error when i used \u0027continue\u0027. And that was the reason i didnt use it. I will retry and paste the error if i see the error.","commit_id":"a08ff075f3c083f9a765edc19155622f023e0f49"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c58b17e0292988ba599501f242fc2b20dd9847f5","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if(capabilities_string \u003d\u003d \u0027capabilities\u0027"},{"line_number":86,"context_line":"               and capabilities_key is not None):"},{"line_number":87,"context_line":"                capabilities[capabilities_key] \u003d val"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_f7a8e2dc","line":84,"in_reply_to":"1a930d6b_b95d7b7b","updated":"2015-01-26 15:50:51.000000000","message":"not sure about Nova policy, but I would s/iteritems/items/ for the sake of py3k","commit_id":"a08ff075f3c083f9a765edc19155622f023e0f49"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"34237c82cf58facf419aded678687fb38784e1f8","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        capabilities \u003d {}"},{"line_number":82,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":83,"context_line":"        for key, val in extra_specs.iteritems():"},{"line_number":84,"context_line":"            capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":85,"context_line":"            if(capabilities_string \u003d\u003d \u0027capabilities\u0027"},{"line_number":86,"context_line":"               and capabilities_key is not None):"},{"line_number":87,"context_line":"                capabilities[capabilities_key] \u003d val"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_acedd98d","line":84,"in_reply_to":"1a930d6b_f7a8e2dc","updated":"2015-01-28 04:30:11.000000000","message":"i will try first one if it doesnt work i will try second option and use items instead of iteritems.","commit_id":"a08ff075f3c083f9a765edc19155622f023e0f49"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"b2d9c0f44018bd8ef4e60f25fbd827bbff6378d6","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        if capabilities:"},{"line_number":90,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":91,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":92,"context_line":"        return patch"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def get_cleanup_patch(self, instance, network_info, flavor):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_40c38037","line":91,"updated":"2015-01-27 15:33:41.000000000","message":"Can we also do a json.dumps(capabilities) here instead of str(capabilities)? This makes things much easier to parse it on the other end.\n\nif you do str() and we do a json.loads() on the other end, it will error as:\n\n ValueError: Expecting property name: line 1 column 1 (char 1)\n\nFor strings we should do an eval() but you know, eval() can be evil[1]\n\n[1] http://stackoverflow.com/questions/1832940/is-using-eval-in-python-a-bad-practice","commit_id":"a08ff075f3c083f9a765edc19155622f023e0f49"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"34237c82cf58facf419aded678687fb38784e1f8","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        if capabilities:"},{"line_number":90,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":91,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":92,"context_line":"        return patch"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def get_cleanup_patch(self, instance, network_info, flavor):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_8cb65589","line":91,"in_reply_to":"1a930d6b_40c38037","updated":"2015-01-28 04:30:11.000000000","message":"I am not sure Lucas because for \"preserve_ephemeral\" (as on line 79 ) also we change it to string. If on ethe other side this will error out then doesnt it apply to preserve_ephemeral? I can do as suggested in comment but i actually did the same way it is handled for other properties.","commit_id":"a08ff075f3c083f9a765edc19155622f023e0f49"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e0909ab2914fae6be5b464387e6e97ddfada4e75","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        if capabilities:"},{"line_number":90,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":91,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":92,"context_line":"        return patch"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def get_cleanup_patch(self, instance, network_info, flavor):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_9c058ec4","line":91,"in_reply_to":"fa81d914_8cb65589","updated":"2015-01-28 15:18:12.000000000","message":"Right,\n\nYeah do it for preserve_ephemeral (and other options) is because they are not complex types, they are stringified int\u0027s and booleans. And that\u0027s because before our API didn\u0027t accept anything other than strings (and later on MultiType was added to make it accept int\u0027s too). So we pass an bool as string and convert on the other side[1]. And whether it\u0027s a byte string or unicode doesn\u0027t make difference on the other side.\n\nNow, when stringifying a dictionary it does, and that\u0027s why we should use json.dumps(), it also converts the dict into a string, but takes other things into considerations so that json.loads() can parse it nicely on the other side. Because str() means different things for different versions of python.","commit_id":"a08ff075f3c083f9a765edc19155622f023e0f49"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"22962ce579d946235cb11b6f4310ae0d16f28d75","unresolved":false,"context_lines":[{"line_number":20,"context_line":"Helper classes for Ironic HTTP PATCH creation."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":"from oslo.config import cfg"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d cfg.CONF"},{"line_number":26,"context_line":"CONF.import_opt(\u0027default_ephemeral_format\u0027, \u0027nova.virt.driver\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa81d914_7c17faed","line":23,"updated":"2015-01-28 15:23:31.000000000","message":"pep8 failure is because the order here is wrong.","commit_id":"063fd4e658005899fdb577f1a77f0323915fdc13"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"d076c15fd15f995885834353a2b1c5f021392bc7","unresolved":false,"context_lines":[{"line_number":20,"context_line":"Helper classes for Ironic HTTP PATCH creation."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":"from oslo.config import cfg"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d cfg.CONF"},{"line_number":26,"context_line":"CONF.import_opt(\u0027default_ephemeral_format\u0027, \u0027nova.virt.driver\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa81d914_9d74a5d0","line":23,"in_reply_to":"fa81d914_7c17faed","updated":"2015-01-28 17:24:40.000000000","message":"ok. WIll bring it down.","commit_id":"063fd4e658005899fdb577f1a77f0323915fdc13"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"22962ce579d946235cb11b6f4310ae0d16f28d75","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if capabilities:"},{"line_number":94,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":95,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":96,"context_line":"        return patch"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def get_cleanup_patch(self, instance, network_info, flavor):"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa81d914_fce20a02","line":95,"updated":"2015-01-28 15:23:31.000000000","message":"Please take a look at the previous patch set comment about doing str() in a dict() here, I still think we should do a json.dumps() here to avoid having to eval() this stringyfied dict on the other end.","commit_id":"063fd4e658005899fdb577f1a77f0323915fdc13"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"d076c15fd15f995885834353a2b1c5f021392bc7","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if capabilities:"},{"line_number":94,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":95,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: str(capabilities)})"},{"line_number":96,"context_line":"        return patch"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def get_cleanup_patch(self, instance, network_info, flavor):"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa81d914_7d89b1c9","line":95,"in_reply_to":"fa81d914_fce20a02","updated":"2015-01-28 17:24:40.000000000","message":"Ok i can do that but i am not sure if that will work as i will have no mechanism to test that. \nPlus now this patch needs more changes as the flavor will have value as \"\u003cop\u003e value\" instead of just \"value\". So will need to parse out the operator \u003cop\u003e. Will add it in subsequent patch.","commit_id":"063fd4e658005899fdb577f1a77f0323915fdc13"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c40248f2745a6037c50299c77dfb67053d5c4f96","unresolved":false,"context_lines":[{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":"Helper classes for Ironic HTTP PATCH creation."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":12,"id":"da86d52c_d053ffdf","side":"PARENT","line":22,"updated":"2015-02-04 12:40:26.000000000","message":"nit: this line should stay","commit_id":"62ee10404a6313f81c5f9206c3b3b33763753eaa"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a7b406ae307c66f87c9d87721ecdab98c0a9ed1a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            try:"},{"line_number":88,"context_line":"                capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":89,"context_line":"                if capabilities_key:"},{"line_number":90,"context_line":"                    scope \u003d val.split()"},{"line_number":91,"context_line":"                    if len(scope) \u003e 1:"},{"line_number":92,"context_line":"                        capabilities[capabilities_key] \u003d scope[1]"},{"line_number":93,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da86d52c_a61f3107","line":90,"updated":"2015-02-04 13:23:26.000000000","message":"Isn\u0027t this change part of another spec [1] ? Not sure, but I don\u0027t think it should be implemented as part of [2]. Looks unrelated\n\n[1] http://specs.openstack.org/openstack/nova-specs/specs/kilo/approved/add-all-in-list-operator-to-extra-spec-ops.html\n\n[2] http://specs.openstack.org/openstack/nova-specs/specs/kilo/approved/pass-flavor-capabilities-to-ironic-virt-driver.html","commit_id":"95eef1f16e9576d6210483e0977e9c4e0af9eabe"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c40248f2745a6037c50299c77dfb67053d5c4f96","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                    else:"},{"line_number":94,"context_line":"                        capabilities[capabilities_key] \u003d val"},{"line_number":95,"context_line":"            except ValueError:"},{"line_number":96,"context_line":"                continue"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        if capabilities:"},{"line_number":99,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"da86d52c_f01563e5","line":96,"updated":"2015-02-04 12:40:26.000000000","message":"what are you handling by this ValueError? error from key.split(\u0027:\u0027)? it should not happen now.","commit_id":"95eef1f16e9576d6210483e0977e9c4e0af9eabe"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"b3b602bfce3a1d29b7c15376617501a9a4bf8d1e","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                    else:"},{"line_number":94,"context_line":"                        capabilities[capabilities_key] \u003d val"},{"line_number":95,"context_line":"            except ValueError:"},{"line_number":96,"context_line":"                continue"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        if capabilities:"},{"line_number":99,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"da86d52c_739dfd58","line":96,"in_reply_to":"da86d52c_f01563e5","updated":"2015-02-04 13:03:54.000000000","message":"+1","commit_id":"95eef1f16e9576d6210483e0977e9c4e0af9eabe"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"712ffa201dda910c51f8a144e2a52c550aacc8a8","unresolved":false,"context_lines":[{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":"Helper classes for Ironic HTTP PATCH creation."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":13,"id":"da86d52c_5fb8f8e4","side":"PARENT","line":22,"updated":"2015-02-04 14:26:14.000000000","message":"this line should not be deleted","commit_id":"62ee10404a6313f81c5f9206c3b3b33763753eaa"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"678f727badcac9edb3f716a31c2c5d4f1fa833d1","unresolved":false,"context_lines":[{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":"Helper classes for Ironic HTTP PATCH creation."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":13,"id":"da86d52c_dab4f636","side":"PARENT","line":22,"in_reply_to":"da86d52c_5fb8f8e4","updated":"2015-02-04 14:38:59.000000000","message":"Ok","commit_id":"62ee10404a6313f81c5f9206c3b3b33763753eaa"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"712ffa201dda910c51f8a144e2a52c550aacc8a8","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            if not key.startswith(\u0027capabilities:\u0027):"},{"line_number":86,"context_line":"                continue"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"            _, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":89,"context_line":"            if capabilities_key:"},{"line_number":90,"context_line":"                capabilities[capabilities_key] \u003d val"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da86d52c_ff8a8c19","line":88,"updated":"2015-02-04 14:26:14.000000000","message":"I hope it\u0027s not possible to have one more : somewhere in capability. Otherwise you better use split(\u0027:\u0027, 1)","commit_id":"38953d0d784e38e9084d22b126283dca05694db9"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"678f727badcac9edb3f716a31c2c5d4f1fa833d1","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            if not key.startswith(\u0027capabilities:\u0027):"},{"line_number":86,"context_line":"                continue"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"            _, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":89,"context_line":"            if capabilities_key:"},{"line_number":90,"context_line":"                capabilities[capabilities_key] \u003d val"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da86d52c_5aa9e6dd","line":88,"in_reply_to":"da86d52c_ff8a8c19","updated":"2015-02-04 14:38:59.000000000","message":"it is possible to have like this:\n\ncapabilities:key1:key2 \u003d value\n\nThat said nova supports nested dictionary in flavor.\n\nA very good point actually. Need to handle nested dictionary.","commit_id":"38953d0d784e38e9084d22b126283dca05694db9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b0916d65ecddc8a98f08edc770557cc7a91a0df4","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # 1. extra_specs \u003d {\u0027capabilities:key\u0027 : \u0027value\u0027}"},{"line_number":86,"context_line":"        # 2. extra_specs \u003d {\u0027capabilities:key\u0027 : \u0027\u003cop\u003e value\u0027}"},{"line_number":87,"context_line":"        # TODO(Nisha) : To extend the support for all the nova supported"},{"line_number":88,"context_line":"        # operators and nested dictionary capabilities key format."},{"line_number":89,"context_line":"        capabilities \u003d {}"},{"line_number":90,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":91,"context_line":"        for key, val in six.iteritems(extra_specs):"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_8c668328","line":88,"updated":"2015-02-06 01:27:22.000000000","message":"Thanks for adding the comment!","commit_id":"e50f6f7a09189e11996a5955f0e60c60f2004b29"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b0916d65ecddc8a98f08edc770557cc7a91a0df4","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":96,"context_line":"            if capabilities_key:"},{"line_number":97,"context_line":"                scope \u003d val.split()"},{"line_number":98,"context_line":"                if len(scope) \u003e 1:"},{"line_number":99,"context_line":"                    capabilities[capabilities_key] \u003d scope[1]"},{"line_number":100,"context_line":"                else:"},{"line_number":101,"context_line":"                    capabilities[capabilities_key] \u003d val"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_2cae772e","line":98,"updated":"2015-02-06 01:27:22.000000000","message":"What I don\u0027t understand is whether you can guarantee that the value for some capability won\u0027t be \u0027a b c\u0027. Because if it is, you\u0027ve just clobbered it.\n\nI was wondering what this \u003cop\u003e stuff was (I\u0027m not a nova expert), and I see that there\u0027s a scheduler/filters/extra_specs_ops.py file -- my guess is that there might be a method there that you can use to parse this to see if there is an operator or not. At the very least, that file contains a list of the recognized operators. Just selecting the 2nd term seems scary to me.","commit_id":"e50f6f7a09189e11996a5955f0e60c60f2004b29"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"d910e772ce0f49373f96af093cc046cbb059b105","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":96,"context_line":"            if capabilities_key:"},{"line_number":97,"context_line":"                scope \u003d val.split()"},{"line_number":98,"context_line":"                if len(scope) \u003e 1:"},{"line_number":99,"context_line":"                    capabilities[capabilities_key] \u003d scope[1]"},{"line_number":100,"context_line":"                else:"},{"line_number":101,"context_line":"                    capabilities[capabilities_key] \u003d val"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_461aa7c6","line":98,"in_reply_to":"da86d52c_2cae772e","updated":"2015-02-06 03:40:05.000000000","message":"I could have matched for most of the operators but still after stripping off that operator i wasnt sure that what value should be copied to instance_info. Hence I have added the support only for \u003cin\u003e operator. So i will explicitly add the \u003cin\u003e operator check in code.","commit_id":"e50f6f7a09189e11996a5955f0e60c60f2004b29"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"12a877904b4494893c7a213bd2e6fd5e1e1fd99e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"# List of operators supported in nova/scheduler/filters/extra_specs_ops.py"},{"line_number":31,"context_line":"# except \u003cor\u003e and \u003call-in\u003e operators."},{"line_number":32,"context_line":"OPERATORS \u003d [\u0027\u003d\u0027, \u0027\u003cin\u003e\u0027, \u0027\u003d\u003d\u0027, \u0027!\u003d\u0027, \u0027\u003e\u003d\u0027, \u0027\u003c\u003d\u0027, \u0027s\u003d\u003d\u0027,"},{"line_number":33,"context_line":"             \u0027s!\u003d\u0027, \u0027s\u003c\u0027, \u0027s\u003c\u003d\u0027, \u0027s\u003e\u0027, \u0027s\u003e\u003d\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def create(node):"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_ee7172e1","line":33,"updated":"2015-02-09 08:48:22.000000000","message":"please derive it like\n\n OPERATORS \u003d list(nova.scheduler.filters.extra_specs_ops._op_methods)\n\notherwise one day we\u0027ll forget to update it","commit_id":"211103fe69e6162473d9ee6aca2b4e735ad9ad0a"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"9601739f95fe3d64ca8a58b228a05d029174abb3","unresolved":false,"context_lines":[{"line_number":30,"context_line":"# List of operators supported in nova/scheduler/filters/extra_specs_ops.py"},{"line_number":31,"context_line":"# except \u003cor\u003e and \u003call-in\u003e operators."},{"line_number":32,"context_line":"OPERATORS \u003d [\u0027\u003d\u0027, \u0027\u003cin\u003e\u0027, \u0027\u003d\u003d\u0027, \u0027!\u003d\u0027, \u0027\u003e\u003d\u0027, \u0027\u003c\u003d\u0027, \u0027s\u003d\u003d\u0027,"},{"line_number":33,"context_line":"             \u0027s!\u003d\u0027, \u0027s\u003c\u0027, \u0027s\u003c\u003d\u0027, \u0027s\u003e\u0027, \u0027s\u003e\u003d\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def create(node):"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_b18c3f37","line":33,"in_reply_to":"da86d52c_ee7172e1","updated":"2015-02-09 09:07:17.000000000","message":"ok.","commit_id":"211103fe69e6162473d9ee6aca2b4e735ad9ad0a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"12a877904b4494893c7a213bd2e6fd5e1e1fd99e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":107,"context_line":"                elif ((len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027)"},{"line_number":108,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"},{"line_number":109,"context_line":"                    continue"},{"line_number":110,"context_line":"                else:"},{"line_number":111,"context_line":"                    capabilities[capabilities_key] \u003d val"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_ae35baf8","line":109,"updated":"2015-02-09 08:48:22.000000000","message":"maybe we should issue an error here instead of silently ignoring... or at least a warning","commit_id":"211103fe69e6162473d9ee6aca2b4e735ad9ad0a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d23eae9d4236ac8802fe60f80da712718d8f377f","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":107,"context_line":"                elif ((len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027)"},{"line_number":108,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"},{"line_number":109,"context_line":"                    continue"},{"line_number":110,"context_line":"                else:"},{"line_number":111,"context_line":"                    capabilities[capabilities_key] \u003d val"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_c41f2f5a","line":109,"in_reply_to":"da86d52c_5175c330","updated":"2015-02-09 09:22:24.000000000","message":"I think so","commit_id":"211103fe69e6162473d9ee6aca2b4e735ad9ad0a"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"9601739f95fe3d64ca8a58b228a05d029174abb3","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":107,"context_line":"                elif ((len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027)"},{"line_number":108,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"},{"line_number":109,"context_line":"                    continue"},{"line_number":110,"context_line":"                else:"},{"line_number":111,"context_line":"                    capabilities[capabilities_key] \u003d val"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_5175c330","line":109,"in_reply_to":"da86d52c_ae35baf8","updated":"2015-02-09 09:07:17.000000000","message":"ok. logging a message should be fine?","commit_id":"211103fe69e6162473d9ee6aca2b4e735ad9ad0a"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7a34f57415928ecd0c3f9d05ef0e386790000f51","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        # in Nova."},{"line_number":94,"context_line":"        # 1. extra_specs \u003d {\u0027capabilities:key\u0027 : \u0027value\u0027}"},{"line_number":95,"context_line":"        # 2. extra_specs \u003d {\u0027capabilities:key\u0027 : \u0027\u003cop\u003e value\u0027}"},{"line_number":96,"context_line":"        # For now the \u003cop\u003e is tested only for \u003cin\u003e operator."},{"line_number":97,"context_line":"        # TODO(Nisha) : To extend the support for all the nova supported"},{"line_number":98,"context_line":"        # operators and nested dictionary capabilities key format."},{"line_number":99,"context_line":"        capabilities \u003d {}"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_1d4a7a27","line":96,"updated":"2015-02-09 10:43:58.000000000","message":"What about all the other operators\n\n \u003d, s\u003d\u003d, s!\u003d, s\u003e\u003d, s\u003e, s\u003c\u003d, s\u003c, \u003d\u003d, !\u003d, \u003e\u003d, \u003c\u003d\n\n?","commit_id":"6c02cd070acd7adbbc066e871a500d55b14b121e"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"7b4227ec5c595779cfd9ce07730cdf63364802c7","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        # in Nova."},{"line_number":94,"context_line":"        # 1. extra_specs \u003d {\u0027capabilities:key\u0027 : \u0027value\u0027}"},{"line_number":95,"context_line":"        # 2. extra_specs \u003d {\u0027capabilities:key\u0027 : \u0027\u003cop\u003e value\u0027}"},{"line_number":96,"context_line":"        # For now the \u003cop\u003e is tested only for \u003cin\u003e operator."},{"line_number":97,"context_line":"        # TODO(Nisha) : To extend the support for all the nova supported"},{"line_number":98,"context_line":"        # operators and nested dictionary capabilities key format."},{"line_number":99,"context_line":"        capabilities \u003d {}"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_bc1fabb6","line":96,"in_reply_to":"da86d52c_1d4a7a27","updated":"2015-02-09 13:58:01.000000000","message":"it is supported but i havent tested explicitly. I have just tested \u003cin\u003e operator. however they all should behave similar to \u003cin\u003e operator","commit_id":"6c02cd070acd7adbbc066e871a500d55b14b121e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7a34f57415928ecd0c3f9d05ef0e386790000f51","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            if capabilities_key:"},{"line_number":107,"context_line":"                scope \u003d val.split()"},{"line_number":108,"context_line":"                if len(scope) \u003e 1 and scope[0] in OPERATORS:"},{"line_number":109,"context_line":"                    capabilities[capabilities_key] \u003d scope[1]"},{"line_number":110,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":111,"context_line":"                elif ((len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027)"},{"line_number":112,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_3dc01e7c","line":109,"updated":"2015-02-09 10:43:58.000000000","message":"\u003call-in\u003e will pass this conditional\n\nThe elif conditional should happen before","commit_id":"6c02cd070acd7adbbc066e871a500d55b14b121e"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"7b4227ec5c595779cfd9ce07730cdf63364802c7","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            if capabilities_key:"},{"line_number":107,"context_line":"                scope \u003d val.split()"},{"line_number":108,"context_line":"                if len(scope) \u003e 1 and scope[0] in OPERATORS:"},{"line_number":109,"context_line":"                    capabilities[capabilities_key] \u003d scope[1]"},{"line_number":110,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":111,"context_line":"                elif ((len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027)"},{"line_number":112,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_7c6c5337","line":109,"in_reply_to":"da86d52c_3dc01e7c","updated":"2015-02-09 13:58:01.000000000","message":"yeah. good catch.","commit_id":"6c02cd070acd7adbbc066e871a500d55b14b121e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f6df6600049ee1913ecf78c5fe4e2d9378e6db2e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nova.scheduler.filters import extra_specs_ops"},{"line_number":26,"context_line":"from oslo_config import cfg"},{"line_number":27,"context_line":"from oslo_serialization import jsonutils"},{"line_number":28,"context_line":"import six"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_5cda2aea","line":28,"updated":"2015-02-09 15:28:54.000000000","message":"the ordering of these doesn\u0027t look right, although jenkins seems happy so maybe it doesn\u0027t matter in nova. I thought it should be:\n\noslo...\nsix\n\nnova...","commit_id":"c597ac2fbbe5f69e06542d564db96d4bd9e608cd"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"b943604e85fb03cc2c3c966e20d8e1b9f2cdf6fe","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nova.scheduler.filters import extra_specs_ops"},{"line_number":26,"context_line":"from oslo_config import cfg"},{"line_number":27,"context_line":"from oslo_serialization import jsonutils"},{"line_number":28,"context_line":"import six"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_b2a6ef51","line":28,"in_reply_to":"da86d52c_5cda2aea","updated":"2015-02-09 15:45:23.000000000","message":"No then nova complains.","commit_id":"c597ac2fbbe5f69e06542d564db96d4bd9e608cd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f6df6600049ee1913ecf78c5fe4e2d9378e6db2e","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                scope \u003d val.split()"},{"line_number":108,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":109,"context_line":"                if ((len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027)"},{"line_number":110,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"},{"line_number":111,"context_line":"                    LOG.warning(_LW(\"Operators \u003call-in\u003e and \u003cor\u003e not\""},{"line_number":112,"context_line":"                                    \"supported by Ironic. Input given\""},{"line_number":113,"context_line":"                                    \"at extra_spec is %s\"), val)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_ffd75021","line":110,"updated":"2015-02-09 15:28:54.000000000","message":"Although it will match some value \u0027has\u003cor\u003ein-it\u0027, I suppose it is fine. \n\nDo you know if \u0027\u003cor\u003e\u0027 must be the first term if it is being used? (The example in extra_specs_ops.py shows \u0027\u003cor\u003e v1 \u003cor\u003e v2 \u003cor\u003e v3\u0027.) If so, you could always add it to the list in OPERATORS, and then check for it here like you do with \u003call-in\u003e.","commit_id":"c597ac2fbbe5f69e06542d564db96d4bd9e608cd"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"b943604e85fb03cc2c3c966e20d8e1b9f2cdf6fe","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                scope \u003d val.split()"},{"line_number":108,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":109,"context_line":"                if ((len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027)"},{"line_number":110,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"},{"line_number":111,"context_line":"                    LOG.warning(_LW(\"Operators \u003call-in\u003e and \u003cor\u003e not\""},{"line_number":112,"context_line":"                                    \"supported by Ironic. Input given\""},{"line_number":113,"context_line":"                                    \"at extra_spec is %s\"), val)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_924d6bc7","line":110,"in_reply_to":"da86d52c_ffd75021","updated":"2015-02-09 15:45:23.000000000","message":"I am not sure Ruby. Ok. I will do as suggested.","commit_id":"c597ac2fbbe5f69e06542d564db96d4bd9e608cd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f6df6600049ee1913ecf78c5fe4e2d9378e6db2e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                if ((len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027)"},{"line_number":110,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"},{"line_number":111,"context_line":"                    LOG.warning(_LW(\"Operators \u003call-in\u003e and \u003cor\u003e not\""},{"line_number":112,"context_line":"                                    \"supported by Ironic. Input given\""},{"line_number":113,"context_line":"                                    \"at extra_spec is %s\"), val)"},{"line_number":114,"context_line":"                    continue"},{"line_number":115,"context_line":"                elif len(scope) \u003e 1 and scope[0] in OPERATORS:"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_9c80228d","line":112,"updated":"2015-02-09 15:28:54.000000000","message":"you should add a blank space after \u0027not\u0027 and \u0027given\u0027. Otherwise the message will look like \u0027... notsupported ... givenat ...\u0027.","commit_id":"c597ac2fbbe5f69e06542d564db96d4bd9e608cd"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"b943604e85fb03cc2c3c966e20d8e1b9f2cdf6fe","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                if ((len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027)"},{"line_number":110,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"},{"line_number":111,"context_line":"                    LOG.warning(_LW(\"Operators \u003call-in\u003e and \u003cor\u003e not\""},{"line_number":112,"context_line":"                                    \"supported by Ironic. Input given\""},{"line_number":113,"context_line":"                                    \"at extra_spec is %s\"), val)"},{"line_number":114,"context_line":"                    continue"},{"line_number":115,"context_line":"                elif len(scope) \u003e 1 and scope[0] in OPERATORS:"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_b24a6faa","line":112,"in_reply_to":"da86d52c_9c80228d","updated":"2015-02-09 15:45:23.000000000","message":"ok","commit_id":"c597ac2fbbe5f69e06542d564db96d4bd9e608cd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f6df6600049ee1913ecf78c5fe4e2d9378e6db2e","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"},{"line_number":111,"context_line":"                    LOG.warning(_LW(\"Operators \u003call-in\u003e and \u003cor\u003e not\""},{"line_number":112,"context_line":"                                    \"supported by Ironic. Input given\""},{"line_number":113,"context_line":"                                    \"at extra_spec is %s\"), val)"},{"line_number":114,"context_line":"                    continue"},{"line_number":115,"context_line":"                elif len(scope) \u003e 1 and scope[0] in OPERATORS:"},{"line_number":116,"context_line":"                    capabilities[capabilities_key] \u003d scope[1]"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_7c08ce2d","line":113,"updated":"2015-02-09 15:28:54.000000000","message":"I suggest logging the capabilities_key value too.","commit_id":"c597ac2fbbe5f69e06542d564db96d4bd9e608cd"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"b943604e85fb03cc2c3c966e20d8e1b9f2cdf6fe","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    or \u0027\u003cor\u003e\u0027 in val):"},{"line_number":111,"context_line":"                    LOG.warning(_LW(\"Operators \u003call-in\u003e and \u003cor\u003e not\""},{"line_number":112,"context_line":"                                    \"supported by Ironic. Input given\""},{"line_number":113,"context_line":"                                    \"at extra_spec is %s\"), val)"},{"line_number":114,"context_line":"                    continue"},{"line_number":115,"context_line":"                elif len(scope) \u003e 1 and scope[0] in OPERATORS:"},{"line_number":116,"context_line":"                    capabilities[capabilities_key] \u003d scope[1]"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_72d717c0","line":113,"in_reply_to":"da86d52c_7c08ce2d","updated":"2015-02-09 15:45:23.000000000","message":"ok","commit_id":"c597ac2fbbe5f69e06542d564db96d4bd9e608cd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f6df6600049ee1913ecf78c5fe4e2d9378e6db2e","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                                    \"at extra_spec is %s\"), val)"},{"line_number":114,"context_line":"                    continue"},{"line_number":115,"context_line":"                elif len(scope) \u003e 1 and scope[0] in OPERATORS:"},{"line_number":116,"context_line":"                    capabilities[capabilities_key] \u003d scope[1]"},{"line_number":117,"context_line":"                else:"},{"line_number":118,"context_line":"                    capabilities[capabilities_key] \u003d val"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_df8e0c27","line":116,"updated":"2015-02-09 15:28:54.000000000","message":"Could it be something like \u0027\u003cin\u003e one two\u0027? If so, why take \u0027one\u0027 only?","commit_id":"c597ac2fbbe5f69e06542d564db96d4bd9e608cd"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"b943604e85fb03cc2c3c966e20d8e1b9f2cdf6fe","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                                    \"at extra_spec is %s\"), val)"},{"line_number":114,"context_line":"                    continue"},{"line_number":115,"context_line":"                elif len(scope) \u003e 1 and scope[0] in OPERATORS:"},{"line_number":116,"context_line":"                    capabilities[capabilities_key] \u003d scope[1]"},{"line_number":117,"context_line":"                else:"},{"line_number":118,"context_line":"                    capabilities[capabilities_key] \u003d val"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_b2f8af4a","line":116,"in_reply_to":"da86d52c_df8e0c27","updated":"2015-02-09 15:45:23.000000000","message":"No then the operator \u003call-in\u003e should be used.","commit_id":"c597ac2fbbe5f69e06542d564db96d4bd9e608cd"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0e1466e98e6a33cf4b011a2ca79fa1b2db2b0681","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nova.scheduler.filters import extra_specs_ops"},{"line_number":26,"context_line":"from oslo_config import cfg"},{"line_number":27,"context_line":"from oslo_serialization import jsonutils"},{"line_number":28,"context_line":"import six"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_e1186a77","line":28,"updated":"2015-02-10 09:30:24.000000000","message":"nit, PEP-8fy the imports[1]:\n\nImports should be grouped in the following order: \n\n* standard library imports\n\n* related third party imports\n\n* local application/library specific imports\n\nDon\u0027t need to fix now, only if it happens to you to submit a new patch-set\n\n\n[1] https://www.python.org/dev/peps/pep-0008/#imports","commit_id":"826ddea6b7b0b5571b4f797893c5fded48431334"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2398802ecbc5d5a2839ff516c9bd61ae04ff864d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nova.scheduler.filters import extra_specs_ops"},{"line_number":26,"context_line":"from oslo_config import cfg"},{"line_number":27,"context_line":"from oslo_serialization import jsonutils"},{"line_number":28,"context_line":"import six"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_7fb98aeb","line":28,"in_reply_to":"da86d52c_6139da40","updated":"2015-02-16 15:35:46.000000000","message":"This should be:\n\nfrom oslo_config import cfg\nfrom oslo_serialization import jsonutils\nimport six\n\nfrom nova.i18n import _LW\nfrom nova.openstack.common import log as logging\nfrom nova.scheduler.filters import extra_specs_ops","commit_id":"826ddea6b7b0b5571b4f797893c5fded48431334"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"a802103e5c0ce0cd76e72e8a634b666c8db8138e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nova.scheduler.filters import extra_specs_ops"},{"line_number":26,"context_line":"from oslo_config import cfg"},{"line_number":27,"context_line":"from oslo_serialization import jsonutils"},{"line_number":28,"context_line":"import six"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_683aade8","line":28,"in_reply_to":"da86d52c_7fb98aeb","updated":"2015-02-16 17:32:25.000000000","message":"I had done it that way earlier but jenkins complained. i have posted the way Jenkins is happy.","commit_id":"826ddea6b7b0b5571b4f797893c5fded48431334"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"24194da1ae93fcffeb0dadc2614e35ad715d42d4","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nova.scheduler.filters import extra_specs_ops"},{"line_number":26,"context_line":"from oslo_config import cfg"},{"line_number":27,"context_line":"from oslo_serialization import jsonutils"},{"line_number":28,"context_line":"import six"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_6139da40","line":28,"in_reply_to":"da86d52c_e1186a77","updated":"2015-02-10 09:44:18.000000000","message":"but any other order of import in this gives pep8 error in nova..... :( and jenkins fail","commit_id":"826ddea6b7b0b5571b4f797893c5fded48431334"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"935bade148ee57ce9eccc4c511e14ad941c32e67","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            if capabilities_key:"},{"line_number":107,"context_line":"                scope \u003d val.split()"},{"line_number":108,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":109,"context_line":"                if ((len(scope) \u003e 1) and (scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027"},{"line_number":110,"context_line":"                    or scope[0] \u003d\u003d \u0027\u003cor\u003e\u0027)):"},{"line_number":111,"context_line":"                    LOG.warning(_LW(\"Operators \u003call-in\u003e and \u003cor\u003e not \""},{"line_number":112,"context_line":"                                    \"supported by Ironic. Input given at \""}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_e525f60a","line":109,"updated":"2015-02-09 18:45:06.000000000","message":"Could do:\n\n... scope[0] in (\u0027\u003call-in\u003e\u0027, \u0027\u003cor\u003e\u0027):","commit_id":"826ddea6b7b0b5571b4f797893c5fded48431334"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"95b82b05ca0d00153befee1274d807d7179ff2f7","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            if capabilities_key:"},{"line_number":107,"context_line":"                scope \u003d val.split()"},{"line_number":108,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":109,"context_line":"                if ((len(scope) \u003e 1) and (scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027"},{"line_number":110,"context_line":"                    or scope[0] \u003d\u003d \u0027\u003cor\u003e\u0027)):"},{"line_number":111,"context_line":"                    LOG.warning(_LW(\"Operators \u003call-in\u003e and \u003cor\u003e not \""},{"line_number":112,"context_line":"                                    \"supported by Ironic. Input given at \""}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_dab9ac7a","line":109,"in_reply_to":"da86d52c_2b90bd94","updated":"2015-02-09 20:11:10.000000000","message":"Correct","commit_id":"826ddea6b7b0b5571b4f797893c5fded48431334"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0e1466e98e6a33cf4b011a2ca79fa1b2db2b0681","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            if capabilities_key:"},{"line_number":107,"context_line":"                scope \u003d val.split()"},{"line_number":108,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":109,"context_line":"                if ((len(scope) \u003e 1) and (scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027"},{"line_number":110,"context_line":"                    or scope[0] \u003d\u003d \u0027\u003cor\u003e\u0027)):"},{"line_number":111,"context_line":"                    LOG.warning(_LW(\"Operators \u003call-in\u003e and \u003cor\u003e not \""},{"line_number":112,"context_line":"                                    \"supported by Ironic. Input given at \""}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_212a827e","line":109,"in_reply_to":"da86d52c_dab9ac7a","updated":"2015-02-10 09:30:24.000000000","message":"+1","commit_id":"826ddea6b7b0b5571b4f797893c5fded48431334"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"830708bfea93c8b9e3d8d2eecbcbcef80167f2ba","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            if capabilities_key:"},{"line_number":107,"context_line":"                scope \u003d val.split()"},{"line_number":108,"context_line":"                # TODO(Nisha) :  Handle \u0027\u003call-in\u003e and \u003cor\u003e\u0027 operators later."},{"line_number":109,"context_line":"                if ((len(scope) \u003e 1) and (scope[0] \u003d\u003d \u0027\u003call-in\u003e\u0027"},{"line_number":110,"context_line":"                    or scope[0] \u003d\u003d \u0027\u003cor\u003e\u0027)):"},{"line_number":111,"context_line":"                    LOG.warning(_LW(\"Operators \u003call-in\u003e and \u003cor\u003e not \""},{"line_number":112,"context_line":"                                    \"supported by Ironic. Input given at \""}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_2b90bd94","line":109,"in_reply_to":"da86d52c_e525f60a","updated":"2015-02-09 19:12:27.000000000","message":"Yes, but the current is also ok. so leaving it as the current code. is it fine?","commit_id":"826ddea6b7b0b5571b4f797893c5fded48431334"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"01f09bede4b334d057f3583194c50e2348adfefd","unresolved":false,"context_lines":[{"line_number":35,"context_line":"CONF.import_opt(\u0027default_ephemeral_format\u0027, \u0027nova.virt.driver\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# List of operators supported in nova/scheduler/filters/extra_specs_ops.py"},{"line_number":38,"context_line":"OPERATORS \u003d list(extra_specs_ops._op_methods)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def create(node):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_cd7b9dbc","line":38,"updated":"2015-02-17 00:32:11.000000000","message":"we shouldn\u0027t be importing a private thing here.","commit_id":"ab310ff5c50773adcef83699e4d1f835055c0435"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"5d2879bbb280e87942cf86239f72cf0e75350511","unresolved":false,"context_lines":[{"line_number":35,"context_line":"CONF.import_opt(\u0027default_ephemeral_format\u0027, \u0027nova.virt.driver\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# List of operators supported in nova/scheduler/filters/extra_specs_ops.py"},{"line_number":38,"context_line":"OPERATORS \u003d list(extra_specs_ops._op_methods)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def create(node):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_41269669","line":38,"in_reply_to":"da86d52c_cd7b9dbc","updated":"2015-02-17 04:49:57.000000000","message":"How do you suggest it should be defined then?\nIf we define our own list then it may go out of sync anytime. This way we will always have up-to-date list of operators supported by nova scheduler.\n\nLet me know the opinion","commit_id":"ab310ff5c50773adcef83699e4d1f835055c0435"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c03520a30e8645c3daab38c822d4271e60759cd","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        # 2. extra_specs \u003d {\u0027capabilities:key\u0027 : \u0027\u003cop\u003e value\u0027}"},{"line_number":97,"context_line":"        # The operators \u003call-in\u003e and \u003cor\u003e operators are not supported for now."},{"line_number":98,"context_line":"        # TODO(Nisha) : To extend the support for all the nova supported"},{"line_number":99,"context_line":"        # operators and nested dictionary capabilities key format."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        capabilities \u003d {}"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_19ca3b4f","line":99,"updated":"2015-02-17 19:06:50.000000000","message":"This whole thing seems hackish. However, if we\u0027re going to do this hack, then it should be complete and not fragile such that it just ignores some of the operators. Shouldn\u0027t we fail if we encounter an operator that we know isn\u0027t supported? Or, shouldn\u0027t we just pass all of this through as-is and properly report failure if ironic tells us something was broken?","commit_id":"13fb9d46bd27029be00ddfd997f75ccd05907bf6"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"b8e04afa9cf20323e1666f7da474330f4502b9fa","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        # 2. extra_specs \u003d {\u0027capabilities:key\u0027 : \u0027\u003cop\u003e value\u0027}"},{"line_number":97,"context_line":"        # The operators \u003call-in\u003e and \u003cor\u003e operators are not supported for now."},{"line_number":98,"context_line":"        # TODO(Nisha) : To extend the support for all the nova supported"},{"line_number":99,"context_line":"        # operators and nested dictionary capabilities key format."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        capabilities \u003d {}"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_93b7e420","line":99,"in_reply_to":"da86d52c_19ca3b4f","updated":"2015-02-17 21:13:12.000000000","message":"We discussed this again in ironic and it is decided to pass information as it is to ironic.","commit_id":"13fb9d46bd27029be00ddfd997f75ccd05907bf6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c03520a30e8645c3daab38c822d4271e60759cd","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        capabilities \u003d {}"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # read the flavor and get the extra_specs value."},{"line_number":104,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # scan through the extra_specs values and ignore the keys"},{"line_number":107,"context_line":"        # not starting with keyword \u0027capabilities\u0027."}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_39c7ff46","line":104,"updated":"2015-02-17 19:06:50.000000000","message":"Flavor should be an object, so you should use attribute syntax.\n\nAlso, note that this is getting the extra_specs from a fresh lookup of the flavor. That will need to change in the future as this should be coming directly from the instance, where extra_specs are stored at the time of boot. Thus, if you change a flavor and do something like a rebuild(), this will get the fresh flavor extra_specs now, but will not in the future. If you don\u0027t want that behavior to change, you should go ahead and convert the code to pull the flavor from the instance.","commit_id":"13fb9d46bd27029be00ddfd997f75ccd05907bf6"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"b8e04afa9cf20323e1666f7da474330f4502b9fa","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        capabilities \u003d {}"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # read the flavor and get the extra_specs value."},{"line_number":104,"context_line":"        extra_specs \u003d flavor[\u0027extra_specs\u0027]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # scan through the extra_specs values and ignore the keys"},{"line_number":107,"context_line":"        # not starting with keyword \u0027capabilities\u0027."}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_3320f848","line":104,"in_reply_to":"da86d52c_39c7ff46","updated":"2015-02-17 21:13:12.000000000","message":"The line 78 already had variable accessing flavor data this way.\n\nok. i guess it should not be a blocker for code to merge because it may require more changes in ironic virt driver than this.","commit_id":"13fb9d46bd27029be00ddfd997f75ccd05907bf6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c03520a30e8645c3daab38c822d4271e60759cd","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            # split the extra_spec key to remove the keyword"},{"line_number":114,"context_line":"            # \u0027capabilities\u0027 and get the actual key."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"            capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":117,"context_line":"            if capabilities_key:"},{"line_number":118,"context_line":"                # check if the \u0027value\u0027 is a single word or multiple words."},{"line_number":119,"context_line":"                # If the \u0027value\u0027 consists of multiple words, the value is"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_5c8ca180","line":116,"updated":"2015-02-17 19:06:50.000000000","message":"If I create an extra_spec like \"capabilities:foo:bar\" this will fail with a ValueError, right? Don\u0027t you want to limit the split or handle that?","commit_id":"13fb9d46bd27029be00ddfd997f75ccd05907bf6"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"b8e04afa9cf20323e1666f7da474330f4502b9fa","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            # split the extra_spec key to remove the keyword"},{"line_number":114,"context_line":"            # \u0027capabilities\u0027 and get the actual key."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"            capabilities_string, capabilities_key \u003d key.split(\u0027:\u0027)"},{"line_number":117,"context_line":"            if capabilities_key:"},{"line_number":118,"context_line":"                # check if the \u0027value\u0027 is a single word or multiple words."},{"line_number":119,"context_line":"                # If the \u0027value\u0027 consists of multiple words, the value is"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_d3d87c55","line":116,"in_reply_to":"da86d52c_5c8ca180","updated":"2015-02-17 21:13:12.000000000","message":"Yes .Will limit teh split.","commit_id":"13fb9d46bd27029be00ddfd997f75ccd05907bf6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c03520a30e8645c3daab38c822d4271e60759cd","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                elif len(scope) \u003e 1 and scope[0] in OPERATORS:"},{"line_number":137,"context_line":"                    capabilities[capabilities_key] \u003d scope[1]"},{"line_number":138,"context_line":"                else:"},{"line_number":139,"context_line":"                    capabilities[capabilities_key] \u003d val"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        if capabilities:"},{"line_number":142,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_5cbae10b","line":139,"updated":"2015-02-17 19:06:50.000000000","message":"Aren\u0027t you just throwing away all the operators? Is the point of all this code just to filter out the operators if they\u0027re not \u003call-in\u003e or \u003cor\u003e ?","commit_id":"13fb9d46bd27029be00ddfd997f75ccd05907bf6"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"b8e04afa9cf20323e1666f7da474330f4502b9fa","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                elif len(scope) \u003e 1 and scope[0] in OPERATORS:"},{"line_number":137,"context_line":"                    capabilities[capabilities_key] \u003d scope[1]"},{"line_number":138,"context_line":"                else:"},{"line_number":139,"context_line":"                    capabilities[capabilities_key] \u003d val"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        if capabilities:"},{"line_number":142,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_93c1a450","line":139,"in_reply_to":"da86d52c_5cbae10b","updated":"2015-02-17 21:13:12.000000000","message":"Now will just pass information as it is to ironic. no stripping off of operator.","commit_id":"13fb9d46bd27029be00ddfd997f75ccd05907bf6"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"6e606eddbfcceb3144a5a27ef6d37e7d7203e358","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from nova.openstack.common import log as logging"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF \u003d cfg.CONF"},{"line_number":33,"context_line":"CONF.import_opt(\u0027default_ephemeral_format\u0027, \u0027nova.virt.driver\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_b3acd5ee","line":30,"updated":"2015-02-18 08:49:26.000000000","message":"Looks to be not used?","commit_id":"a3866e4821ca4862719ddd6ec5866b59e392a794"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"ca286fe64ec87dbec9f317fc2aee4382d3db5f3f","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from nova.openstack.common import log as logging"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF \u003d cfg.CONF"},{"line_number":33,"context_line":"CONF.import_opt(\u0027default_ephemeral_format\u0027, \u0027nova.virt.driver\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_d38f89cb","line":30,"in_reply_to":"da86d52c_b3acd5ee","updated":"2015-02-18 09:11:35.000000000","message":"removed. forgot to remove earlier.","commit_id":"a3866e4821ca4862719ddd6ec5866b59e392a794"}]}
