)]}'
{"doc/source/contributor/webapi-version-history.rst":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"83f9f295e99a7cc1152ac1c9cc278bf0e97d55bc","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Added ``inspect wait`` to available provision states. A node is shown as"},{"line_number":20,"context_line":"``inspect wait`` instead of ``inspecting`` during asynchronous inspection."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"1.38 (Queens, 10.1.0)"},{"line_number":24,"context_line":"---------------------"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-rst","patch_set":42,"id":"5f7c97a3_96cb0171","line":22,"updated":"2018-05-18 13:47:38.000000000","message":"nit -- unnecessary change","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"}],"etc/ironic/policy.json.sample":[{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"e0683f90b964a5fcce4a6e255a1be4830a64d988","unresolved":false,"context_lines":[{"line_number":98,"context_line":"# DELETE  /nodes/{node_ident}/vifs/{node_vif_ident}"},{"line_number":99,"context_line":"#\"baremetal:node:vif:detach\": \"rule:is_admin\""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"# Inject NMI for a node"},{"line_number":102,"context_line":"#\"baremetal:node:inject_nmi\": \"rule:is_admin\""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"# Retrieve BIOS information for a node"},{"line_number":105,"context_line":"#\"baremetal:node:bios:properties\": \"rule:is_admin or rule:is_observer\""}],"source_content_type":"application/octet-stream","patch_set":3,"id":"df87a7cf_0a3f36b4","line":102,"range":{"start_line":101,"start_character":0,"end_line":102,"end_character":45},"updated":"2017-12-08 12:48:15.000000000","message":"This is unrelated change.","commit_id":"0a02d637127f224bdc5dbdbf42016dd631e7ea86"},{"author":{"_account_id":21151,"name":"zenghui.shi","email":"zshi@redhat.com","username":"zshi"},"change_message_id":"2a2a3eeac6167e838902325c731f0b6a9db2a6af","unresolved":false,"context_lines":[{"line_number":98,"context_line":"# DELETE  /nodes/{node_ident}/vifs/{node_vif_ident}"},{"line_number":99,"context_line":"#\"baremetal:node:vif:detach\": \"rule:is_admin\""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"# Inject NMI for a node"},{"line_number":102,"context_line":"#\"baremetal:node:inject_nmi\": \"rule:is_admin\""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"# Retrieve BIOS information for a node"},{"line_number":105,"context_line":"#\"baremetal:node:bios:properties\": \"rule:is_admin or rule:is_observer\""}],"source_content_type":"application/octet-stream","patch_set":3,"id":"df87a7cf_e110d950","line":102,"range":{"start_line":101,"start_character":0,"end_line":102,"end_character":45},"in_reply_to":"df87a7cf_0a3f36b4","updated":"2017-12-11 03:15:23.000000000","message":"Done","commit_id":"0a02d637127f224bdc5dbdbf42016dd631e7ea86"}],"ironic/api/controllers/v1/bios.py":[{"author":{"_account_id":6133,"name":"yolanda.robla","email":"yroblamo@redhat.com","username":"yolanda.robla"},"change_message_id":"48660cd306fdefdc061caafc4052b08a4ab2b578","unresolved":false,"context_lines":[{"line_number":81,"context_line":"class NodeBiosController(rest.RestController):"},{"line_number":82,"context_line":"    \"\"\"REST controller for bios.\"\"\""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    custom_actions \u003d {"},{"line_number":85,"context_line":"        \u0027factory_reset\u0027: [\u0027GET\u0027],"},{"line_number":86,"context_line":"        \u0027apply_configuration\u0027: [\u0027POST\u0027],"},{"line_number":87,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_4ffd3a6c","line":84,"range":{"start_line":84,"start_character":4,"end_line":84,"end_character":18},"updated":"2018-05-25 10:04:45.000000000","message":"you are right, it was a leftover","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8e0d945aa7f6bf99e7e217d75636a7b4a35f48a5","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    custom_actions \u003d {"},{"line_number":85,"context_line":"        \u0027factory_reset\u0027: [\u0027GET\u0027],"},{"line_number":86,"context_line":"        \u0027apply_configuration\u0027: [\u0027POST\u0027],"},{"line_number":87,"context_line":"    }"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __init__(self, node_ident\u003dNone):"},{"line_number":90,"context_line":"        super(NodeBiosController, self).__init__()"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_140f5b37","line":87,"updated":"2018-05-14 09:16:55.000000000","message":"these are clean steps and should not be present here (also they\u0027re not wired in anyway)","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8e0d945aa7f6bf99e7e217d75636a7b4a35f48a5","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        \"\"\"List node bios settings.\"\"\""},{"line_number":97,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":98,"context_line":"        policy.authorize(\u0027baremetal:node:bios:get\u0027, cdict, cdict)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        node \u003d api_utils.get_rpc_node(self.node_ident)"},{"line_number":101,"context_line":"        settings \u003d objects.BIOSSettingList.get_by_node_id("},{"line_number":102,"context_line":"            pecan.request.context, node.id)"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_340cd73f","line":99,"updated":"2018-05-14 09:16:55.000000000","message":"This must fail with 404 when the API version is \u003c1.40","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8e0d945aa7f6bf99e7e217d75636a7b4a35f48a5","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        \"\"\""},{"line_number":113,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":114,"context_line":"        policy.authorize(\u0027baremetal:node:bios:get\u0027, cdict, cdict)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        node \u003d api_utils.get_rpc_node(self.node_ident)"},{"line_number":117,"context_line":"        setting \u003d objects.BIOSSetting.get(pecan.request.context, node.id,"},{"line_number":118,"context_line":"                                          setting_name)"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_d404831a","line":115,"updated":"2018-05-14 09:16:55.000000000","message":"ditto","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8e0d945aa7f6bf99e7e217d75636a7b4a35f48a5","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        setting \u003d objects.BIOSSetting.get(pecan.request.context, node.id,"},{"line_number":118,"context_line":"                                          setting_name)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        obj_setting \u003d BIOSSetting(name\u003dsetting_name, value\u003dsetting.value)"},{"line_number":121,"context_line":"        return obj_setting"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_f4017f07","line":120,"updated":"2018-05-14 09:16:55.000000000","message":"This object also has to have \"links\" field for consistency with what get_all returns","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"880632b3e073a5252bb9165d4d33b3890a8f4857","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    \"\"\"Node bios settings list\"\"\""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @staticmethod"},{"line_number":72,"context_line":"    def collection_from_list(node_uuid, bios_settings):"},{"line_number":73,"context_line":"        col \u003d BIOSSettingsCollection()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        bios_list \u003d []"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_d9fb21bb","line":72,"range":{"start_line":72,"start_character":29,"end_line":72,"end_character":38},"updated":"2018-05-16 12:09:05.000000000","message":"nit: node_ident might be better because node name can be passed.","commit_id":"409adecef3233910491e50c41fdaaef0e4a894f1"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"880632b3e073a5252bb9165d4d33b3890a8f4857","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        policy.authorize(\u0027baremetal:node:bios:get\u0027, cdict, cdict)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if (not api_utils.allow_bios_interface()):"},{"line_number":109,"context_line":"            raise exception.NotAcceptable()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        node \u003d api_utils.get_rpc_node(self.node_ident)"},{"line_number":112,"context_line":"        settings \u003d objects.BIOSSettingList.get_by_node_id("}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_2e5a0982","line":109,"updated":"2018-05-16 12:09:05.000000000","message":"This should be exception.NotFound to hide this resource from an older version.","commit_id":"409adecef3233910491e50c41fdaaef0e4a894f1"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"880632b3e073a5252bb9165d4d33b3890a8f4857","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        policy.authorize(\u0027baremetal:node:bios:get\u0027, cdict, cdict)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if (not api_utils.allow_bios_interface()):"},{"line_number":128,"context_line":"            raise exception.NotAcceptable()"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        node \u003d api_utils.get_rpc_node(self.node_ident)"},{"line_number":131,"context_line":"        setting \u003d objects.BIOSSetting.get(pecan.request.context, node.id,"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_ee573157","line":128,"updated":"2018-05-16 12:09:05.000000000","message":"ditto","commit_id":"409adecef3233910491e50c41fdaaef0e4a894f1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f5e30ec9902659f6c60e81447180962ba748db36","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                                         (kwargs.get(\u0027node_uuid\u0027), self.name)),"},{"line_number":58,"context_line":"                     link.Link.make_link(\u0027bookmark\u0027, url, \u0027nodes\u0027,"},{"line_number":59,"context_line":"                                         \"%s/bios/%s\" %"},{"line_number":60,"context_line":"                                         (kwargs.get(\u0027node_uuid\u0027), self.name),"},{"line_number":61,"context_line":"                                         bookmark\u003dTrue)]"},{"line_number":62,"context_line":"            setattr(self, \u0027links\u0027, links)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"5f7c97a3_bf65a0e3","line":60,"updated":"2018-05-19 18:43:56.000000000","message":"++","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"83f9f295e99a7cc1152ac1c9cc278bf0e97d55bc","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                                         (kwargs.get(\u0027node_uuid\u0027), self.name)),"},{"line_number":58,"context_line":"                     link.Link.make_link(\u0027bookmark\u0027, url, \u0027nodes\u0027,"},{"line_number":59,"context_line":"                                         \"%s/bios/%s\" %"},{"line_number":60,"context_line":"                                         (kwargs.get(\u0027node_uuid\u0027), self.name),"},{"line_number":61,"context_line":"                                         bookmark\u003dTrue)]"},{"line_number":62,"context_line":"            setattr(self, \u0027links\u0027, links)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"5f7c97a3_f62915f2","line":60,"range":{"start_line":60,"start_character":42,"end_line":60,"end_character":65},"updated":"2018-05-18 13:47:38.000000000","message":"why is this optional? having it None will render incorrect links","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"83f9f295e99a7cc1152ac1c9cc278bf0e97d55bc","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        for bios_setting in bios_settings:"},{"line_number":79,"context_line":"            obj \u003d BIOSSetting()"},{"line_number":80,"context_line":"            obj.name \u003d bios_setting.name"},{"line_number":81,"context_line":"            obj.value \u003d bios_setting.value"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"            links \u003d [link.Link.make_link(\u0027self\u0027, url, \u0027nodes\u0027, node_ident +"},{"line_number":84,"context_line":"                                         \"/bios/\" + obj.name),"}],"source_content_type":"text/x-python","patch_set":42,"id":"5f7c97a3_7693c55d","line":81,"range":{"start_line":80,"start_character":12,"end_line":81,"end_character":42},"updated":"2018-05-18 13:47:38.000000000","message":"can be passed to constructor, along with node_ident. this way you will be able to avoid doing L83-88 and you could append obj.links to bios_list","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f5e30ec9902659f6c60e81447180962ba748db36","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":106,"context_line":"        policy.authorize(\u0027baremetal:node:bios:get\u0027, cdict, cdict)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if (not api_utils.allow_bios_interface()):"},{"line_number":109,"context_line":"            raise exception.NotFound()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        node \u003d api_utils.get_rpc_node(self.node_ident)"}],"source_content_type":"text/x-python","patch_set":42,"id":"5f7c97a3_5f624cda","line":108,"updated":"2018-05-19 18:43:56.000000000","message":"nit: redundant brackets","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"83f9f295e99a7cc1152ac1c9cc278bf0e97d55bc","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":106,"context_line":"        policy.authorize(\u0027baremetal:node:bios:get\u0027, cdict, cdict)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if (not api_utils.allow_bios_interface()):"},{"line_number":109,"context_line":"            raise exception.NotFound()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        node \u003d api_utils.get_rpc_node(self.node_ident)"},{"line_number":112,"context_line":"        settings \u003d objects.BIOSSettingList.get_by_node_id("}],"source_content_type":"text/x-python","patch_set":42,"id":"5f7c97a3_36c46d40","line":109,"range":{"start_line":108,"start_character":8,"end_line":109,"end_character":38},"updated":"2018-05-18 13:47:38.000000000","message":"you can move this into node controller lookup method, this way both get_one and get_all will be handled with single check","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"83f9f295e99a7cc1152ac1c9cc278bf0e97d55bc","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        settings \u003d objects.BIOSSettingList.get_by_node_id("},{"line_number":113,"context_line":"            pecan.request.context, node.id)"},{"line_number":114,"context_line":"        return BIOSSettingsCollection.collection_from_list(self.node_ident,"},{"line_number":115,"context_line":"                                                           settings.objects)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @METRICS.timer(\u0027NodeBiosController.get_one\u0027)"},{"line_number":118,"context_line":"    @expose.expose(BIOSSetting, types.name)"}],"source_content_type":"text/x-python","patch_set":42,"id":"5f7c97a3_76cf4557","line":115,"range":{"start_line":115,"start_character":59,"end_line":115,"end_character":75},"updated":"2018-05-18 13:47:38.000000000","message":"can\u0027t you iterate on settings directly?","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f5e30ec9902659f6c60e81447180962ba748db36","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":125,"context_line":"        policy.authorize(\u0027baremetal:node:bios:get\u0027, cdict, cdict)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if (not api_utils.allow_bios_interface()):"},{"line_number":128,"context_line":"            raise exception.NotFound()"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        node \u003d api_utils.get_rpc_node(self.node_ident)"}],"source_content_type":"text/x-python","patch_set":42,"id":"5f7c97a3_7f5f080e","line":127,"updated":"2018-05-19 18:43:56.000000000","message":"nit: redundant brackets","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"245cc592627fe6da8d52d8f8b2b8048e29e984c9","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            raise exception.NotFound()"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        node \u003d api_utils.get_rpc_node(self.node_ident)"},{"line_number":131,"context_line":"        setting \u003d objects.BIOSSetting.get(pecan.request.context, node.id,"},{"line_number":132,"context_line":"                                          setting_name)"},{"line_number":133,"context_line":"        obj_setting \u003d BIOSSetting(name\u003dsetting_name, value\u003dsetting.value,"},{"line_number":134,"context_line":"                                  node_uuid\u003dself.node_ident)"}],"source_content_type":"text/x-python","patch_set":42,"id":"5f7c97a3_92a7720c","line":131,"updated":"2018-05-21 06:50:15.000000000","message":"When the specified setting doesn\u0027t exist, an exception containing an internal node ID[1] is raised to a caller. It would be better to reraise an exception with the specified node_ident.\n\nhttps://github.com/openstack/ironic/blob/master/ironic/db/sqlalchemy/api.py#L1449","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cb5314f43a62f32d0b6112353f2171fcbb20b1e7","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    @expose.expose(BIOSSettingsCollection)"},{"line_number":97,"context_line":"    def get_all(self):"},{"line_number":98,"context_line":"        if not api_utils.allow_bios_interface():"},{"line_number":99,"context_line":"            raise exception.NotFound()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        \"\"\"List node bios settings.\"\"\""},{"line_number":102,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"}],"source_content_type":"text/x-python","patch_set":43,"id":"5f7c97a3_db6c0738","line":99,"updated":"2018-05-23 06:54:11.000000000","message":"I think Vlad means that we could insert check here[1] like other sub resources instead.\n\n[1] https://review.openstack.org/#/c/512579/43/ironic/api/controllers/v1/node.py@1494","commit_id":"ef72806220987b403fa70612656b56224fe2f6f4"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cb5314f43a62f32d0b6112353f2171fcbb20b1e7","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            setting \u003d objects.BIOSSetting.get(pecan.request.context, node.id,"},{"line_number":127,"context_line":"                                              setting_name)"},{"line_number":128,"context_line":"        except exception.BIOSSettingNotFound as e:"},{"line_number":129,"context_line":"            e.code \u003d http_client.BAD_REQUEST"},{"line_number":130,"context_line":"            raise e"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        obj_setting \u003d BIOSSetting(name\u003dsetting_name, value\u003dsetting.value,"}],"source_content_type":"text/x-python","patch_set":43,"id":"5f7c97a3_3b5f3b73","line":129,"updated":"2018-05-23 06:54:11.000000000","message":"We need a similar change like this fix[1]. In addition, it would be better to add a unit test for the case.\n\n[1] https://review.openstack.org/#/c/569763/","commit_id":"ef72806220987b403fa70612656b56224fe2f6f4"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"7c8646416693074b9821e6e73e671daf97d9e584","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        super(NodeBiosController, self).__init__()"},{"line_number":93,"context_line":"        self.node_ident \u003d node_ident"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @pecan.expose()"},{"line_number":96,"context_line":"    def _lookup(self, ident, *remainder):"},{"line_number":97,"context_line":"        try:"},{"line_number":98,"context_line":"            ident \u003d types.uuid_or_name.validate(ident)"},{"line_number":99,"context_line":"        except exception.InvalidUuidOrName as e:"},{"line_number":100,"context_line":"            pecan.abort(http_client.BAD_REQUEST, e.args[0])"},{"line_number":101,"context_line":"        if not remainder:"},{"line_number":102,"context_line":"            return"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        if not api_utils.allow_bios_interface():"},{"line_number":105,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @METRICS.timer(\u0027NodeBiosController.get_all\u0027)"},{"line_number":108,"context_line":"    @expose.expose(BIOSSettingsCollection)"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f7c97a3_c9598ffe","line":105,"range":{"start_line":95,"start_character":0,"end_line":105,"end_character":46},"updated":"2018-05-24 06:25:51.000000000","message":"We don\u0027t need it here.","commit_id":"5bb5133abc4744686de9a5abbcb0ee3452c90f2c"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"7c8646416693074b9821e6e73e671daf97d9e584","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    @METRICS.timer(\u0027NodeBiosController.get_all\u0027)"},{"line_number":108,"context_line":"    @expose.expose(BIOSSettingsCollection)"},{"line_number":109,"context_line":"    def get_all(self):"},{"line_number":110,"context_line":"        if not api_utils.allow_bios_interface():"},{"line_number":111,"context_line":"            raise exception.NotFound()"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        \"\"\"List node bios settings.\"\"\""},{"line_number":114,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f7c97a3_49549fca","line":111,"range":{"start_line":110,"start_character":0,"end_line":111,"end_character":38},"updated":"2018-05-24 06:25:51.000000000","message":"We can delete it after we add a similar check to NodesContoroller._lookup().","commit_id":"5bb5133abc4744686de9a5abbcb0ee3452c90f2c"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"7c8646416693074b9821e6e73e671daf97d9e584","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        :param setting_name: Logical name of the setting to retrieve."},{"line_number":129,"context_line":"        \"\"\""},{"line_number":130,"context_line":"        if not api_utils.allow_bios_interface():"},{"line_number":131,"context_line":"            raise exception.NotFound()"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":134,"context_line":"        policy.authorize(\u0027baremetal:node:bios:get\u0027, cdict, cdict)"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f7c97a3_296363b3","line":131,"range":{"start_line":130,"start_character":0,"end_line":131,"end_character":38},"updated":"2018-05-24 06:25:51.000000000","message":"We can also remove this.","commit_id":"5bb5133abc4744686de9a5abbcb0ee3452c90f2c"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"7c8646416693074b9821e6e73e671daf97d9e584","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            setting \u003d objects.BIOSSetting.get(pecan.request.context, node.id,"},{"line_number":139,"context_line":"                                              setting_name)"},{"line_number":140,"context_line":"        except exception.BIOSSettingNotFound:"},{"line_number":141,"context_line":"            raise exception.BIOSSettingNotFound(node\u003dnode.id,"},{"line_number":142,"context_line":"                                                name\u003dsetting_name)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        obj_setting \u003d BIOSSetting(name\u003dsetting_name, value\u003dsetting.value,"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f7c97a3_293a8397","line":141,"range":{"start_line":141,"start_character":53,"end_line":141,"end_character":60},"updated":"2018-05-24 06:25:51.000000000","message":"We should set node.uuid here to hide node.id, which is used only internally.","commit_id":"5bb5133abc4744686de9a5abbcb0ee3452c90f2c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"732c7e433420bb9c6ff6fb2fdbf07ee4b3bc84b1","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                value \u003d kwargs.get(k, wtypes.Unset)"},{"line_number":51,"context_line":"                setattr(self, k, value)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # add links"},{"line_number":54,"context_line":"        if kwargs[\u0027name\u0027]:"},{"line_number":55,"context_line":"            url \u003d pecan.request.public_url"},{"line_number":56,"context_line":"            links \u003d [link.Link.make_link(\u0027self\u0027, url, \u0027nodes\u0027,"},{"line_number":57,"context_line":"                                         \"%s/bios/%s\" %"},{"line_number":58,"context_line":"                                         (kwargs[\u0027node_uuid\u0027],"},{"line_number":59,"context_line":"                                          kwargs[\u0027name\u0027])),"},{"line_number":60,"context_line":"                     link.Link.make_link(\u0027bookmark\u0027, url, \u0027nodes\u0027,"},{"line_number":61,"context_line":"                                         \"%s/bios/%s\" %"},{"line_number":62,"context_line":"                                         (kwargs[\u0027node_uuid\u0027], kwargs[\u0027name\u0027]),"},{"line_number":63,"context_line":"                                         bookmark\u003dTrue)]"},{"line_number":64,"context_line":"            setattr(self, \u0027links\u0027, links)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class BIOSSettingsCollection(wtypes.Base):"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_1ae1f99b","line":64,"range":{"start_line":53,"start_character":8,"end_line":64,"end_character":41},"updated":"2018-05-25 09:03:29.000000000","message":"why don\u0027t we do this in a convert_with_links method? as here we make node_uuid and name required, but on L50 we do the .get","commit_id":"1b5980b937e09f2db98554358a10b73bb2cdee16"},{"author":{"_account_id":6133,"name":"yolanda.robla","email":"yroblamo@redhat.com","username":"yolanda.robla"},"change_message_id":"48660cd306fdefdc061caafc4052b08a4ab2b578","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                value \u003d kwargs.get(k, wtypes.Unset)"},{"line_number":51,"context_line":"                setattr(self, k, value)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # add links"},{"line_number":54,"context_line":"        if kwargs[\u0027name\u0027]:"},{"line_number":55,"context_line":"            url \u003d pecan.request.public_url"},{"line_number":56,"context_line":"            links \u003d [link.Link.make_link(\u0027self\u0027, url, \u0027nodes\u0027,"},{"line_number":57,"context_line":"                                         \"%s/bios/%s\" %"},{"line_number":58,"context_line":"                                         (kwargs[\u0027node_uuid\u0027],"},{"line_number":59,"context_line":"                                          kwargs[\u0027name\u0027])),"},{"line_number":60,"context_line":"                     link.Link.make_link(\u0027bookmark\u0027, url, \u0027nodes\u0027,"},{"line_number":61,"context_line":"                                         \"%s/bios/%s\" %"},{"line_number":62,"context_line":"                                         (kwargs[\u0027node_uuid\u0027], kwargs[\u0027name\u0027]),"},{"line_number":63,"context_line":"                                         bookmark\u003dTrue)]"},{"line_number":64,"context_line":"            setattr(self, \u0027links\u0027, links)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class BIOSSettingsCollection(wtypes.Base):"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_6ed14efb","line":64,"range":{"start_line":53,"start_character":8,"end_line":64,"end_character":41},"in_reply_to":"5f7c97a3_1ae1f99b","updated":"2018-05-25 10:04:45.000000000","message":"I was thinking about it, but the way it behaves on other classes is a bit different. First, we don\u0027t have a sample method that uses _convert_with_links. And the classmethod convert_with_links, was mostly used to return an specific collection with sorting, limits, etc.. in our case we just want to append those links to the individual results. How can it be implemented? It will be a slightly different convert_with_links method","commit_id":"1b5980b937e09f2db98554358a10b73bb2cdee16"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"d5bfc2ccd3b7f64b187753b8d8551e1c5a7ff72d","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                value \u003d kwargs.get(k, wtypes.Unset)"},{"line_number":51,"context_line":"                setattr(self, k, value)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # add links"},{"line_number":54,"context_line":"        if kwargs[\u0027name\u0027]:"},{"line_number":55,"context_line":"            url \u003d pecan.request.public_url"},{"line_number":56,"context_line":"            links \u003d [link.Link.make_link(\u0027self\u0027, url, \u0027nodes\u0027,"},{"line_number":57,"context_line":"                                         \"%s/bios/%s\" %"},{"line_number":58,"context_line":"                                         (kwargs[\u0027node_uuid\u0027],"},{"line_number":59,"context_line":"                                          kwargs[\u0027name\u0027])),"},{"line_number":60,"context_line":"                     link.Link.make_link(\u0027bookmark\u0027, url, \u0027nodes\u0027,"},{"line_number":61,"context_line":"                                         \"%s/bios/%s\" %"},{"line_number":62,"context_line":"                                         (kwargs[\u0027node_uuid\u0027], kwargs[\u0027name\u0027]),"},{"line_number":63,"context_line":"                                         bookmark\u003dTrue)]"},{"line_number":64,"context_line":"            setattr(self, \u0027links\u0027, links)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class BIOSSettingsCollection(wtypes.Base):"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_4ea57246","line":64,"range":{"start_line":53,"start_character":8,"end_line":64,"end_character":41},"in_reply_to":"5f7c97a3_6ed14efb","updated":"2018-05-25 10:33:38.000000000","message":"we could be just calling convert_with_links in the return of get_all and get_one, as we already know node_uuid there, and bios setting does not contain node_uuid field, so requiring it in the constructor is a bit weird. I can\u0027t say this is a blocker, just an inconsistency with other places.","commit_id":"1b5980b937e09f2db98554358a10b73bb2cdee16"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"732c7e433420bb9c6ff6fb2fdbf07ee4b3bc84b1","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        super(NodeBiosController, self).__init__()"},{"line_number":93,"context_line":"        self.node_ident \u003d node_ident"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @pecan.expose()"},{"line_number":96,"context_line":"    def _lookup(self, ident, *remainder):"},{"line_number":97,"context_line":"        try:"},{"line_number":98,"context_line":"            ident \u003d types.uuid_or_name.validate(ident)"},{"line_number":99,"context_line":"        except exception.InvalidUuidOrName as e:"},{"line_number":100,"context_line":"            pecan.abort(http_client.BAD_REQUEST, e.args[0])"},{"line_number":101,"context_line":"        if not remainder:"},{"line_number":102,"context_line":"            return"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    @METRICS.timer(\u0027NodeBiosController.get_all\u0027)"},{"line_number":105,"context_line":"    @expose.expose(BIOSSettingsCollection)"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_9a9bc915","line":102,"range":{"start_line":95,"start_character":4,"end_line":102,"end_character":18},"updated":"2018-05-25 09:03:29.000000000","message":"please remove this","commit_id":"1b5980b937e09f2db98554358a10b73bb2cdee16"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"732c7e433420bb9c6ff6fb2fdbf07ee4b3bc84b1","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    @METRICS.timer(\u0027NodeBiosController.get_all\u0027)"},{"line_number":105,"context_line":"    @expose.expose(BIOSSettingsCollection)"},{"line_number":106,"context_line":"    def get_all(self):"},{"line_number":107,"context_line":"        if not api_utils.allow_bios_interface():"},{"line_number":108,"context_line":"            raise exception.NotFound()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        \"\"\"List node bios settings.\"\"\""},{"line_number":111,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_1afa5942","line":108,"range":{"start_line":107,"start_character":8,"end_line":108,"end_character":38},"updated":"2018-05-25 09:03:29.000000000","message":"please remove this","commit_id":"1b5980b937e09f2db98554358a10b73bb2cdee16"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0ddf8183475324417c647b3710e3f0e53dd621df","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                setattr(self, k, value)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"},{"line_number":53,"context_line":"    def _convert_with_links(bios, node_uuid, url):"},{"line_number":54,"context_line":"        \"\"\"Add links to the bios setting.\"\"\""},{"line_number":55,"context_line":"        name \u003d bios.name"},{"line_number":56,"context_line":"        bios.links \u003d [link.Link.make_link(\u0027self\u0027, url, \u0027nodes\u0027,"}],"source_content_type":"text/x-python","patch_set":48,"id":"5f7c97a3_e42b3fe8","line":53,"range":{"start_line":53,"start_character":28,"end_line":53,"end_character":32},"updated":"2018-05-25 13:14:56.000000000","message":"forgot cls here :)","commit_id":"44ceb3d679de302b3f2871214d551dd2057c1318"},{"author":{"_account_id":6133,"name":"yolanda.robla","email":"yroblamo@redhat.com","username":"yolanda.robla"},"change_message_id":"7266942771df1a16b57a742fcbcb97638ec24df4","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                setattr(self, k, value)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"},{"line_number":53,"context_line":"    def _convert_with_links(bios, node_uuid, url):"},{"line_number":54,"context_line":"        \"\"\"Add links to the bios setting.\"\"\""},{"line_number":55,"context_line":"        name \u003d bios.name"},{"line_number":56,"context_line":"        bios.links \u003d [link.Link.make_link(\u0027self\u0027, url, \u0027nodes\u0027,"}],"source_content_type":"text/x-python","patch_set":48,"id":"5f7c97a3_9395ef89","line":53,"range":{"start_line":53,"start_character":28,"end_line":53,"end_character":32},"in_reply_to":"5f7c97a3_e42b3fe8","updated":"2018-05-25 19:46:42.000000000","message":"It does not work if i add cls here, and also any other of the _convert_with_links method are using that parameter.. they use on the convert_with_links method","commit_id":"44ceb3d679de302b3f2871214d551dd2057c1318"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0ddf8183475324417c647b3710e3f0e53dd621df","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        bios_list \u003d []"},{"line_number":81,"context_line":"        for bios_setting in bios_settings:"},{"line_number":82,"context_line":"            obj \u003d BIOSSetting(node_uuid\u003dnode_ident,"},{"line_number":83,"context_line":"                              name\u003dbios_setting.name,"},{"line_number":84,"context_line":"                              value\u003dbios_setting.value)"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"5f7c97a3_a431c75b","line":82,"range":{"start_line":82,"start_character":30,"end_line":82,"end_character":50},"updated":"2018-05-25 13:14:56.000000000","message":"not needed anymore","commit_id":"44ceb3d679de302b3f2871214d551dd2057c1318"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"40086c44d52c524e20e4875f08260370bcbe72f4","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        bios_list \u003d []"},{"line_number":81,"context_line":"        for bios_setting in bios_settings:"},{"line_number":82,"context_line":"            obj \u003d BIOSSetting(name\u003dbios_setting.name,"},{"line_number":83,"context_line":"                              value\u003dbios_setting.value)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"            bios_list.append(obj.convert_with_links(obj, node_ident))"},{"line_number":86,"context_line":"        col.bios \u003d bios_list"},{"line_number":87,"context_line":"        return col"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"5f7c97a3_281a5dcb","line":85,"range":{"start_line":82,"start_character":0,"end_line":85,"end_character":69},"updated":"2018-05-28 05:13:35.000000000","message":"Because convert_with_links requires rpc_bios, we don\u0027t need to create an api BIOSSetting here. We can pass each bios_setting to convert_with_links like:\n\n  bios_list.append(BIOSSetting.convert_with_links(bios_setting, node_ident)","commit_id":"e817bcdd8e1d42a2e347ce3a3eb80162eaaf510c"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"460f8ac62e71fd5e4de56c58f198c6072712b75e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                                                           settings)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @METRICS.timer(\u0027NodeBiosController.get_one\u0027)"},{"line_number":109,"context_line":"    @expose.expose(BIOSSetting, types.name)"},{"line_number":110,"context_line":"    def get_one(self, setting_name):"},{"line_number":111,"context_line":"        \"\"\"Retrieve information about the given bios setting."},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"5f7c97a3_721e03bc","line":109,"range":{"start_line":109,"start_character":18,"end_line":109,"end_character":30},"updated":"2018-05-28 09:55:06.000000000","message":"Probably, \u0027s/BIOSSetting/{wtypes.text: BIOSSetting}/\u0027 would enable returning a dict.","commit_id":"dc4c4285caf21452067d948ed9ba01a2c61342db"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"c46fd05cdd35d8d3949915bf777307b96c6f3b99","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            raise exception.BIOSSettingNotFound(node\u003dnode.uuid,"},{"line_number":124,"context_line":"                                                name\u003dsetting_name)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        return BIOSSetting.convert_with_links(setting, node.uuid)"}],"source_content_type":"text/x-python","patch_set":50,"id":"5f7c97a3_9ff7285a","line":126,"updated":"2018-05-28 08:55:37.000000000","message":"According to the approved SPEC, this API should return:\n\n  {\n    \"\u003csetting name\u003e\":\n      {\n        \"name\": \u003csetting name\u003e,\n        \"value\": \u003cvalue\u003e\n      }\n  }\n\nHowever, the current implementation returns:\n\n  {\n    \"name\": \u003csetting name\u003e,\n    \"value\": \u003cvalue\u003e\n  }\n\n[1] https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/generic-bios-config.html","commit_id":"dc4c4285caf21452067d948ed9ba01a2c61342db"},{"author":{"_account_id":6133,"name":"yolanda.robla","email":"yroblamo@redhat.com","username":"yolanda.robla"},"change_message_id":"74ec46c5445c02d45acf9a7619067f732a7779a8","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            raise exception.BIOSSettingNotFound(node\u003dnode.uuid,"},{"line_number":124,"context_line":"                                                name\u003dsetting_name)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        return BIOSSetting.convert_with_links(setting, node.uuid)"}],"source_content_type":"text/x-python","patch_set":50,"id":"5f7c97a3_12ceafb3","line":126,"in_reply_to":"5f7c97a3_9ff7285a","updated":"2018-05-28 09:20:25.000000000","message":"I tried to go that way, but it seems to be breaking the expected output for standard methods. When i return { setting_name: {BIOSSetting.convert_with_links(setting, node.uuid) }\n\nThe test is throwing:\n\nERROR: ironic.tests.unit.api.controllers.v1.test_node.TestBIOS.test_get_one_bios\n----------------------------------------------------------------------\nTraceback (most recent call last):\n  File \"ironic/tests/unit/api/controllers/v1/test_node.py\", line 4458, in test_get_one_bios\n    headers\u003d{api_base.Version.string: self.version})\n  File \"ironic/tests/unit/api/base.py\", line 221, in get_json\n    expect_errors\u003dexpect_errors)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/webtest/app.py\", line 331, in get\n    expect_errors\u003dexpect_errors)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/webtest/app.py\", line 625, in do_request\n    res \u003d req.get_response(app, catch_exc_info\u003dTrue)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/webob/request.py\", line 1309, in send\n    application, catch_exc_info\u003dTrue)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/webob/request.py\", line 1277, in call_application\n    app_iter \u003d application(self.environ, start_response)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/webtest/lint.py\", line 200, in lint_app\n    iterator \u003d application(environ, start_response_wrapper)\n  File \"ironic/api/middleware/json_ext.py\", line 43, in __call__\n    return self.app(env, start_response)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/webob/dec.py\", line 129, in __call__\n    resp \u003d self.call_func(req, *args, **kw)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/webob/dec.py\", line 193, in call_func\n    return self.func(req, *args, **kwargs)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/oslo_middleware/base.py\", line 131, in __call__\n    response \u003d req.get_response(self.application)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/webob/request.py\", line 1313, in send\n    application, catch_exc_info\u003dFalse)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/webob/request.py\", line 1277, in call_application\n    app_iter \u003d application(self.environ, start_response)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/pecan/middleware/recursive.py\", line 56, in __call__\n    return self.application(environ, start_response)\n  File \"ironic/api/middleware/parsable_error.py\", line 67, in __call__\n    app_iter \u003d self.app(environ, replacement_start_response)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/pecan/core.py\", line 840, in __call__\n    return super(Pecan, self).__call__(environ, start_response)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/pecan/core.py\", line 683, in __call__\n    self.invoke_controller(controller, args, kwargs, state)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/pecan/core.py\", line 604, in invoke_controller\n    result \u003d self.render(template, result)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/pecan/core.py\", line 425, in render\n    return renderer.render(template, namespace)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/wsmeext/pecan.py\", line 28, in render\n    namespace[\u0027datatype\u0027]\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/wsme/rest/json.py\", line 298, in encode_result\n    jsondata \u003d tojson(datatype, value)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/simplegeneric.py\", line 63, in dispatch\n    return f(*args, **kw)\n  File \"/home/yolanda/desarrollo/ironic/.tox/py27/lib/python2.7/site-packages/wsme/rest/json.py\", line 53, in tojson\n    attr_value \u003d getattr(value, attr.key)\nAttributeError: \u0027dict\u0027 object has no attribute \u0027name\u0027\n\nRan 1 test in 0.376s","commit_id":"dc4c4285caf21452067d948ed9ba01a2c61342db"}],"ironic/api/controllers/v1/driver.py":[{"author":{"_account_id":22255,"name":"Tuan","email":"tuanla@vn.fujitsu.com","username":"Tuan"},"change_message_id":"b326a01cc15f7849fbf77673d23b7e57a1a19c90","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    default_rescue_interface \u003d wtypes.text"},{"line_number":111,"context_line":"    default_storage_interface \u003d wtypes.text"},{"line_number":112,"context_line":"    default_vendor_interface \u003d wtypes.text"},{"line_number":113,"context_line":"    default_bios_interface \u003d wtypes.text"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    \"\"\"A list of enabled interfaces for a hardware type\"\"\""},{"line_number":116,"context_line":"    enabled_boot_interfaces \u003d [wtypes.text]"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf659307_49daad17","line":113,"range":{"start_line":113,"start_character":4,"end_line":113,"end_character":27},"updated":"2018-03-26 09:39:38.000000000","message":"It should be in alphabetical order","commit_id":"6c5413695da2e4cad2ed5b6249100bf4dd34a123"},{"author":{"_account_id":22255,"name":"Tuan","email":"tuanla@vn.fujitsu.com","username":"Tuan"},"change_message_id":"b326a01cc15f7849fbf77673d23b7e57a1a19c90","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    enabled_rescue_interfaces \u003d [wtypes.text]"},{"line_number":125,"context_line":"    enabled_storage_interfaces \u003d [wtypes.text]"},{"line_number":126,"context_line":"    enabled_vendor_interfaces \u003d [wtypes.text]"},{"line_number":127,"context_line":"    enabled_bios_interfaces \u003d [wtypes.text]"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    @staticmethod"},{"line_number":130,"context_line":"    def convert_with_links(name, hosts, driver_type, detail\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf659307_290bb98e","line":127,"range":{"start_line":127,"start_character":4,"end_line":127,"end_character":43},"updated":"2018-03-26 09:39:38.000000000","message":"It should be in alphabetical order","commit_id":"6c5413695da2e4cad2ed5b6249100bf4dd34a123"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8e0d945aa7f6bf99e7e217d75636a7b4a35f48a5","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    default_rescue_interface \u003d wtypes.text"},{"line_number":115,"context_line":"    default_storage_interface \u003d wtypes.text"},{"line_number":116,"context_line":"    default_vendor_interface \u003d wtypes.text"},{"line_number":117,"context_line":"    default_bios_interface \u003d wtypes.text"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    \"\"\"A list of enabled interfaces for a hardware type\"\"\""},{"line_number":120,"context_line":"    enabled_boot_interfaces \u003d [wtypes.text]"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_5411535c","line":117,"updated":"2018-05-14 09:16:55.000000000","message":"nit: please keep the list sorted","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8e0d945aa7f6bf99e7e217d75636a7b4a35f48a5","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    enabled_rescue_interfaces \u003d [wtypes.text]"},{"line_number":129,"context_line":"    enabled_storage_interfaces \u003d [wtypes.text]"},{"line_number":130,"context_line":"    enabled_vendor_interfaces \u003d [wtypes.text]"},{"line_number":131,"context_line":"    enabled_bios_interfaces \u003d [wtypes.text]"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    @staticmethod"},{"line_number":134,"context_line":"    def convert_with_links(name, hosts, driver_type, detail\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_7416cf57","line":131,"updated":"2018-05-14 09:16:55.000000000","message":"ditto","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"}],"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":22255,"name":"Tuan","email":"tuanla@vn.fujitsu.com","username":"Tuan"},"change_message_id":"b326a01cc15f7849fbf77673d23b7e57a1a19c90","unresolved":false,"context_lines":[{"line_number":315,"context_line":"    def get(self, node_ident):"},{"line_number":316,"context_line":"        \"\"\"Get the current bios properties for a node."},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        :param node_ident: the UUID of a node."},{"line_number":319,"context_line":"        :returns: a json object containing:"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"            :id: The id of NodeBIOS object"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf659307_a97349e7","line":318,"range":{"start_line":318,"start_character":27,"end_line":318,"end_character":46},"updated":"2018-03-26 09:39:38.000000000","message":"should it is \"the UUID or logical name of a node\"","commit_id":"6c5413695da2e4cad2ed5b6249100bf4dd34a123"},{"author":{"_account_id":22255,"name":"Tuan","email":"tuanla@vn.fujitsu.com","username":"Tuan"},"change_message_id":"b326a01cc15f7849fbf77673d23b7e57a1a19c90","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"    traits \u003d wtypes.ArrayType(str)"},{"line_number":1070,"context_line":"    \"\"\"The traits associated with this node\"\"\""},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    bios_interface \u003d wsme.wsattr(wtypes.text)"},{"line_number":1073,"context_line":"    \"\"\"The bios interface to be used for this node\"\"\""},{"line_number":1074,"context_line":""},{"line_number":1075,"context_line":"    # NOTE(deva): \"conductor_affinity\" shouldn\u0027t be presented on the"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf659307_c9131d66","line":1072,"range":{"start_line":1072,"start_character":4,"end_line":1072,"end_character":45},"updated":"2018-03-26 09:39:38.000000000","message":"it should be in alphabetical order","commit_id":"6c5413695da2e4cad2ed5b6249100bf4dd34a123"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6346e97c653647c186fd39391ee5430b0ae5a2cf","unresolved":false,"context_lines":[{"line_number":311,"context_line":"class BIOSSettings(base.APIBase):"},{"line_number":312,"context_line":"    \"\"\"API representation of the bios settings for a node.\"\"\""},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    settings \u003d wtypes.ArrayType(str)"},{"line_number":315,"context_line":"    \"\"\"node bios settings\"\"\""},{"line_number":316,"context_line":""},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"9f6a8fd7_5e6893b7","line":314,"range":{"start_line":314,"start_character":22,"end_line":314,"end_character":36},"updated":"2018-04-23 13:37:31.000000000","message":"Why is it list of strings? I\u0027d expect it to be list of BIOSSetting","commit_id":"e9f632ce3093c10bd98c27be08899910bc4461d2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6346e97c653647c186fd39391ee5430b0ae5a2cf","unresolved":false,"context_lines":[{"line_number":315,"context_line":"    \"\"\"node bios settings\"\"\""},{"line_number":316,"context_line":""},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"class BIOSSetting(base.APIBase):"},{"line_number":319,"context_line":"    \"\"\"API representation of a bios setting for a node.\"\"\""},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    setting \u003d wtypes.DictType(wtypes.text, wtypes.text)"},{"line_number":322,"context_line":"    \"\"\"node bios setting\"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"9f6a8fd7_fe47274b","line":319,"range":{"start_line":318,"start_character":0,"end_line":319,"end_character":58},"updated":"2018-04-23 13:37:31.000000000","message":"can you please update the names and docstrings for these two types so that they can be easier distinguished? Maybe one should be BIOSSettingList?","commit_id":"e9f632ce3093c10bd98c27be08899910bc4461d2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6346e97c653647c186fd39391ee5430b0ae5a2cf","unresolved":false,"context_lines":[{"line_number":318,"context_line":"class BIOSSetting(base.APIBase):"},{"line_number":319,"context_line":"    \"\"\"API representation of a bios setting for a node.\"\"\""},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    setting \u003d wtypes.DictType(wtypes.text, wtypes.text)"},{"line_number":322,"context_line":"    \"\"\"node bios setting\"\"\""},{"line_number":323,"context_line":""},{"line_number":324,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"9f6a8fd7_5eadf3e6","line":321,"range":{"start_line":321,"start_character":14,"end_line":321,"end_character":55},"updated":"2018-04-23 13:37:31.000000000","message":"it\u0027s not just a dict, it\u0027s an object with \"name\", \"value\" and \"links\" keys. Let\u0027s please make it typed.","commit_id":"e9f632ce3093c10bd98c27be08899910bc4461d2"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"50337ca75b5dbf146341d0be4da024d5397f30d7","unresolved":false,"context_lines":[{"line_number":312,"context_line":"    \"\"\"API representation of the bios settings for a node.\"\"\""},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    settings \u003d wtypes.ArrayType(str)"},{"line_number":315,"context_line":"    \"\"\"node bios settings\"\"\""},{"line_number":316,"context_line":""},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"class BIOSSetting(base.APIBase):"}],"source_content_type":"text/x-python","patch_set":27,"id":"9f6a8fd7_2b8436d2","line":315,"updated":"2018-04-26 09:53:11.000000000","message":"nit: s/node/Node/","commit_id":"b8be0cc051b8f3724295fc5dbe1ea2f190e8fb0e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"50337ca75b5dbf146341d0be4da024d5397f30d7","unresolved":false,"context_lines":[{"line_number":319,"context_line":"    \"\"\"API representation of a bios setting for a node.\"\"\""},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    setting \u003d wtypes.DictType(wtypes.text, wtypes.text)"},{"line_number":322,"context_line":"    \"\"\"node bios setting\"\"\""},{"line_number":323,"context_line":""},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"class NodeBiosController(rest.RestController):"}],"source_content_type":"text/x-python","patch_set":27,"id":"9f6a8fd7_cb6eda2d","line":322,"updated":"2018-04-26 09:53:11.000000000","message":"nit: s/node/Node/","commit_id":"b8be0cc051b8f3724295fc5dbe1ea2f190e8fb0e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"50337ca75b5dbf146341d0be4da024d5397f30d7","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":336,"context_line":"        bios_setting \u003d pecan.request.rpcapi.get_cached_bios_property("},{"line_number":337,"context_line":"            pecan.request.context, rpc_node, setting_name, topic\u003dtopic)"},{"line_number":338,"context_line":"        return bios_setting"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    @METRICS.timer(\u0027NodeBiosController.get_all\u0027)"},{"line_number":341,"context_line":"    @expose.expose(BIOSSettings)"}],"source_content_type":"text/x-python","patch_set":27,"id":"9f6a8fd7_ab6fe625","line":338,"updated":"2018-04-26 09:53:11.000000000","message":"I don\u0027t see this being used.","commit_id":"b8be0cc051b8f3724295fc5dbe1ea2f190e8fb0e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"50337ca75b5dbf146341d0be4da024d5397f30d7","unresolved":false,"context_lines":[{"line_number":1522,"context_line":"        \u0027portgroups\u0027: portgroup.PortgroupsController,"},{"line_number":1523,"context_line":"        \u0027vifs\u0027: NodeVIFController,"},{"line_number":1524,"context_line":"        \u0027volume\u0027: volume.VolumeController,"},{"line_number":1525,"context_line":"        \u0027traits\u0027: NodeTraitsController,"},{"line_number":1526,"context_line":"    }"},{"line_number":1527,"context_line":""},{"line_number":1528,"context_line":"    @pecan.expose()"}],"source_content_type":"text/x-python","patch_set":27,"id":"9f6a8fd7_2bebd677","line":1525,"updated":"2018-04-26 09:53:11.000000000","message":"bios controller needs adding here.","commit_id":"b8be0cc051b8f3724295fc5dbe1ea2f190e8fb0e"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"bc8b5fc165e118716914fab5d048fff445af5463","unresolved":false,"context_lines":[{"line_number":1463,"context_line":"    invalid_sort_key_list \u003d [\u0027properties\u0027, \u0027driver_info\u0027, \u0027extra\u0027,"},{"line_number":1464,"context_line":"                             \u0027instance_info\u0027, \u0027driver_internal_info\u0027,"},{"line_number":1465,"context_line":"                             \u0027clean_step\u0027, \u0027raid_config\u0027, \u0027target_raid_config\u0027,"},{"line_number":1466,"context_line":"                             \u0027traits\u0027, \u0027bios\u0027]"},{"line_number":1467,"context_line":""},{"line_number":1468,"context_line":"    _subcontroller_map \u003d {"},{"line_number":1469,"context_line":"        \u0027ports\u0027: port.PortsController,"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_c5c60b69","line":1466,"range":{"start_line":1466,"start_character":39,"end_line":1466,"end_character":45},"updated":"2018-05-14 11:19:09.000000000","message":"This is not necessary because this field is not added to a node resource.","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"7c8646416693074b9821e6e73e671daf97d9e584","unresolved":false,"context_lines":[{"line_number":1491,"context_line":"            # NOTE(mgoddard): Returning here will ensure we exhibit the"},{"line_number":1492,"context_line":"            # behaviour of previous releases for microversions without this"},{"line_number":1493,"context_line":"            # endpoint."},{"line_number":1494,"context_line":"            return"},{"line_number":1495,"context_line":"        subcontroller \u003d self._subcontroller_map.get(remainder[0])"},{"line_number":1496,"context_line":"        if subcontroller:"},{"line_number":1497,"context_line":"            return subcontroller(node_ident\u003dident), remainder[1:]"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f7c97a3_e95c8bee","line":1494,"updated":"2018-05-24 06:25:51.000000000","message":"We can insert the following code here instead of checking at get_all() and get_one() of NodeBiosController:\n\n  if remainder[0] \u003d\u003d \u0027bios\u0027 and not api_utils.allow_bios_interface():\n            return","commit_id":"5bb5133abc4744686de9a5abbcb0ee3452c90f2c"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"bc8b5fc165e118716914fab5d048fff445af5463","unresolved":false,"context_lines":[{"line_number":375,"context_line":"        raise exception.NotAcceptable()"},{"line_number":376,"context_line":"    if \u0027rescue_interface\u0027 in fields and not allow_rescue_interface():"},{"line_number":377,"context_line":"        raise exception.NotAcceptable()"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"def check_allowed_portgroup_fields(fields):"},{"line_number":381,"context_line":"    \"\"\"Check if fetching a particular field of a portgroup is allowed."}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_65861716","line":378,"updated":"2018-05-14 11:19:09.000000000","message":"We also need to add bios_interface here.","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"}],"ironic/api/controllers/v1/versions.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7c5220cadab3e8973891e444d6c308a5d572873e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"# v1.37: Add node traits."},{"line_number":77,"context_line":"# v1.38: Add rescue and unrescue provision states"},{"line_number":78,"context_line":"# v1.39: Add inspect wait provision state."},{"line_number":79,"context_line":"#        Add rescue_interface to the node object"},{"line_number":80,"context_line":"# v1.40: Add bios.properties."},{"line_number":81,"context_line":"#        Add bios_interface to the node object."},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"5f7c97a3_f980c148","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":48},"updated":"2018-05-10 19:46:42.000000000","message":"Rebase error? should be on v1.38 I believe.","commit_id":"a65ffec6f848df87e97563a61ce0980c716bd490"}],"ironic/common/policy.py":[{"author":{"_account_id":22255,"name":"Tuan","email":"tuanla@vn.fujitsu.com","username":"Tuan"},"change_message_id":"b326a01cc15f7849fbf77673d23b7e57a1a19c90","unresolved":false,"context_lines":[{"line_number":200,"context_line":"         {\u0027path\u0027: \u0027/nodes/{node_ident}/traits/{trait}\u0027,"},{"line_number":201,"context_line":"          \u0027method\u0027: \u0027DELETE\u0027}]),"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":204,"context_line":"        \u0027baremetal:node:bios:properties\u0027,"},{"line_number":205,"context_line":"        \u0027rule:is_admin or rule:is_observer\u0027,"},{"line_number":206,"context_line":"        \u0027Retrieve Node BIOS information\u0027,"},{"line_number":207,"context_line":"        [{\u0027path\u0027: \u0027/nodes/{node_ident}/bios/properties\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf659307_db4c4078","line":204,"range":{"start_line":203,"start_character":2,"end_line":204,"end_character":41},"updated":"2018-03-26 09:39:38.000000000","message":"It should be in alphabetical order","commit_id":"6c5413695da2e4cad2ed5b6249100bf4dd34a123"}],"ironic/tests/unit/api/controllers/v1/test_node.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"bc8b5fc165e118716914fab5d048fff445af5463","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        data \u003d self.get_json("},{"line_number":235,"context_line":"            \u0027/nodes/%s\u0027 % node.uuid,"},{"line_number":236,"context_line":"            headers\u003d{api_base.Version.string: \u00271.39\u0027})"},{"line_number":237,"context_line":"        self.assertNotIn(\u0027bios_\u0027, data)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def test_node_inspect_wait_state_between_api_versions(self):"},{"line_number":240,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_a5950f35","line":237,"range":{"start_line":237,"start_character":26,"end_line":237,"end_character":31},"updated":"2018-05-14 11:19:09.000000000","message":"s/bios_/bios_interface/","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8e0d945aa7f6bf99e7e217d75636a7b4a35f48a5","unresolved":false,"context_lines":[{"line_number":4449,"context_line":"        ret \u003d self.get_json(\u0027/nodes/%s/bios/virtualization\u0027 % self.node.uuid,"},{"line_number":4450,"context_line":"                            headers\u003d{api_base.Version.string: self.version})"},{"line_number":4451,"context_line":"        expected_json \u003d {u\u0027name\u0027: u\u0027virtualization\u0027, u\u0027value\u0027: u\u0027on\u0027}"},{"line_number":4452,"context_line":"        self.assertEqual(expected_json, ret)"},{"line_number":4453,"context_line":""},{"line_number":4454,"context_line":""},{"line_number":4455,"context_line":"class TestTraits(test_api_base.BaseApiTest):"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_8f003203","line":4452,"updated":"2018-05-14 09:16:55.000000000","message":"needs a test that the new endpoints are not exposed in API versions \u003c1.40","commit_id":"f9b0253a68a945ff90e9c16d3d1220f549d5af60"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"c46fd05cdd35d8d3949915bf777307b96c6f3b99","unresolved":false,"context_lines":[{"line_number":4437,"context_line":"                            headers\u003d{api_base.Version.string: self.version})"},{"line_number":4438,"context_line":""},{"line_number":4439,"context_line":"        expected_json \u003d ["},{"line_number":4440,"context_line":"            {u\u0027created_at\u0027: ret[\u0027bios\u0027][0][\u0027created_at\u0027],"},{"line_number":4441,"context_line":"             u\u0027updated_at\u0027: ret[\u0027bios\u0027][0][\u0027updated_at\u0027],"},{"line_number":4442,"context_line":"             u\u0027links\u0027: ["},{"line_number":4443,"context_line":"                {u\u0027href\u0027: u\u0027http://localhost/v1/nodes/\u0027 + self.node.uuid +"}],"source_content_type":"text/x-python","patch_set":50,"id":"5f7c97a3_3f15b49c","line":4440,"updated":"2018-05-28 08:55:37.000000000","message":"It doesn\u0027t look quite good to use actual data for expected data because this compares the same data. However, I think this is acceptable in this case because tests for other resources also don\u0027t care \u0027create_at\u0027 or \u0027updated_at\u0027 and it\u0027s enough to see if \u0027created_at\u0027 and \u0027updated_at\u0027 are in the data here.","commit_id":"dc4c4285caf21452067d948ed9ba01a2c61342db"}],"ironic/tests/unit/objects/utils.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"880632b3e073a5252bb9165d4d33b3890a8f4857","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    return volume_target"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"def get_test_bios_setting_list(ctxt, **kw):"},{"line_number":234,"context_line":"    \"\"\"Return a BiosSettingList object with appropriate attributes."},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    NOTE: The object leaves the attributes marked as changed, such"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_940a50cf","line":233,"range":{"start_line":233,"start_character":25,"end_line":233,"end_character":30},"updated":"2018-05-16 12:09:05.000000000","message":"This method doesn\u0027t create a BIOSSetingList but a BIOSSetting object. Probably, we need to change a method name.","commit_id":"409adecef3233910491e50c41fdaaef0e4a894f1"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"880632b3e073a5252bb9165d4d33b3890a8f4857","unresolved":false,"context_lines":[{"line_number":236,"context_line":"    NOTE: The object leaves the attributes marked as changed, such"},{"line_number":237,"context_line":"    that a create() could be used to commit it to the DB."},{"line_number":238,"context_line":"    \"\"\""},{"line_number":239,"context_line":"    db_bios_setting \u003d db_utils.create_test_bios_setting(**kw)"},{"line_number":240,"context_line":"    # Let DB generate ID if it isn\u0027t specified explicitly"},{"line_number":241,"context_line":"    if \u0027node_id\u0027 not in kw:"},{"line_number":242,"context_line":"        del db_bios_setting[\u0027node_id\u0027]"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_59471178","line":239,"range":{"start_line":239,"start_character":31,"end_line":239,"end_character":55},"updated":"2018-05-16 12:09:05.000000000","message":"For consistency with other resources, we shouldn\u0027t call db_utils.create_test_bios_setting() here, which creates a record into database. A method to create a DB record should be called in create_test_bios_setting bellow. We should call db_utils.get_test_bios_setting() here instead.","commit_id":"409adecef3233910491e50c41fdaaef0e4a894f1"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"880632b3e073a5252bb9165d4d33b3890a8f4857","unresolved":false,"context_lines":[{"line_number":237,"context_line":"    that a create() could be used to commit it to the DB."},{"line_number":238,"context_line":"    \"\"\""},{"line_number":239,"context_line":"    db_bios_setting \u003d db_utils.create_test_bios_setting(**kw)"},{"line_number":240,"context_line":"    # Let DB generate ID if it isn\u0027t specified explicitly"},{"line_number":241,"context_line":"    if \u0027node_id\u0027 not in kw:"},{"line_number":242,"context_line":"        del db_bios_setting[\u0027node_id\u0027]"},{"line_number":243,"context_line":"    bios_setting \u003d objects.BIOSSetting(ctxt)"},{"line_number":244,"context_line":"    for key in db_bios_setting:"},{"line_number":245,"context_line":"        setattr(bios_setting, key[0], key[1])"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_b92c25ac","line":242,"range":{"start_line":240,"start_character":0,"end_line":242,"end_character":38},"updated":"2018-05-16 12:09:05.000000000","message":"This is not necessary for a bios setting. Other resource generates their own IDs, which a bios setting doesn\u0027t have.","commit_id":"409adecef3233910491e50c41fdaaef0e4a894f1"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"880632b3e073a5252bb9165d4d33b3890a8f4857","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        del db_bios_setting[\u0027node_id\u0027]"},{"line_number":243,"context_line":"    bios_setting \u003d objects.BIOSSetting(ctxt)"},{"line_number":244,"context_line":"    for key in db_bios_setting:"},{"line_number":245,"context_line":"        setattr(bios_setting, key[0], key[1])"},{"line_number":246,"context_line":"    return bios_setting"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_147ba027","line":245,"updated":"2018-05-16 12:09:05.000000000","message":"This should be:\n  setattr(bios_setting, key, db_bios_setting[key])","commit_id":"409adecef3233910491e50c41fdaaef0e4a894f1"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"880632b3e073a5252bb9165d4d33b3890a8f4857","unresolved":false,"context_lines":[{"line_number":246,"context_line":"    return bios_setting"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"def create_test_bios_setting_list(ctxt, **kw):"},{"line_number":250,"context_line":"    \"\"\"Create and return a test bios setting list object."},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    Create a BIOS setting list in the DB and return a BIOSSettingList"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_b4750c34","line":249,"range":{"start_line":249,"start_character":28,"end_line":249,"end_character":33},"updated":"2018-05-16 12:09:05.000000000","message":"This method also doesn\u0027t create a list.","commit_id":"409adecef3233910491e50c41fdaaef0e4a894f1"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"880632b3e073a5252bb9165d4d33b3890a8f4857","unresolved":false,"context_lines":[{"line_number":253,"context_line":"    object with appropriate attributes."},{"line_number":254,"context_line":"    \"\"\""},{"line_number":255,"context_line":"    bios_setting_list \u003d get_test_bios_setting_list(ctxt, **kw)"},{"line_number":256,"context_line":"    return bios_setting_list"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"def get_payloads_with_schemas(from_module):"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_94d81053","line":256,"updated":"2018-05-16 12:09:05.000000000","message":"We need to rename bios_setting_list to bios_setting and call bios_setting.create() here, which creates a DB record.","commit_id":"409adecef3233910491e50c41fdaaef0e4a894f1"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"5ec6fcc21d296a0a37ebd62e270f764beaa62292","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    return volume_target"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"def get_test_bios_setting_list_object(ctxt, **kw):"},{"line_number":234,"context_line":"    \"\"\"Return a BiosSettingList object with appropriate attributes."},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    NOTE: The object leaves the attributes marked as changed, such"}],"source_content_type":"text/x-python","patch_set":41,"id":"5f7c97a3_322019b1","line":233,"updated":"2018-05-17 08:21:18.000000000","message":"I think Hironori\u0027s comment was that this should be:\n\nget_test_bios_setting()","commit_id":"1c56ab6eb3d84e0ce6ade437f9f33f0037f02ba8"}],"releasenotes/notes/add-node-bios-9c1c3d442e8acdac.yaml":[{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"e0683f90b964a5fcce4a6e255a1be4830a64d988","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds support for node BIOS. This feature is available starting"},{"line_number":4,"context_line":"    with API version 1.35."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"df87a7cf_ca5dce15","line":4,"range":{"start_line":4,"start_character":21,"end_line":4,"end_character":25},"updated":"2017-12-08 12:48:15.000000000","message":"1.36","commit_id":"0a02d637127f224bdc5dbdbf42016dd631e7ea86"},{"author":{"_account_id":21151,"name":"zenghui.shi","email":"zshi@redhat.com","username":"zshi"},"change_message_id":"2a2a3eeac6167e838902325c731f0b6a9db2a6af","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds support for node BIOS. This feature is available starting"},{"line_number":4,"context_line":"    with API version 1.35."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"df87a7cf_a1165148","line":4,"range":{"start_line":4,"start_character":21,"end_line":4,"end_character":25},"in_reply_to":"df87a7cf_ca5dce15","updated":"2017-12-11 03:15:23.000000000","message":"Done","commit_id":"0a02d637127f224bdc5dbdbf42016dd631e7ea86"},{"author":{"_account_id":18781,"name":"vinay50muddu","email":"vinay50muddu@yahoo.com","username":"vmud213"},"change_message_id":"6255a17b1597d8d9b3b6ecee153b23993e072b75","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds support for node BIOS. This feature is available starting"},{"line_number":4,"context_line":"    with API version 1.36."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"bf659307_25554bfa","line":4,"range":{"start_line":4,"start_character":21,"end_line":4,"end_character":25},"updated":"2018-04-04 08:41:06.000000000","message":"Isn\u0027t this 1.39?","commit_id":"9783f7d7a6aafb27edac07c7152289a9087c5f47"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7c5220cadab3e8973891e444d6c308a5d572873e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds support for node BIOS. This feature is available starting"},{"line_number":4,"context_line":"    with API version 1.40."}],"source_content_type":"text/x-yaml","patch_set":35,"id":"5f7c97a3_d9c945ac","line":3,"range":{"start_line":3,"start_character":26,"end_line":3,"end_character":30},"updated":"2018-05-10 19:46:42.000000000","message":"s/BIOS/bios_interface/.","commit_id":"a65ffec6f848df87e97563a61ce0980c716bd490"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"7734b6ae9876a29cf66110d6d110c460e887b4a3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds support for node bios_interface. This feature is available starting"},{"line_number":4,"context_line":"    with API version 1.40."}],"source_content_type":"text/x-yaml","patch_set":39,"id":"5f7c97a3_9142780e","line":4,"updated":"2018-05-15 13:35:27.000000000","message":"Also adds the GET endpoints for node BIOS settings.","commit_id":"76d693fee7af37dbace7fba16823e500bb20440e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f5e30ec9902659f6c60e81447180962ba748db36","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds support for node bios_interface and enables the GET endpoints to"},{"line_number":4,"context_line":"    check BIOS settings. This feature is available starting with API version"},{"line_number":5,"context_line":"    1.40."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"5f7c97a3_9f68e4ba","line":3,"updated":"2018-05-19 18:43:56.000000000","message":"nit: \"reading and changing the node\u0027s ``bios_interface`` field\"","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6bd9eae1256dbdc1d8d990c6bb2db22f18942bc2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds support for node bios_interface and enables the GET endpoints to"},{"line_number":4,"context_line":"    check BIOS settings. This feature is available starting with API version"},{"line_number":5,"context_line":"    1.40."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"5f7c97a3_6f09ba2f","line":3,"range":{"start_line":3,"start_character":26,"end_line":3,"end_character":40},"updated":"2018-05-17 18:19:05.000000000","message":"s/bios_interface/``bios_interface``","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6bd9eae1256dbdc1d8d990c6bb2db22f18942bc2","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds support for node bios_interface and enables the GET endpoints to"},{"line_number":4,"context_line":"    check BIOS settings. This feature is available starting with API version"},{"line_number":5,"context_line":"    1.40."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"5f7c97a3_42113553","line":5,"range":{"start_line":5,"start_character":8,"end_line":5,"end_character":9},"updated":"2018-05-17 18:19:05.000000000","message":"It might be good to note that this is only if they have been cached, which requires a compatible ``bios_interface`` to be set.","commit_id":"e36417d855f7b40e1be2ec97f60a4127df6547c4"}]}
