)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d0173efaead4a3c59bdd8c97a3df5e3bce1ef29d","unresolved":false,"context_lines":[{"line_number":10,"context_line":"XML files. it is recommended to use defusedxml library for xml"},{"line_number":11,"context_line":"parsing. when we parse from tructed and hard-coded sources we"},{"line_number":12,"context_line":"can still use lxml."},{"line_number":13,"context_line":"unfortunately, defusedxml lacks som e lxml functionality,"},{"line_number":14,"context_line":"so we still have to use lxml in some safe cases."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Closes-Bug: #1534284"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"bf659307_8c1a0915","line":13,"range":{"start_line":13,"start_character":25,"end_line":13,"end_character":57},"updated":"2018-04-06 16:15:38.000000000","message":"What functionality is missing? Is it related to usage not included in this patch? \n\nhttps://github.com/openstack/keystoneauth/blob/a37d9f6151ef0bec93c3f20c342154d81a42c88c/keystoneauth1/extras/_saml2/v3/adfs.py#L16-L19\n\nWe should include a little more detail so that it\u0027s easier for other people to pick this  up if needed.","commit_id":"52bc8592bff3997b7937de6d390b615b8a9ed643"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9c9cc22160c5f8a2f7b9ac23d4088534be855108","unresolved":false,"context_lines":[{"line_number":13,"context_line":"unfortunately, defusedxml lacks som e lxml functionality,"},{"line_number":14,"context_line":"so we still have to use lxml in some safe cases."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Closes-Bug: #1534284"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I2eef707e1f48f48c4d60725e1151507578f37985"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"df7087c5_bb1f45b5","line":16,"updated":"2018-03-16 09:13:31.000000000","message":"I\u0027m not really sure that Closes-Bug is appropriate since there is still some usage of lxml\u0027s etree that will be flagged by bandit. Partial-Bug would be better. A solution that removes it completely or explicitly flags the save uses with something like #nosec would be best.","commit_id":"52bc8592bff3997b7937de6d390b615b8a9ed643"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"948fd9ff86495bf5a05c5d55346b11f4a2114d33","unresolved":false,"context_lines":[{"line_number":12,"context_line":"can still use lxml."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"On order to catch XML parsing exceptions we still continue to import"},{"line_number":15,"context_line":"lxml, just to get a handle for those exception classes."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I2eef707e1f48f48c4d60725e1151507578f37985"},{"line_number":18,"context_line":"Partial-Bug: #1534284"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"5f7c97a3_3d614ad4","line":15,"updated":"2018-05-10 15:49:35.000000000","message":"++ that makes more sense now","commit_id":"95d56534c1c5607d655b6709fefbe3f8cbff9417"}],"keystoneauth1/extras/_saml2/v3/adfs.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"eff61ecf6ec77d06e62637275cf63ca222ec90db","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    from lxml import etree"},{"line_number":18,"context_line":"except ImportError:"},{"line_number":19,"context_line":"    etree \u003d None"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from six.moves import urllib"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from keystoneauth1 import access"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_db72017d","side":"PARENT","line":20,"updated":"2018-02-16 09:10:54.000000000","message":"Since this will need another revision anyway, could you please undo this whitespace change","commit_id":"aa2c402e30980cd55eba24d2391dd99bf03c1021"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"464c85b4a7ed56aae782b1bfdad93640d99a8fd5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    from lxml import etree"},{"line_number":18,"context_line":"except ImportError:"},{"line_number":19,"context_line":"    etree \u003d None"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from six.moves import urllib"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from keystoneauth1 import access"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff6b8bd7_fd3a8332","side":"PARENT","line":20,"in_reply_to":"3fa0c359_db72017d","updated":"2018-03-05 07:16:31.000000000","message":"Done","commit_id":"aa2c402e30980cd55eba24d2391dd99bf03c1021"}],"keystoneauth1/extras/_saml2/v3/base.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9c9cc22160c5f8a2f7b9ac23d4088534be855108","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    from defusedxml import lxml as secure_etree"},{"line_number":14,"context_line":"except ImportError:"},{"line_number":15,"context_line":"    secure_etree \u003d None"},{"line_number":16,"context_line":"try:"},{"line_number":17,"context_line":"    from lxml import etree"},{"line_number":18,"context_line":"except ImportError:"},{"line_number":19,"context_line":"    etree \u003d None"},{"line_number":20,"context_line":"from keystoneauth1 import exceptions"},{"line_number":21,"context_line":"from keystoneauth1.identity import v3"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"df7087c5_1ba0b18f","line":19,"range":{"start_line":16,"start_character":0,"end_line":19,"end_character":16},"updated":"2018-03-16 09:13:31.000000000","message":"You could probably remove this entirely now.","commit_id":"52bc8592bff3997b7937de6d390b615b8a9ed643"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"85622565fbe255cd2ff596d66ed3e230a2e2430e","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    from defusedxml import lxml as secure_etree"},{"line_number":14,"context_line":"except ImportError:"},{"line_number":15,"context_line":"    secure_etree \u003d None"},{"line_number":16,"context_line":"try:"},{"line_number":17,"context_line":"    from lxml import etree"},{"line_number":18,"context_line":"except ImportError:"},{"line_number":19,"context_line":"    etree \u003d None"},{"line_number":20,"context_line":"from keystoneauth1 import exceptions"},{"line_number":21,"context_line":"from keystoneauth1.identity import v3"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_5ddcb945","line":19,"range":{"start_line":16,"start_character":0,"end_line":19,"end_character":16},"in_reply_to":"bf659307_ccdb217b","updated":"2018-04-16 14:03:26.000000000","message":"we still need this, as defusedxml does not proxy the original etree exception for us, and they can be thrown by original parser.\n\nhttps://github.com/tiran/defusedxml/blob/master/defusedxml/lxml.py","commit_id":"52bc8592bff3997b7937de6d390b615b8a9ed643"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d0173efaead4a3c59bdd8c97a3df5e3bce1ef29d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    from defusedxml import lxml as secure_etree"},{"line_number":14,"context_line":"except ImportError:"},{"line_number":15,"context_line":"    secure_etree \u003d None"},{"line_number":16,"context_line":"try:"},{"line_number":17,"context_line":"    from lxml import etree"},{"line_number":18,"context_line":"except ImportError:"},{"line_number":19,"context_line":"    etree \u003d None"},{"line_number":20,"context_line":"from keystoneauth1 import exceptions"},{"line_number":21,"context_line":"from keystoneauth1.identity import v3"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_ccdb217b","line":19,"range":{"start_line":16,"start_character":0,"end_line":19,"end_character":16},"in_reply_to":"df7087c5_1ba0b18f","updated":"2018-04-06 16:15:38.000000000","message":"++","commit_id":"52bc8592bff3997b7937de6d390b615b8a9ed643"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d0173efaead4a3c59bdd8c97a3df5e3bce1ef29d","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def str_to_xml(content, msg\u003dNone, include_exc\u003dTrue):"},{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            return secure_etree.XML(content)"},{"line_number":91,"context_line":"        except etree.XMLSyntaxError as e:"},{"line_number":92,"context_line":"            if not msg:"},{"line_number":93,"context_line":"                msg \u003d str(e)"},{"line_number":94,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_6ca535b5","line":91,"range":{"start_line":91,"start_character":15,"end_line":91,"end_character":35},"updated":"2018-04-06 16:15:38.000000000","message":"I\u0027m not familiar with the exceptions thrown by defusexml, but I would assume changing this is also going to mandate that we change the exception. Otherwise the except portion of this statement will never execute and we won\u0027t be providing useful logging with a 401.","commit_id":"52bc8592bff3997b7937de6d390b615b8a9ed643"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"85622565fbe255cd2ff596d66ed3e230a2e2430e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def str_to_xml(content, msg\u003dNone, include_exc\u003dTrue):"},{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            return secure_etree.XML(content)"},{"line_number":91,"context_line":"        except etree.XMLSyntaxError as e:"},{"line_number":92,"context_line":"            if not msg:"},{"line_number":93,"context_line":"                msg \u003d str(e)"},{"line_number":94,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_3de30508","line":91,"range":{"start_line":91,"start_character":15,"end_line":91,"end_character":35},"in_reply_to":"bf659307_6ca535b5","updated":"2018-04-16 14:03:26.000000000","message":"indeed, we need to add defusedxml-specific exceptions here.","commit_id":"52bc8592bff3997b7937de6d390b615b8a9ed643"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"948fd9ff86495bf5a05c5d55346b11f4a2114d33","unresolved":false,"context_lines":[{"line_number":16,"context_line":"try:"},{"line_number":17,"context_line":"    from lxml import etree"},{"line_number":18,"context_line":"except ImportError:"},{"line_number":19,"context_line":"    etree \u003d None"},{"line_number":20,"context_line":"from keystoneauth1 import exceptions"},{"line_number":21,"context_line":"from keystoneauth1.identity import v3"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_c2fdd36e","line":19,"updated":"2018-05-10 15:49:35.000000000","message":"Technically lxml is a third-party package, so we should keep it separate from the keystoneauth specific package imports below by keeping the newline.","commit_id":"95d56534c1c5607d655b6709fefbe3f8cbff9417"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"948fd9ff86495bf5a05c5d55346b11f4a2114d33","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def str_to_xml(content, msg\u003dNone, include_exc\u003dTrue):"},{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            return secure_etree.XML(content)"},{"line_number":91,"context_line":"        except (etree.XMLSyntaxError,"},{"line_number":92,"context_line":"                secure_etree.DTDForbidden,"},{"line_number":93,"context_line":"                secure_etree.EntitiesForbidden,"},{"line_number":94,"context_line":"                secure_etree.NotSupportedError) as e:"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_a23d372c","line":91,"range":{"start_line":91,"start_character":16,"end_line":91,"end_character":36},"updated":"2018-05-10 15:49:35.000000000","message":"I\u0027m not sure what the relationship is between lxml and defusedxml, but defusedxml raises lxml exceptions?","commit_id":"95d56534c1c5607d655b6709fefbe3f8cbff9417"}],"keystoneauth1/extras/_saml2/v3/saml2.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9c9cc22160c5f8a2f7b9ac23d4088534be855108","unresolved":false,"context_lines":[{"line_number":16,"context_line":"    from defusedxml import lxml as secure_etree"},{"line_number":17,"context_line":"except ImportError:"},{"line_number":18,"context_line":"    secure_etree \u003d None"},{"line_number":19,"context_line":"try:"},{"line_number":20,"context_line":"    from lxml import etree"},{"line_number":21,"context_line":"except ImportError:"},{"line_number":22,"context_line":"    etree \u003d None"},{"line_number":23,"context_line":"import requests"},{"line_number":24,"context_line":"import requests.auth"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"df7087c5_bb750534","line":22,"range":{"start_line":19,"start_character":0,"end_line":22,"end_character":16},"updated":"2018-03-16 09:13:31.000000000","message":"You could probably remove this entirely now","commit_id":"52bc8592bff3997b7937de6d390b615b8a9ed643"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d0173efaead4a3c59bdd8c97a3df5e3bce1ef29d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"def _response_xml(response, name):"},{"line_number":75,"context_line":"    try:"},{"line_number":76,"context_line":"        return secure_etree.XML(response.content)"},{"line_number":77,"context_line":"    except etree.XMLSyntaxError as e:"},{"line_number":78,"context_line":"        msg \u003d \u0027SAML2: Error parsing XML returned from %s: %s\u0027 % (name, e)"},{"line_number":79,"context_line":"        raise InvalidResponse(msg)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_eccce562","line":77,"range":{"start_line":77,"start_character":11,"end_line":77,"end_character":16},"updated":"2018-04-06 16:15:38.000000000","message":"Same comment here as in the previous module. It looks like there is some usage of lxml in defusedxml [0], but we should really add a test, or at least test this manually to ensure we\u0027re executing the except in the event XML syntax is wrong.\n\n[0] https://github.com/tiran/defusedxml/blob/f2c7c35b25f80c08923be49ac1f81e9cf95bd2ae/defusedxml/lxml.py#L13","commit_id":"52bc8592bff3997b7937de6d390b615b8a9ed643"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"948fd9ff86495bf5a05c5d55346b11f4a2114d33","unresolved":false,"context_lines":[{"line_number":19,"context_line":"try:"},{"line_number":20,"context_line":"    from lxml import etree"},{"line_number":21,"context_line":"except ImportError:"},{"line_number":22,"context_line":"    etree \u003d None"},{"line_number":23,"context_line":"import requests"},{"line_number":24,"context_line":"import requests.auth"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_62439fb0","line":22,"updated":"2018-05-10 15:49:35.000000000","message":"Same comment here as in the previous module.","commit_id":"95d56534c1c5607d655b6709fefbe3f8cbff9417"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"948fd9ff86495bf5a05c5d55346b11f4a2114d33","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    except (etree.XMLSyntaxError,"},{"line_number":78,"context_line":"            secure_etree.DTDForbidden,"},{"line_number":79,"context_line":"            secure_etree.EntitiesForbidden,"},{"line_number":80,"context_line":"            secure_etree.NotSupportedError) as e:"},{"line_number":81,"context_line":"        msg \u003d \u0027SAML2: Error parsing XML returned from %s: %s\u0027 % (name, e)"},{"line_number":82,"context_line":"        raise InvalidResponse(msg)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_22692720","line":80,"updated":"2018-05-10 15:49:35.000000000","message":"It would be nice to reduce some of this duplication by pulling this functionality into a specific place so it can be re-used. We\u0027d also be limiting the monkey-patching at the top of the module to one place.\n\nI just worry about the exception getting out of sync or something like that.\n\nMaybe just some sort of generic utility method, like:\n\n  try:\n      from defusedxml import lxml as secure_etree\n  except ImportError:\n      secure_etree \u003d None\n  try:\n      from lxml import etree\n  except ImportError:\n      etree \u003d None\n\n\n  def get_contents_from_xml(xml, message\u003dNone, include_exc\u003dNone):\n      try:\n          return secure_etree.XML(xml)\n      except (etree.XMLSyntaxError,\n              secure_etree.DTDForbidden,\n              secure_etree.EntitiesForbidden,\n              secure_etree.NotSupportedError) as e:\n          # work in the message and include_exc here to\n          # handle both callers\n          msg \u003d \u0027SAML2: Error parsing XML returned from %s: %s\u0027 % (name, e)\n          raise InvalidResponse(msg)","commit_id":"95d56534c1c5607d655b6709fefbe3f8cbff9417"}],"keystoneauth1/tests/unit/extras/saml2/utils.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"eff61ecf6ec77d06e62637275cf63ca222ec90db","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystoneauth1 import session"},{"line_number":16,"context_line":"from keystoneauth1.tests.unit import utils"},{"line_number":17,"context_line":"from lxml import etree"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"ROOTDIR \u003d os.path.dirname(os.path.abspath(__file__))"},{"line_number":20,"context_line":"XMLDIR \u003d os.path.join(ROOTDIR, \u0027examples\u0027, \u0027xml/\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_bb5055d6","line":17,"updated":"2018-02-16 09:10:54.000000000","message":"Sorry to do this, but I added https://review.openstack.org/#/c/545094/ to catch and prevent PEP8 violations like this. Please avoid making noop changes like this, even if it wasn\u0027t a PEP8 violation it affects the git history unnecessarily.\n\nThat said, why not just convert this one as well? Then we could remove this http://git.openstack.org/cgit/openstack/keystoneauth/tree/tox.ini#n27","commit_id":"8422e9cbb9ca8f1ea704cbe77480936e4e74a157"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"464c85b4a7ed56aae782b1bfdad93640d99a8fd5","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystoneauth1 import session"},{"line_number":16,"context_line":"from keystoneauth1.tests.unit import utils"},{"line_number":17,"context_line":"from lxml import etree"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"ROOTDIR \u003d os.path.dirname(os.path.abspath(__file__))"},{"line_number":20,"context_line":"XMLDIR \u003d os.path.join(ROOTDIR, \u0027examples\u0027, \u0027xml/\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff6b8bd7_1d0df78f","line":17,"in_reply_to":"3fa0c359_1b0e29e5","updated":"2018-03-05 07:16:31.000000000","message":"Done","commit_id":"8422e9cbb9ca8f1ea704cbe77480936e4e74a157"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"91d407e192229eb98efcd0fdd572dffcd2f2f3f2","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystoneauth1 import session"},{"line_number":16,"context_line":"from keystoneauth1.tests.unit import utils"},{"line_number":17,"context_line":"from lxml import etree"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"ROOTDIR \u003d os.path.dirname(os.path.abspath(__file__))"},{"line_number":20,"context_line":"XMLDIR \u003d os.path.join(ROOTDIR, \u0027examples\u0027, \u0027xml/\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_1b0e29e5","line":17,"in_reply_to":"3fa0c359_bb5055d6","updated":"2018-02-16 09:12:43.000000000","message":"Sorry, meant to use a persistent reference http://git.openstack.org/cgit/openstack/keystoneauth/tree/tox.ini?h\u003d3.4.0#n27","commit_id":"8422e9cbb9ca8f1ea704cbe77480936e4e74a157"}],"requirements.txt":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"797f898d21c1e5d127741797de91f9c7f468d3b2","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# where oslo and associated transient dependencies are not desired."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"pbr!\u003d2.1.0,\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":15,"context_line":"defusedxml \u003e\u003d 0.5.0 #PSF"},{"line_number":16,"context_line":"iso8601\u003e\u003d0.1.11 # MIT"},{"line_number":17,"context_line":"positional\u003e\u003d1.1.1 # Apache-2.0"},{"line_number":18,"context_line":"requests\u003e\u003d2.14.2 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":1,"id":"7f96bb07_dd508b61","line":15,"updated":"2018-01-23 14:13:57.000000000","message":"This is the wrong file for the lxml/defusedxml dependency for keystoneauth. You\u0027ll want to do this in setup.cfg:\n\n http://git.openstack.org/cgit/openstack/keystoneauth/tree/setup.cfg#n29","commit_id":"44e09f3aa5009502c7883e8e85752d3f5619d169"}]}
