)]}'
{"keystone/contrib/rest_config/controllers.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a1c8cfa39b80f7a7bed91df086e18496f14dbdb7","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class RestConfigV3Controller(controller.V3Controller):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def _read_config_options(self, group):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"        def _sanitize(opt, value):"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_f02d5990","line":22,"updated":"2014-07-13 09:57:19.000000000","message":"I think you havemissing at least member_name attribute","commit_id":"979ef725072bd2253a38ae0fa931a828bbb4021d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6fb0c83948e41166671000b4f8992498e06bc72f","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def get_config(self, context):"},{"line_number":54,"context_line":"        ref \u003d self._read_config_options("},{"line_number":55,"context_line":"            context[\u0027query_string\u0027].get(\u0027group\u0027, None))"},{"line_number":56,"context_line":"        return {\u0027config\u0027: ref}"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_2b0a0e8a","line":56,"updated":"2014-07-12 16:31:35.000000000","message":"Are you intentionally not wrapping this response with links etc? \n\nMaybe you should add here:\n\nreturn RestConfigV3Controller.wrap_member(context, ref) ?","commit_id":"979ef725072bd2253a38ae0fa931a828bbb4021d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8e7e4591208dbf2a5373937c49da4602de38d098","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def get_config(self, context):"},{"line_number":54,"context_line":"        ref \u003d self._read_config_options("},{"line_number":55,"context_line":"            context[\u0027query_string\u0027].get(\u0027group\u0027, None))"},{"line_number":56,"context_line":"        return {\u0027config\u0027: ref}"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_843a27cb","line":56,"in_reply_to":"baada198_2b0a0e8a","updated":"2014-07-12 21:36:59.000000000","message":"So we can\u0027t call wrap_member() since it makes the assumption that the entity has an \u0027id\u0027 attribute.  However, that\u0027s no exec use for not having a links section - I\u0027ll add that manually.","commit_id":"979ef725072bd2253a38ae0fa931a828bbb4021d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f221bfc032a8f94985fb25dcfed1086c39bf2b68","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def get_config(self, context):"},{"line_number":54,"context_line":"        ref \u003d self._read_config_options("},{"line_number":55,"context_line":"            context[\u0027query_string\u0027].get(\u0027group\u0027, None))"},{"line_number":56,"context_line":"        return {\u0027config\u0027: ref}"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_1acd7231","line":56,"in_reply_to":"baada198_6bd15756","updated":"2014-07-14 13:44:06.000000000","message":"yeah, I like that.  Nice.","commit_id":"979ef725072bd2253a38ae0fa931a828bbb4021d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a29987020e9426163d55b7c6c024a84016f1968e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def get_config(self, context):"},{"line_number":54,"context_line":"        ref \u003d self._read_config_options("},{"line_number":55,"context_line":"            context[\u0027query_string\u0027].get(\u0027group\u0027, None))"},{"line_number":56,"context_line":"        return {\u0027config\u0027: ref}"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_6bd15756","line":56,"in_reply_to":"baada198_843a27cb","updated":"2014-07-14 02:47:31.000000000","message":"You are right with \u0027id\u0027, but I think to keep the interface we can simply try override either wrap_member() or even deeper: _add_self_referential_link() class methods so they do what they are supposed to do.","commit_id":"979ef725072bd2253a38ae0fa931a828bbb4021d"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"48f166021712055f748df3d6872a4eab2003f1bc","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            return value if not opt.secret else \u0027*\u0027 * 10"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        def _read_group(config_dict, name):"},{"line_number":39,"context_line":"            group_attr \u003d CONF.GroupAttr(CONF, CONF._get_group(name))"},{"line_number":40,"context_line":"            d[name] \u003d {}"},{"line_number":41,"context_line":"            for opt_name in sorted(CONF._groups[name]._opts):"},{"line_number":42,"context_line":"                opt \u003d CONF._get_opt_info(opt_name, name)[\u0027opt\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_8752e910","line":39,"updated":"2014-07-15 08:41:45.000000000","message":"_get_group() is private","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"a1a78e60abbca2af50e00b57b0e51cc07ffa35d6","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            return value if not opt.secret else \u0027*\u0027 * 10"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        def _read_group(config_dict, name):"},{"line_number":39,"context_line":"            group_attr \u003d CONF.GroupAttr(CONF, CONF._get_group(name))"},{"line_number":40,"context_line":"            d[name] \u003d {}"},{"line_number":41,"context_line":"            for opt_name in sorted(CONF._groups[name]._opts):"},{"line_number":42,"context_line":"                opt \u003d CONF._get_opt_info(opt_name, name)[\u0027opt\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_670795ca","line":39,"in_reply_to":"baada198_8752e910","updated":"2014-07-15 08:56:45.000000000","message":"Instead:\n\n  attr \u003d CONF[name]\n\nperhaps with\n\n  if not isinstance(attr, CONF.GroupAttr):\n      ...","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"48f166021712055f748df3d6872a4eab2003f1bc","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        def _read_group(config_dict, name):"},{"line_number":39,"context_line":"            group_attr \u003d CONF.GroupAttr(CONF, CONF._get_group(name))"},{"line_number":40,"context_line":"            d[name] \u003d {}"},{"line_number":41,"context_line":"            for opt_name in sorted(CONF._groups[name]._opts):"},{"line_number":42,"context_line":"                opt \u003d CONF._get_opt_info(opt_name, name)[\u0027opt\u0027]"},{"line_number":43,"context_line":"                d[name][opt_name] \u003d _sanitize(opt, getattr(group_attr,"},{"line_number":44,"context_line":"                                                           opt_name))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_e742c53c","line":41,"updated":"2014-07-15 08:41:45.000000000","message":"_groups is private","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"a1a78e60abbca2af50e00b57b0e51cc07ffa35d6","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        def _read_group(config_dict, name):"},{"line_number":39,"context_line":"            group_attr \u003d CONF.GroupAttr(CONF, CONF._get_group(name))"},{"line_number":40,"context_line":"            d[name] \u003d {}"},{"line_number":41,"context_line":"            for opt_name in sorted(CONF._groups[name]._opts):"},{"line_number":42,"context_line":"                opt \u003d CONF._get_opt_info(opt_name, name)[\u0027opt\u0027]"},{"line_number":43,"context_line":"                d[name][opt_name] \u003d _sanitize(opt, getattr(group_attr,"},{"line_number":44,"context_line":"                                                           opt_name))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_e721e54d","line":41,"in_reply_to":"baada198_e742c53c","updated":"2014-07-15 08:56:45.000000000","message":"Instead\n\n  for opt_name in sorted(CONF[attr]):\n      ...","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"48f166021712055f748df3d6872a4eab2003f1bc","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            group_attr \u003d CONF.GroupAttr(CONF, CONF._get_group(name))"},{"line_number":40,"context_line":"            d[name] \u003d {}"},{"line_number":41,"context_line":"            for opt_name in sorted(CONF._groups[name]._opts):"},{"line_number":42,"context_line":"                opt \u003d CONF._get_opt_info(opt_name, name)[\u0027opt\u0027]"},{"line_number":43,"context_line":"                d[name][opt_name] \u003d _sanitize(opt, getattr(group_attr,"},{"line_number":44,"context_line":"                                                           opt_name))"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_27491d60","line":42,"updated":"2014-07-15 08:41:45.000000000","message":"_get_opt_info() is private","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"a1a78e60abbca2af50e00b57b0e51cc07ffa35d6","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            group_attr \u003d CONF.GroupAttr(CONF, CONF._get_group(name))"},{"line_number":40,"context_line":"            d[name] \u003d {}"},{"line_number":41,"context_line":"            for opt_name in sorted(CONF._groups[name]._opts):"},{"line_number":42,"context_line":"                opt \u003d CONF._get_opt_info(opt_name, name)[\u0027opt\u0027]"},{"line_number":43,"context_line":"                d[name][opt_name] \u003d _sanitize(opt, getattr(group_attr,"},{"line_number":44,"context_line":"                                                           opt_name))"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_a7cfed27","line":42,"in_reply_to":"baada198_27491d60","updated":"2014-07-15 08:56:45.000000000","message":"There\u0027s no equivalent to this in the oslo.config API, so you need something new\n\nI could imagine adding a new API for it\n\n  def get_opt(self, opt_name, group\u003dNone):\n      return self._get_opt_info(opt_name, group)[\u0027opt\u0027]\n\nbut I\u0027d be a little wary about how it might be abused\n\nor something like:\n\n  def secret_get(self, key):\n      value \u003d self.__getattr__(key)\n      opt \u003d self._get_opt_info(key)[\u0027opt\u0027]\n      return value if not opt.secret else \u0027*\u0027 * len(str(value))\n\nthat would be on cfg.ConfigOpts and you\u0027d add something similar to GroupAttr to","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"48f166021712055f748df3d6872a4eab2003f1bc","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        # FIXME (henry-nash): Support the option parameter"},{"line_number":47,"context_line":"        d \u003d {}"},{"line_number":48,"context_line":"        if group is not None:"},{"line_number":49,"context_line":"            if group in CONF._groups:"},{"line_number":50,"context_line":"                _read_group(d, group)"},{"line_number":51,"context_line":"            return d"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_0765f9df","line":49,"updated":"2014-07-15 08:41:45.000000000","message":"_groups is private","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"a1a78e60abbca2af50e00b57b0e51cc07ffa35d6","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        # FIXME (henry-nash): Support the option parameter"},{"line_number":47,"context_line":"        d \u003d {}"},{"line_number":48,"context_line":"        if group is not None:"},{"line_number":49,"context_line":"            if group in CONF._groups:"},{"line_number":50,"context_line":"                _read_group(d, group)"},{"line_number":51,"context_line":"            return d"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_a7f1ad02","line":49,"in_reply_to":"baada198_0765f9df","updated":"2014-07-15 08:56:45.000000000","message":"instead:\n\n  if group in CONF:","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"48f166021712055f748df3d6872a4eab2003f1bc","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                _read_group(d, group)"},{"line_number":51,"context_line":"            return d"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        for opt_name in sorted(CONF._opts):"},{"line_number":54,"context_line":"            opt \u003d CONF._get_opt_info(opt_name)[\u0027opt\u0027]"},{"line_number":55,"context_line":"            d[opt_name] \u003d _sanitize(opt, getattr(CONF, opt_name))"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_679dd5bb","line":53,"updated":"2014-07-15 08:41:45.000000000","message":"_opts is private","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"a1a78e60abbca2af50e00b57b0e51cc07ffa35d6","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                _read_group(d, group)"},{"line_number":51,"context_line":"            return d"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        for opt_name in sorted(CONF._opts):"},{"line_number":54,"context_line":"            opt \u003d CONF._get_opt_info(opt_name)[\u0027opt\u0027]"},{"line_number":55,"context_line":"            d[opt_name] \u003d _sanitize(opt, getattr(CONF, opt_name))"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_27e3dda4","line":53,"in_reply_to":"baada198_679dd5bb","updated":"2014-07-15 08:56:45.000000000","message":"instead\n\n  for opt_name in CONF:","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"48f166021712055f748df3d6872a4eab2003f1bc","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            return d"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        for opt_name in sorted(CONF._opts):"},{"line_number":54,"context_line":"            opt \u003d CONF._get_opt_info(opt_name)[\u0027opt\u0027]"},{"line_number":55,"context_line":"            d[opt_name] \u003d _sanitize(opt, getattr(CONF, opt_name))"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        for group_name in CONF._groups:"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_475b7121","line":54,"updated":"2014-07-15 08:41:45.000000000","message":"_get_opt_info() is private","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"a1a78e60abbca2af50e00b57b0e51cc07ffa35d6","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            return d"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        for opt_name in sorted(CONF._opts):"},{"line_number":54,"context_line":"            opt \u003d CONF._get_opt_info(opt_name)[\u0027opt\u0027]"},{"line_number":55,"context_line":"            d[opt_name] \u003d _sanitize(opt, getattr(CONF, opt_name))"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        for group_name in CONF._groups:"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_67f07567","line":54,"in_reply_to":"baada198_475b7121","updated":"2014-07-15 08:56:45.000000000","message":"Same issue here - need get_opt() or secret_get()","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"}],"keystone/contrib/rest_config/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"57717ef5675be74a0d8f79fe10b23c468cf1134b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"baada198_b2e574dd","updated":"2014-07-15 01:40:23.000000000","message":"Not sure if it\u0027s worth it, might should be have a Manager class?\nLike at: https://github.com/openstack/keystone/blob/master/keystone/contrib/oauth1/core.py#L140\n\nI\u0027m not sure if there is any benefit since it\u0027s just a handful of GET calls.\n\nAlso, we might want to have an Abstract Drive class:\nhttps://github.com/openstack/keystone/blob/master/keystone/contrib/oauth1/core.py#L183","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"761b77ad214eebccd96dd47cd221fe426a280a62","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"baada198_49a38ab1","in_reply_to":"baada198_b2e574dd","updated":"2014-07-15 07:45:38.000000000","message":"Yes...so the first version I wrote did indeed have this (I call that the Newfoundland Edition - since I wrote all this on the plane coming back from the Hackathon and that\u0027s what we were over at the time!).  It ended up just have the single get call in it....and I see that there are other extensions that do their work in the controller as well (e.g. simplecert).  However, if reviewers feel it is better to keep to a \"standard\" model, I\u0027d be happy to re-instate this.","commit_id":"619bcb08e0bc97d0d489b8029bf14e798d6ea9d5"}],"keystone/tests/test_v3_rest_config.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e1bb53f0a52c3d4f724323b5858d736fff55b7ab","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.assertIn(\u0027identity\u0027, resp.result[\u0027config\u0027])"},{"line_number":26,"context_line":"        self.assertIn(\u0027default_domain_id\u0027, resp.result[\u0027config\u0027][\u0027identity\u0027])"},{"line_number":27,"context_line":"        self.assertIn(\u0027ldap\u0027, resp.result[\u0027config\u0027])"},{"line_number":28,"context_line":"        self.assertIn(\u0027admin_port\u0027, resp.result[\u0027config\u0027])"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_get_config_by_group(self):"},{"line_number":31,"context_line":"        resp \u003d self.get(\u0027/OS-REST-CONFIG/config?group\u003didentity\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_e22ba57f","line":28,"updated":"2014-07-14 20:59:00.000000000","message":"verify all using config?\n\n  from oslo.config import cfg\n  CONF \u003d cfg.CONF\n\n  for group_name in CONF._groups:\n    self.assertIn(group_name, resp.result)\n    for opt_name in sorted(CONF._groups[name]._opts):\n      self.assertIn(opt_name, resp.result[group_name])","commit_id":"979ef725072bd2253a38ae0fa931a828bbb4021d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6fb0c83948e41166671000b4f8992498e06bc72f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.assertIn(\u0027config\u0027, resp.result)"},{"line_number":33,"context_line":"        self.assertIn(\u0027identity\u0027, resp.result[\u0027config\u0027])"},{"line_number":34,"context_line":"        self.assertNotIn(\u0027ldap\u0027, resp.result[\u0027config\u0027])"},{"line_number":35,"context_line":"        self.assertNotIn(\u0027admin_port\u0027, resp.result[\u0027config\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_8bf87a7d","line":35,"updated":"2014-07-12 16:31:35.000000000","message":"also some tests for response validity would be awesome (checks for \u0027links\u0027 etc)","commit_id":"979ef725072bd2253a38ae0fa931a828bbb4021d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8e7e4591208dbf2a5373937c49da4602de38d098","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.assertIn(\u0027config\u0027, resp.result)"},{"line_number":33,"context_line":"        self.assertIn(\u0027identity\u0027, resp.result[\u0027config\u0027])"},{"line_number":34,"context_line":"        self.assertNotIn(\u0027ldap\u0027, resp.result[\u0027config\u0027])"},{"line_number":35,"context_line":"        self.assertNotIn(\u0027admin_port\u0027, resp.result[\u0027config\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_a4372be2","line":35,"in_reply_to":"baada198_8bf87a7d","updated":"2014-07-12 21:36:59.000000000","message":"Yep, will do.","commit_id":"979ef725072bd2253a38ae0fa931a828bbb4021d"}]}
