)]}'
{"nova/tests/unit/virt/ironic/test_patcher.py":[{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"24a326a1a3f17b9b033655bb05d74d34fd76f582","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                boot_from_volume\u003dTrue)"},{"line_number":184,"context_line":"        self.assertPatchEqual(expected, patch)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def test_generic_get_deploy_patch_image_meta_traits_required(self):"},{"line_number":187,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":188,"context_line":"        self.image_meta.properties \u003d \\"},{"line_number":189,"context_line":"                objects.ImageMetaProps(traits_required \u003d [\u0027CUSTOM_TRUSTED\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_dbf78bd4","line":186,"updated":"2018-05-03 01:31:45.000000000","message":"i would move the test cases to line 148 since the other trait related methods are present there.\n\nalso we can remove the \u0027meta\u0027 and required from the method name. test_generic_get_deploy_patch_image_traits_required should be sufficient.","commit_id":"da9f0023952d421fb4541bb77bd85bd627d52724"},{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"24a326a1a3f17b9b033655bb05d74d34fd76f582","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            self.instance, self.image_meta, self.flavor)"},{"line_number":209,"context_line":"        self.assertPatchEqual(expected, patch)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def test_generic_get_deploy_patch_image_meta_properties_empty(self):"},{"line_number":212,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":213,"context_line":"        self.image_meta.properties \u003d objects.ImageMetaProps()"},{"line_number":214,"context_line":"        expected \u003d self._expected_deploy_patch"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_dba1cb97","line":211,"updated":"2018-05-03 01:31:45.000000000","message":"should this be test_generic_get_deploy_patch_image_traits_empty() and test for traits being empty or none?","commit_id":"da9f0023952d421fb4541bb77bd85bd627d52724"},{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"ae8aa3d68a27bf97c42036bb0adcf66e389e326c","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            self.instance, self.image_meta, self.flavor)"},{"line_number":158,"context_line":"        self.assertPatchEqual(expected, patch)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_generic_get_deploy_patch_image_meta_flavor_traits_required("},{"line_number":161,"context_line":"            self):"},{"line_number":162,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":163,"context_line":"        self.flavor[\u0027extra_specs\u0027][\u0027trait:CUSTOM_FOO\u0027] \u003d \u0027required\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_b23500fa","line":160,"updated":"2018-05-03 21:47:00.000000000","message":"remove meta from name for this and the below method as well","commit_id":"17a693ad1785c6fa65427866d740c6e5c3c5b9d7"},{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"ae8aa3d68a27bf97c42036bb0adcf66e389e326c","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            self.instance, self.image_meta, self.flavor)"},{"line_number":172,"context_line":"        self.assertPatchEqual(expected, patch)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def test_generic_get_deploy_patch_image_meta_properties_none(self):"},{"line_number":175,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":176,"context_line":"        self.image_meta.properties \u003d objects.ImageMetaProps()"},{"line_number":177,"context_line":"        expected \u003d self._expected_deploy_patch"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_d22d1ca9","line":174,"updated":"2018-05-03 21:47:00.000000000","message":"should this check for image traits being none as well? or are we just testing the image properties being none","commit_id":"17a693ad1785c6fa65427866d740c6e5c3c5b9d7"},{"author":{"_account_id":28171,"name":"karim","email":"karimullah.mohammed@intel.com","username":"karimull"},"change_message_id":"d3c40a2d4f0ea11832fc7cc71e9894b73c5323b4","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            self.instance, self.image_meta, self.flavor)"},{"line_number":172,"context_line":"        self.assertPatchEqual(expected, patch)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def test_generic_get_deploy_patch_image_meta_properties_none(self):"},{"line_number":175,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":176,"context_line":"        self.image_meta.properties \u003d objects.ImageMetaProps()"},{"line_number":177,"context_line":"        expected \u003d self._expected_deploy_patch"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_1d940544","line":174,"in_reply_to":"5f7c97a3_d22d1ca9","updated":"2018-05-18 21:10:05.000000000","message":"This is for no image traits configured in properties object.So we are just checking properties object with no traits.","commit_id":"17a693ad1785c6fa65427866d740c6e5c3c5b9d7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"564ebc8c27199a4895f47563c84f16e43fd4fa41","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                self.instance, self.image_meta, self.flavor)"},{"line_number":146,"context_line":"        self.assertPatchEqual(expected, patch)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_generic_get_deploy_patch_image_traits_required(self):"},{"line_number":149,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":150,"context_line":"        self.image_meta.properties \u003d objects.ImageMetaProps("},{"line_number":151,"context_line":"            traits_required\u003d[\u0027CUSTOM_TRUSTED\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_34dd2042","line":148,"updated":"2018-05-08 13:47:53.000000000","message":"Please add a test to proved that image traits don\u0027t get picked up when booting from volume.","commit_id":"b68e85917cbf741ee8733d5eeae1c63ce349289e"},{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"86ad4571c3645f5d861f6ca2cd90f61b21fd0d9a","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        expected \u003d [patch for patch in self._expected_deploy_patch"},{"line_number":188,"context_line":"                    if patch[\u0027path\u0027] !\u003d \u0027/instance_info/image_source\u0027]"},{"line_number":189,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("},{"line_number":190,"context_line":"            self.instance, self.image_meta, self.flavor,"},{"line_number":191,"context_line":"            boot_from_volume\u003dTrue)"},{"line_number":192,"context_line":"        self.assertPatchEqual(expected, patch)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_5e2b0e2f","line":190,"updated":"2018-05-08 21:40:56.000000000","message":"for boot from volume...would the image_meta be none?","commit_id":"ca5754605314c4b3d5e4b2bf558f3fb54240c09d"},{"author":{"_account_id":28171,"name":"karim","email":"karimullah.mohammed@intel.com","username":"karimull"},"change_message_id":"d3c40a2d4f0ea11832fc7cc71e9894b73c5323b4","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        expected \u003d [patch for patch in self._expected_deploy_patch"},{"line_number":188,"context_line":"                    if patch[\u0027path\u0027] !\u003d \u0027/instance_info/image_source\u0027]"},{"line_number":189,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("},{"line_number":190,"context_line":"            self.instance, self.image_meta, self.flavor,"},{"line_number":191,"context_line":"            boot_from_volume\u003dTrue)"},{"line_number":192,"context_line":"        self.assertPatchEqual(expected, patch)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_b92efca2","line":190,"in_reply_to":"5f7c97a3_5e2b0e2f","updated":"2018-05-18 21:10:05.000000000","message":"From one of the unit test on boot from volume image_meta doesn\u0027t appear to be None(otherwise it would have explicitly assigned a None value). Hence I added \u0027traits_required\u0027 field and this test will make sure , boot from volume ignores image traits","commit_id":"ca5754605314c4b3d5e4b2bf558f3fb54240c09d"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"35d63c47a74a34b50f7e4e106ba9ff8a93e955f3","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        expected \u003d [patch for patch in self._expected_deploy_patch"},{"line_number":188,"context_line":"                    if patch[\u0027path\u0027] !\u003d \u0027/instance_info/image_source\u0027]"},{"line_number":189,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("},{"line_number":190,"context_line":"            self.instance, self.image_meta, self.flavor,"},{"line_number":191,"context_line":"            boot_from_volume\u003dTrue)"},{"line_number":192,"context_line":"        self.assertPatchEqual(expected, patch)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_b6f9224e","line":190,"in_reply_to":"5f7c97a3_5e2b0e2f","updated":"2018-05-09 09:21:56.000000000","message":"Good question. I couldn\u0027t find anything in the code or tests that suggested one way or another for sure.","commit_id":"ca5754605314c4b3d5e4b2bf558f3fb54240c09d"},{"author":{"_account_id":28171,"name":"karim","email":"karimullah.mohammed@intel.com","username":"karimull"},"change_message_id":"d3c40a2d4f0ea11832fc7cc71e9894b73c5323b4","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        expected \u003d [patch for patch in self._expected_deploy_patch"},{"line_number":188,"context_line":"                    if patch[\u0027path\u0027] !\u003d \u0027/instance_info/image_source\u0027]"},{"line_number":189,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("},{"line_number":190,"context_line":"            self.instance, self.image_meta, self.flavor,"},{"line_number":191,"context_line":"            boot_from_volume\u003dTrue)"},{"line_number":192,"context_line":"        self.assertPatchEqual(expected, patch)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_9c9ecd52","line":190,"in_reply_to":"5f7c97a3_b6f9224e","updated":"2018-05-18 21:10:05.000000000","message":"With reference to calls made to Ironic driver at lines number 2016, 2788 and 4952 in nova/compute/manager.py\nimage_meta data and image_meta.properties cannot be None , as they are getting it from Object.ImageMeta.from_dict which will either return an empty object instance or with configured values.\n\nSo for Ironic driver get_deploy_patch() we can always assume image_meta data will not be none and also it does not matter if BFV is true or false image_meta exist.\nImagemeta.properties will either be Empty or will have values depending the call with dict values it is getting passed by calling Object.ImageMeta.from_dict.\nThese call are made at line 1999, 3009,4939 before Ironic driver is called as mentioned above in file nova/compute/manager.py.\n\nHence I modified code accordingly and just added a check to \u0027trait_required\u0027 field in imageMeta.properties to update instance_node traits.\n\nThe only question now I have is, should we consider the traits in ImageMeta.Properties if BFV is true, cause it never explicitly said anywhere not to consider.\nwill be posting this question in the community","commit_id":"ca5754605314c4b3d5e4b2bf558f3fb54240c09d"},{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"dc525631f6ca74402aa909116823ccc4f14a0f70","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":184,"context_line":"        self.image_meta.properties \u003d objects.ImageMetaProps("},{"line_number":185,"context_line":"            traits_required\u003d[\u0027CUSTOM_TRUSTED\u0027])"},{"line_number":186,"context_line":"        expected \u003d [patch for patch in self._expected_deploy_patch"},{"line_number":187,"context_line":"                    if patch[\u0027path\u0027] !\u003d \u0027/instance_info/image_source\u0027] + \\"},{"line_number":188,"context_line":"                   [{\u0027path\u0027: \u0027/instance_info/traits\u0027,"},{"line_number":189,"context_line":"                     \u0027value\u0027: [\"CUSTOM_TRUSTED\"],"},{"line_number":190,"context_line":"                     \u0027op\u0027: \u0027add\u0027}]"},{"line_number":191,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("},{"line_number":192,"context_line":"            self.instance, self.image_meta, self.flavor,"},{"line_number":193,"context_line":"            boot_from_volume\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_1c5e27e6","line":190,"range":{"start_line":186,"start_character":8,"end_line":190,"end_character":34},"updated":"2018-05-18 23:42:16.000000000","message":"Nit: can we follow existing pattern of adding out our custom values to existing(modified in your case) list? slighly hard to read for me\n\nexpected_deploy_patch_volume \u003d [patch for patch in \n self._expected_deploy_patch\n                   if patch[\u0027path\u0027] !\u003d \u0027/instance_info/image_source\u0027]\n\n expected \u003d [{\u0027path\u0027: \u0027/instance_info/traits\u0027,\n                     \u0027value\u0027: [\"CUSTOM_FOO\", \"CUSTOM_TRUSTED\"],\n                     \u0027op\u0027: \u0027add\u0027}]\n\n expected +\u003d self.expected_deploy_patch_volume","commit_id":"83277ac5ec12512a512a635ab572dd7994d6c9b8"},{"author":{"_account_id":28171,"name":"karim","email":"karimullah.mohammed@intel.com","username":"karimull"},"change_message_id":"04e71ab4fa3b751b8c1008c863f9158c68e9482c","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        node \u003d ironic_utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":184,"context_line":"        self.image_meta.properties \u003d objects.ImageMetaProps("},{"line_number":185,"context_line":"            traits_required\u003d[\u0027CUSTOM_TRUSTED\u0027])"},{"line_number":186,"context_line":"        expected \u003d [patch for patch in self._expected_deploy_patch"},{"line_number":187,"context_line":"                    if patch[\u0027path\u0027] !\u003d \u0027/instance_info/image_source\u0027] + \\"},{"line_number":188,"context_line":"                   [{\u0027path\u0027: \u0027/instance_info/traits\u0027,"},{"line_number":189,"context_line":"                     \u0027value\u0027: [\"CUSTOM_TRUSTED\"],"},{"line_number":190,"context_line":"                     \u0027op\u0027: \u0027add\u0027}]"},{"line_number":191,"context_line":"        patch \u003d patcher.create(node).get_deploy_patch("},{"line_number":192,"context_line":"            self.instance, self.image_meta, self.flavor,"},{"line_number":193,"context_line":"            boot_from_volume\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_f007cf17","line":190,"range":{"start_line":186,"start_character":8,"end_line":190,"end_character":34},"in_reply_to":"5f7c97a3_1c5e27e6","updated":"2018-05-19 01:01:10.000000000","message":"Done","commit_id":"83277ac5ec12512a512a635ab572dd7994d6c9b8"}],"nova/virt/ironic/patcher.py":[{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"24a326a1a3f17b9b033655bb05d74d34fd76f582","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        # read the flavor and get the extra_specs value."},{"line_number":90,"context_line":"        extra_specs \u003d flavor.get(\u0027extra_specs\u0027)"},{"line_number":91,"context_line":"        image_meta_traits \u003d image_meta.properties.get(\u0027traits_required\u0027)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # scan through the extra_specs values and ignore the keys"},{"line_number":94,"context_line":"        # not starting with keyword \u0027capabilities\u0027 and \u0027trait\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_db49cb32","line":91,"updated":"2018-05-03 01:31:45.000000000","message":"rename to image_required_traits?","commit_id":"da9f0023952d421fb4541bb77bd85bd627d52724"},{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"24a326a1a3f17b9b033655bb05d74d34fd76f582","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                    if val \u003d\u003d \u0027required\u0027:"},{"line_number":113,"context_line":"                        traits.append(parsed_key)"},{"line_number":114,"context_line":"        if image_meta_traits:"},{"line_number":115,"context_line":"            for key_val in image_meta_traits:"},{"line_number":116,"context_line":"                    traits.append(key_val)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        if capabilities:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_5b04dbc6","line":115,"updated":"2018-05-03 01:31:45.000000000","message":"rename key_val to trait","commit_id":"da9f0023952d421fb4541bb77bd85bd627d52724"},{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"d6c78fef0d4bf060822aaec8a48ef981429c31f4","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        # read the flavor and get the extra_specs value."},{"line_number":90,"context_line":"        extra_specs \u003d flavor.get(\u0027extra_specs\u0027)"},{"line_number":91,"context_line":"        image_required_traits \u003d image_meta.properties.get(\u0027traits_required\u0027)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # scan through the extra_specs values and ignore the keys"},{"line_number":94,"context_line":"        # not starting with keyword \u0027capabilities\u0027 and \u0027trait\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_3d00e134","line":91,"updated":"2018-05-03 22:38:48.000000000","message":"image_meta could be null in case of a boot from volume....so we might need to check for that.","commit_id":"17a693ad1785c6fa65427866d740c6e5c3c5b9d7"},{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"ae8aa3d68a27bf97c42036bb0adcf66e389e326c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                    if val \u003d\u003d \u0027required\u0027:"},{"line_number":113,"context_line":"                        traits.append(parsed_key)"},{"line_number":114,"context_line":"        if image_required_traits:"},{"line_number":115,"context_line":"            for trait in image_required_traits:"},{"line_number":116,"context_line":"                    traits.append(trait)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        if capabilities:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_f255b81e","line":115,"updated":"2018-05-03 21:47:00.000000000","message":"you can do traits.extend(image_required_traits)","commit_id":"17a693ad1785c6fa65427866d740c6e5c3c5b9d7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"564ebc8c27199a4895f47563c84f16e43fd4fa41","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        # read the flavor and get the extra_specs value."},{"line_number":90,"context_line":"        extra_specs \u003d flavor.get(\u0027extra_specs\u0027)"},{"line_number":91,"context_line":"        image_required_traits \u003d None"},{"line_number":92,"context_line":"        if not boot_from_volume:"},{"line_number":93,"context_line":"            image_required_traits \u003d image_meta.properties.get("},{"line_number":94,"context_line":"                \u0027traits_required\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_54f69cfb","line":91,"range":{"start_line":91,"start_character":32,"end_line":91,"end_character":36},"updated":"2018-05-08 13:47:53.000000000","message":"If this were []...","commit_id":"b68e85917cbf741ee8733d5eeae1c63ce349289e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"564ebc8c27199a4895f47563c84f16e43fd4fa41","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                    # to filter out traits not supported by the node."},{"line_number":115,"context_line":"                    if val \u003d\u003d \u0027required\u0027:"},{"line_number":116,"context_line":"                        traits.append(parsed_key)"},{"line_number":117,"context_line":"        if image_required_traits:"},{"line_number":118,"context_line":"            traits.extend(image_required_traits)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        if capabilities:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_d4baac08","line":117,"range":{"start_line":117,"start_character":8,"end_line":117,"end_character":33},"updated":"2018-05-08 13:47:53.000000000","message":"...then you wouldn\u0027t need this condition.\n\nBut on that note, it doesn\u0027t make much sense to use a variable and split the logic around the extra_specs processing.  You could just nix L91-4 and change this chunk to:\n\n if not boot_from_volume:\n     traits.extend(image_meta.properties.get(\u0027traits_required\u0027))","commit_id":"b68e85917cbf741ee8733d5eeae1c63ce349289e"},{"author":{"_account_id":28171,"name":"karim","email":"karimullah.mohammed@intel.com","username":"karimull"},"change_message_id":"d3c40a2d4f0ea11832fc7cc71e9894b73c5323b4","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                    # to filter out traits not supported by the node."},{"line_number":115,"context_line":"                    if val \u003d\u003d \u0027required\u0027:"},{"line_number":116,"context_line":"                        traits.append(parsed_key)"},{"line_number":117,"context_line":"        if image_required_traits:"},{"line_number":118,"context_line":"            traits.extend(image_required_traits)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        if capabilities:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_08255cc2","line":117,"range":{"start_line":117,"start_character":8,"end_line":117,"end_character":33},"in_reply_to":"5f7c97a3_d4baac08","updated":"2018-05-18 21:10:05.000000000","message":"did modified","commit_id":"b68e85917cbf741ee8733d5eeae1c63ce349289e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0c1e4757860ef35f2a5baf293194ce8a19163ff5","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    # to filter out traits not supported by the node."},{"line_number":111,"context_line":"                    if val \u003d\u003d \u0027required\u0027:"},{"line_number":112,"context_line":"                        traits.append(parsed_key)"},{"line_number":113,"context_line":"        if not boot_from_volume and \u0027traits_required\u0027 in image_meta.properties:"},{"line_number":114,"context_line":"            if image_meta.properties.traits_required:"},{"line_number":115,"context_line":"                traits.extend(image_meta.properties.traits_required)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        if capabilities:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_3e22d2a5","line":114,"range":{"start_line":113,"start_character":11,"end_line":114,"end_character":53},"updated":"2018-05-08 21:20:49.000000000","message":"This seems like it could be reduced further, but meh.","commit_id":"ca5754605314c4b3d5e4b2bf558f3fb54240c09d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2786ec9d78206410517ef531720c6125a0213b7e","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    # to filter out traits not supported by the node."},{"line_number":111,"context_line":"                    if val \u003d\u003d \u0027required\u0027:"},{"line_number":112,"context_line":"                        traits.append(parsed_key)"},{"line_number":113,"context_line":"        if not boot_from_volume and \u0027traits_required\u0027 in image_meta.properties:"},{"line_number":114,"context_line":"            if image_meta.properties.traits_required:"},{"line_number":115,"context_line":"                traits.extend(image_meta.properties.traits_required)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        if capabilities:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_80b56e80","line":114,"range":{"start_line":113,"start_character":11,"end_line":114,"end_character":53},"in_reply_to":"5f7c97a3_3e22d2a5","updated":"2018-05-13 13:18:23.000000000","message":"Couldn\u0027t a glance image be the basis for a BFV volume, and as such shouldn\u0027t we still go ahead and publish traits into the API should they be present at all? Perhaps a try/except catch instead?","commit_id":"ca5754605314c4b3d5e4b2bf558f3fb54240c09d"},{"author":{"_account_id":28171,"name":"karim","email":"karimullah.mohammed@intel.com","username":"karimull"},"change_message_id":"d3c40a2d4f0ea11832fc7cc71e9894b73c5323b4","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    # to filter out traits not supported by the node."},{"line_number":111,"context_line":"                    if val \u003d\u003d \u0027required\u0027:"},{"line_number":112,"context_line":"                        traits.append(parsed_key)"},{"line_number":113,"context_line":"        if not boot_from_volume and \u0027traits_required\u0027 in image_meta.properties:"},{"line_number":114,"context_line":"            if image_meta.properties.traits_required:"},{"line_number":115,"context_line":"                traits.extend(image_meta.properties.traits_required)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        if capabilities:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_be6342dc","line":114,"range":{"start_line":113,"start_character":11,"end_line":114,"end_character":53},"in_reply_to":"5f7c97a3_3e22d2a5","updated":"2018-05-18 21:10:05.000000000","message":"you mean to say this can be reduced to a one conditional statement?.","commit_id":"ca5754605314c4b3d5e4b2bf558f3fb54240c09d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f3a6ccdb23ea9e1e3bec0dd3d781423ae0a40e1","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    # to filter out traits not supported by the node."},{"line_number":111,"context_line":"                    if val \u003d\u003d \u0027required\u0027:"},{"line_number":112,"context_line":"                        traits.append(parsed_key)"},{"line_number":113,"context_line":"        if not boot_from_volume and \u0027traits_required\u0027 in image_meta.properties:"},{"line_number":114,"context_line":"            if image_meta.properties.traits_required:"},{"line_number":115,"context_line":"                traits.extend(image_meta.properties.traits_required)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        if capabilities:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_96a8d877","line":114,"range":{"start_line":113,"start_character":11,"end_line":114,"end_character":53},"in_reply_to":"5f7c97a3_be6342dc","updated":"2018-05-18 21:24:33.000000000","message":"As we discussed on IRC, either:\n\n traits.extend(image_meta.properties.get(\u0027traits_required\u0027, []))\n\nor\n\n traits.extend(getattr(image_meta.properties, \u0027traits_required\u0027, []))\n\n(I\u0027m not sure what kind of thingy image_meta.properties is - use the first one if it\u0027s a dict; the second if it\u0027s an object.)","commit_id":"ca5754605314c4b3d5e4b2bf558f3fb54240c09d"},{"author":{"_account_id":17190,"name":"Arvind Nadendla","email":"arvindn05@gmail.com","username":"arvindn05"},"change_message_id":"37dff0ec997a0f3c79f5225a9581c1d652b1fc04","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                    if val \u003d\u003d \u0027required\u0027:"},{"line_number":112,"context_line":"                        traits.append(parsed_key)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if \u0027traits_required\u0027 in image_meta.properties:"},{"line_number":115,"context_line":"            traits.extend(image_meta.properties.get(\u0027traits_required\u0027))"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        if capabilities:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_d0c41895","line":114,"updated":"2018-05-18 18:53:43.000000000","message":"I am still unsure what the image_meta is going to be in the BFV case. Have you found the call stack?\n\nFor example, see my concern below.\n\nWhen creating an instance i see that the meta data is being replaced by BDM metadata(volume) here\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/api.py#L1034\n\nI also see from the method _get_bdm_image_metadata() the image_meta can be just an empty dict.\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/api.py#L1001:21\n\nIf the above is a example, when you try to do image_meta.properties you would encounter an error...again depending on how image_meta is populated...\n\nI would either confirm this can never happen or modify the code to below\n\nif (image_meta and \u0027properties\u0027 in image_meta and \u0027traits_required\u0027 in image_meta.properties)","commit_id":"6d684c0d1a065d03d980c1643bd9cd45c2c4069a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cfc635ed93cb1ef4be46bd6b0454a708db35801d","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                        traits.append(parsed_key)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if \u0027traits_required\u0027 in image_meta.properties:"},{"line_number":115,"context_line":"            traits.extend(image_meta.properties.get(\u0027traits_required\u0027))"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        if capabilities:"},{"line_number":118,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_0756d807","line":115,"range":{"start_line":115,"start_character":47,"end_line":115,"end_character":70},"updated":"2018-05-18 16:05:19.000000000","message":"Why .get here?  If it\u0027s not set, the conditional on L114 wouldn\u0027t have passed.\n\n(If the value is set at all, presumably it\u0027s set to a list; otherwise .extend will fail.)","commit_id":"6d684c0d1a065d03d980c1643bd9cd45c2c4069a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3b08644eb31a5b75331db25da3761fb2fa36c7fb","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    # to filter out traits not supported by the node."},{"line_number":111,"context_line":"                    if val \u003d\u003d \u0027required\u0027:"},{"line_number":112,"context_line":"                        traits.append(parsed_key)"},{"line_number":113,"context_line":"        traits.extend(image_meta.properties.get(\u0027traits_required\u0027, []))"},{"line_number":114,"context_line":"        if capabilities:"},{"line_number":115,"context_line":"            patch.append({\u0027path\u0027: \u0027/instance_info/capabilities\u0027,"},{"line_number":116,"context_line":"                          \u0027op\u0027: \u0027add\u0027, \u0027value\u0027: jsonutils.dumps(capabilities)})"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_357955fb","line":113,"range":{"start_line":113,"start_character":8,"end_line":113,"end_character":71},"updated":"2018-06-11 06:26:48.000000000","message":"thinking of we should use set() to get rid of the duplicated trait. but this isn\u0027t your fault, the original code can\u0027t get rid of the duplicated trait also.","commit_id":"6bd9d4edd22f4989a9707c2d5f08bb0efa150804"}]}
