)]}'
{"monasca_setup/detection/plugins/mon.py":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"9f4719d5387e900c89b895f6a37e0f7c1a83368d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"_DEFAULT_API_PORT \u003d 8070"},{"line_number":37,"context_line":"\"\"\"Default TCP port which monasca-api process should be available by\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"_FLAVOR \u003d platform.linux_distribution()[0].strip() "},{"line_number":40,"context_line":"if _FLAVOR.lower() \u003d\u003d \u0027suse linux enterprise server\u0027:"},{"line_number":41,"context_line":"    _NOTIFICATION_USER \u003d \u0027monasca-notification\u0027"},{"line_number":42,"context_line":"    _AGENT_USER \u003d \u0027monasca-agent\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f231b9d_e81494a2","line":39,"updated":"2017-06-13 05:38:15.000000000","message":"Why can\u0027t we try and use \n\n   psutil.Process.username()\n\nor to follow lean spirit \n\n   psutil.Process.as_dict([\u0027username\u0027])[\u0027username\u0027]\n\n???","commit_id":"fd9c82432fef9a04135c3be537918eef6825570d"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"11bfe96de5ce73122f2cc90cd52a29dd2308b47d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"_DEFAULT_API_PORT \u003d 8070"},{"line_number":37,"context_line":"\"\"\"Default TCP port which monasca-api process should be available by\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"_FLAVOR \u003d platform.linux_distribution()[0].strip() "},{"line_number":40,"context_line":"if _FLAVOR.lower() \u003d\u003d \u0027suse linux enterprise server\u0027:"},{"line_number":41,"context_line":"    _NOTIFICATION_USER \u003d \u0027monasca-notification\u0027"},{"line_number":42,"context_line":"    _AGENT_USER \u003d \u0027monasca-agent\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f231b9d_50365fe8","line":39,"in_reply_to":"7f231b9d_0d321011","updated":"2017-06-14 10:43:23.000000000","message":"To give you more insight in what exaxctly I do have in mind about unified approach. I\u0027d consider following possibilities of retrieving correct user.\n\nObviously I\u0027d create some util method `get_agent_process_owner` and in there I\u0027d incorporate following steps.\n\n1) first and most correct, I guess, try to persist the information for underlying plugins, what was passed as --user (the process owner) and use it from the the method\n2) if somehow we launched without that flag, most likely agent\u0027s been already configured and we can try to retrieve an owner of monasca-agent process [i.e.  find_process-name(\u0027monasca-agent\u0027).username()]\n3) if somehow that fails, we can fallback to checking agent\u0027s configuration file and it\u0027s owner\n4) as last resort we can try getting an owner from currently launched monasca-setup process\n\nmaybe for the 1st step we can see if we could save user information in some placeholder (a file) inside agent\u0027s configuration directory that we could try and access between subsequent runs. That should pretty much nominate 1) and allow to skip 2) 3) 4). But that\u0027s pretty much rough idea. \n\nCan it be somewhere else ?","commit_id":"fd9c82432fef9a04135c3be537918eef6825570d"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"c8371d8ae3ddd4316603abc7b44fa9c558e4ca3e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"_DEFAULT_API_PORT \u003d 8070"},{"line_number":37,"context_line":"\"\"\"Default TCP port which monasca-api process should be available by\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"_FLAVOR \u003d platform.linux_distribution()[0].strip() "},{"line_number":40,"context_line":"if _FLAVOR.lower() \u003d\u003d \u0027suse linux enterprise server\u0027:"},{"line_number":41,"context_line":"    _NOTIFICATION_USER \u003d \u0027monasca-notification\u0027"},{"line_number":42,"context_line":"    _AGENT_USER \u003d \u0027monasca-agent\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f231b9d_0d321011","line":39,"in_reply_to":"7f231b9d_5afe8037","updated":"2017-06-14 10:37:28.000000000","message":"If you\u0027re up to the challenge, I\u0027d propose unifying the code to get the user who runs an agent more common. \n\nI really don\u0027t like that part of the code because it feels like tied up to given deployment (or rather system, because different deployment with flavor \u003d\u003e \u0027suse linux enterprise server\u0027 can have different users (why not ?). In general it is not portable. \n\nI\u0027ll try to put up some more people to review this chunk. It is, not to offend or sth, really controversial from my POV. I understand the need, but we need to try to figure out the right way. In my eyes, that\u0027s not it :(","commit_id":"fd9c82432fef9a04135c3be537918eef6825570d"},{"author":{"_account_id":12542,"name":"Johannes Grassler","email":"jgr-launchpad@btw23.de","username":"jgrassler"},"change_message_id":"386de497dbd943832f39c435a4a2208f8a429408","unresolved":false,"context_lines":[{"line_number":36,"context_line":"_DEFAULT_API_PORT \u003d 8070"},{"line_number":37,"context_line":"\"\"\"Default TCP port which monasca-api process should be available by\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"_FLAVOR \u003d platform.linux_distribution()[0].strip() "},{"line_number":40,"context_line":"if _FLAVOR.lower() \u003d\u003d \u0027suse linux enterprise server\u0027:"},{"line_number":41,"context_line":"    _NOTIFICATION_USER \u003d \u0027monasca-notification\u0027"},{"line_number":42,"context_line":"    _AGENT_USER \u003d \u0027monasca-agent\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f231b9d_5afe8037","line":39,"in_reply_to":"7f231b9d_5f55601c","updated":"2017-06-14 09:50:58.000000000","message":"Yes. It _is_ hairy, unfortunately :-(\n\nStill...which one do we go for? I\u0027d go for using the owner of agent.yaml as the cleanest heuristic, I think. Not quite a error prone as a hardwired user name...","commit_id":"fd9c82432fef9a04135c3be537918eef6825570d"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"43a4a8760b160fff17c2d7eaf294578a60221c7d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"_DEFAULT_API_PORT \u003d 8070"},{"line_number":37,"context_line":"\"\"\"Default TCP port which monasca-api process should be available by\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"_FLAVOR \u003d platform.linux_distribution()[0].strip() "},{"line_number":40,"context_line":"if _FLAVOR.lower() \u003d\u003d \u0027suse linux enterprise server\u0027:"},{"line_number":41,"context_line":"    _NOTIFICATION_USER \u003d \u0027monasca-notification\u0027"},{"line_number":42,"context_line":"    _AGENT_USER \u003d \u0027monasca-agent\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f231b9d_5f55601c","line":39,"in_reply_to":"7f231b9d_c2c0812d","updated":"2017-06-13 22:31:37.000000000","message":"See below and: In different places we\u0027ve been getting the owner of agent.yaml file as the user who runs the agent. Bad I don\u0027t have a good feeling it would fit here.\n\nPlus, different deployment could have even different users :/","commit_id":"fd9c82432fef9a04135c3be537918eef6825570d"},{"author":{"_account_id":12542,"name":"Johannes Grassler","email":"jgr-launchpad@btw23.de","username":"jgrassler"},"change_message_id":"3b0f2c2a9d9f1b101b74aec254cb9b89d46ffd26","unresolved":false,"context_lines":[{"line_number":36,"context_line":"_DEFAULT_API_PORT \u003d 8070"},{"line_number":37,"context_line":"\"\"\"Default TCP port which monasca-api process should be available by\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"_FLAVOR \u003d platform.linux_distribution()[0].strip() "},{"line_number":40,"context_line":"if _FLAVOR.lower() \u003d\u003d \u0027suse linux enterprise server\u0027:"},{"line_number":41,"context_line":"    _NOTIFICATION_USER \u003d \u0027monasca-notification\u0027"},{"line_number":42,"context_line":"    _AGENT_USER \u003d \u0027monasca-agent\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f231b9d_c2c0812d","line":39,"in_reply_to":"7f231b9d_e81494a2","updated":"2017-06-13 15:17:39.000000000","message":"Because people tend to run monasca-setup as root, which would falsify the result. Or do you mean creating a Process object for a running monasca-agent process? That won\u0027t work in all cases either because monasca-agent may not be running at the time monasca-setup is being run.\n\nIn https://www.github.com/openstack/monasca-agent/commit/242da17f4b379fa52d38fc55d225e47b72b3b224 you used a different approach for determining the monasca agent user\u0027s user name in the postfix plugin as I just discovered when I tried to apply a simpler version of the same thing to master. If you like I can use that approach in mon.py as well. My real preference would be to use the value of the --user command line parameter, but that one\u0027s only available in main.py right now :-(","commit_id":"fd9c82432fef9a04135c3be537918eef6825570d"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"43a4a8760b160fff17c2d7eaf294578a60221c7d","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    def build_config(self):"},{"line_number":202,"context_line":"        \"\"\"Build the config as a Plugins object and return.\"\"\""},{"line_number":203,"context_line":"        log.info(\"\\tEnabling the Monasca Notification healthcheck\")"},{"line_number":204,"context_line":"        return watch_process_by_username(_NOTIFICATION_USER, \u0027monasca-notification\u0027, "},{"line_number":205,"context_line":"                                         \u0027monitoring\u0027, \u0027monasca-notification\u0027)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def dependencies_installed(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f231b9d_68f18b6b","line":204,"updated":"2017-06-13 22:31:37.000000000","message":"I mean for this case, we ought to try and get the user from psutil.Process for monasca-notification process.","commit_id":"fd9c82432fef9a04135c3be537918eef6825570d"},{"author":{"_account_id":12542,"name":"Johannes Grassler","email":"jgr-launchpad@btw23.de","username":"jgrassler"},"change_message_id":"386de497dbd943832f39c435a4a2208f8a429408","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    def build_config(self):"},{"line_number":202,"context_line":"        \"\"\"Build the config as a Plugins object and return.\"\"\""},{"line_number":203,"context_line":"        log.info(\"\\tEnabling the Monasca Notification healthcheck\")"},{"line_number":204,"context_line":"        return watch_process_by_username(_NOTIFICATION_USER, \u0027monasca-notification\u0027, "},{"line_number":205,"context_line":"                                         \u0027monitoring\u0027, \u0027monasca-notification\u0027)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def dependencies_installed(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f231b9d_9a56585c","line":204,"in_reply_to":"7f231b9d_68f18b6b","updated":"2017-06-14 09:50:58.000000000","message":"Agreed, that one would have to be running, so in that case we could get away with using psutil to find the appropriate user. I\u0027ll change this to use the monasca-notification process\u0027 user.","commit_id":"fd9c82432fef9a04135c3be537918eef6825570d"},{"author":{"_account_id":23043,"name":"Jakub Wachowski","email":"jakub.wachowski@ts.fujitsu.com","username":"wachowskij"},"change_message_id":"006f136ed7d8bfc3bf461b6fddc4962778b0b398","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    def build_config(self):"},{"line_number":196,"context_line":"        \"\"\"Build the config as a Plugins object and return.\"\"\""},{"line_number":197,"context_line":"        log.info(\"\\tEnabling the Monasca Notification healthcheck\")"},{"line_number":198,"context_line":"        notification_user \u003d find_process_cmdline(\u0027monasca-notification\u0027).username"},{"line_number":199,"context_line":"        return watch_process_by_username(notification_user, \u0027monasca-notification\u0027,"},{"line_number":200,"context_line":"                                         \u0027monitoring\u0027, \u0027monasca-notification\u0027)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_3e7902c7","line":198,"range":{"start_line":198,"start_character":73,"end_line":198,"end_character":81},"updated":"2017-06-19 10:06:18.000000000","message":"This should be a method call: username()\n\nOtherwise monasca_setup fails with:\n\n  File \"/opt/monasca-agent/local/lib/python2.7/site-packages/yaml/representer.py\", line 249, in represent_undefined\n    raise RepresenterError(\"cannot represent an object: %s\" % data)\nyaml.representer.RepresenterError: cannot represent an object: \u003cbound method Process.username of \u003cpsutil.Process(pid\u003d8812, name\u003d\u0027monasca-notific\u0027) at 140620136302928\u003e\u003e","commit_id":"39312d24623c3fe5d6137fa8225be3f8f7e6596c"},{"author":{"_account_id":12542,"name":"Johannes Grassler","email":"jgr-launchpad@btw23.de","username":"jgrassler"},"change_message_id":"18e483c3e370d2aebcf0d3d7d24af7fe444e75a6","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    def build_config(self):"},{"line_number":196,"context_line":"        \"\"\"Build the config as a Plugins object and return.\"\"\""},{"line_number":197,"context_line":"        log.info(\"\\tEnabling the Monasca Notification healthcheck\")"},{"line_number":198,"context_line":"        notification_user \u003d find_process_cmdline(\u0027monasca-notification\u0027).username"},{"line_number":199,"context_line":"        return watch_process_by_username(notification_user, \u0027monasca-notification\u0027,"},{"line_number":200,"context_line":"                                         \u0027monitoring\u0027, \u0027monasca-notification\u0027)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_a6918449","line":198,"range":{"start_line":198,"start_character":73,"end_line":198,"end_character":81},"in_reply_to":"7f231b9d_00cee058","updated":"2017-06-19 11:33:05.000000000","message":"Both will work. I used `notification_user \u003d find_process_name(\u0027monasca-notification\u0027).username()` when I ran into this problem locally but forgot adding my local fix to the code here as well...sorry about that. Fixed now.","commit_id":"39312d24623c3fe5d6137fa8225be3f8f7e6596c"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"09954b9b5f2bf6b9ece1dde8206ef9f432de6364","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    def build_config(self):"},{"line_number":196,"context_line":"        \"\"\"Build the config as a Plugins object and return.\"\"\""},{"line_number":197,"context_line":"        log.info(\"\\tEnabling the Monasca Notification healthcheck\")"},{"line_number":198,"context_line":"        notification_user \u003d find_process_cmdline(\u0027monasca-notification\u0027).username"},{"line_number":199,"context_line":"        return watch_process_by_username(notification_user, \u0027monasca-notification\u0027,"},{"line_number":200,"context_line":"                                         \u0027monitoring\u0027, \u0027monasca-notification\u0027)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_00cee058","line":198,"range":{"start_line":198,"start_character":73,"end_line":198,"end_character":81},"in_reply_to":"7f231b9d_3e7902c7","updated":"2017-06-19 10:30:23.000000000","message":"actually\n\n  process.as_dict([\u0027username\u0027])[\u0027username\u0027]","commit_id":"39312d24623c3fe5d6137fa8225be3f8f7e6596c"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"65d2b376807df6086dd60a99bdefb5cdb2751c3d","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    def build_config(self):"},{"line_number":196,"context_line":"        \"\"\"Build the config as a Plugins object and return.\"\"\""},{"line_number":197,"context_line":"        log.info(\"\\tEnabling the Monasca Notification healthcheck\")"},{"line_number":198,"context_line":"        notification_user \u003d find_process_name(\u0027monasca-notification\u0027).username()"},{"line_number":199,"context_line":"        return watch_process_by_username(notification_user, \u0027monasca-notification\u0027,"},{"line_number":200,"context_line":"                                         \u0027monitoring\u0027, \u0027monasca-notification\u0027)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7f231b9d_86f56859","line":198,"updated":"2017-06-19 11:40:05.000000000","message":"this is not portable between psutil versions.","commit_id":"96eef3e3b51b4b875e93f7a14e8e70ba2a0693a9"},{"author":{"_account_id":12542,"name":"Johannes Grassler","email":"jgr-launchpad@btw23.de","username":"jgrassler"},"change_message_id":"a4a81acde6bd986a6b46fa1ae9955709534d7bb9","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    def build_config(self):"},{"line_number":196,"context_line":"        \"\"\"Build the config as a Plugins object and return.\"\"\""},{"line_number":197,"context_line":"        log.info(\"\\tEnabling the Monasca Notification healthcheck\")"},{"line_number":198,"context_line":"        notification_user \u003d find_process_name(\u0027monasca-notification\u0027).username()"},{"line_number":199,"context_line":"        return watch_process_by_username(notification_user, \u0027monasca-notification\u0027,"},{"line_number":200,"context_line":"                                         \u0027monitoring\u0027, \u0027monasca-notification\u0027)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7f231b9d_14d2a228","line":198,"in_reply_to":"7f231b9d_86f56859","updated":"2017-06-19 12:27:57.000000000","message":"Ah ok. I switched to the other variant now.","commit_id":"96eef3e3b51b4b875e93f7a14e8e70ba2a0693a9"}],"monasca_setup/detection/utils.py":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"532e6ad2ace1b0ab54baf53c5e6e72bef648219d","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        return ip[0].lstrip(\"::ffff:\")"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"def get_agent_username():"},{"line_number":99,"context_line":"    \"\"\"Determine the user monasca-agent runs as\"\"\""},{"line_number":100,"context_line":"    # Try the owner of agent.yaml first"},{"line_number":101,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f231b9d_5b6bedb5","line":98,"range":{"start_line":98,"start_character":17,"end_line":98,"end_character":18},"updated":"2017-06-15 19:17:58.000000000","message":"Maybe, let\u0027s wrap it up in some caching decorator or something ? Seems not quite ok, if we have to detect that all the time this method is called and it will be called several times, right ?","commit_id":"e64d2d1f0ca6840896f24205f10610eab99c54ca"},{"author":{"_account_id":12542,"name":"Johannes Grassler","email":"jgr-launchpad@btw23.de","username":"jgrassler"},"change_message_id":"3d42544289fc847909ae3496683a4db0fe9fd81c","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        return ip[0].lstrip(\"::ffff:\")"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"def get_agent_username():"},{"line_number":99,"context_line":"    \"\"\"Determine the user monasca-agent runs as\"\"\""},{"line_number":100,"context_line":"    # Try the owner of agent.yaml first"},{"line_number":101,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f231b9d_ae5d0448","line":98,"range":{"start_line":98,"start_character":17,"end_line":98,"end_character":18},"in_reply_to":"7f231b9d_5b6bedb5","updated":"2017-06-16 14:44:50.000000000","message":"Done","commit_id":"e64d2d1f0ca6840896f24205f10610eab99c54ca"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"532e6ad2ace1b0ab54baf53c5e6e72bef648219d","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    if agent_process is not None:"},{"line_number":113,"context_line":"        return agent_process.username()"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    # Fall back to static agent user"},{"line_number":116,"context_line":"    return _AGENT_USER"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7f231b9d_5b42cd3f","line":115,"updated":"2017-06-15 19:17:58.000000000","message":"I\u0027d log warn here, this is something that we fallback to because couldn\u0027t reliable get user in other way.","commit_id":"e64d2d1f0ca6840896f24205f10610eab99c54ca"},{"author":{"_account_id":12542,"name":"Johannes Grassler","email":"jgr-launchpad@btw23.de","username":"jgrassler"},"change_message_id":"3d42544289fc847909ae3496683a4db0fe9fd81c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    if agent_process is not None:"},{"line_number":113,"context_line":"        return agent_process.username()"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    # Fall back to static agent user"},{"line_number":116,"context_line":"    return _AGENT_USER"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7f231b9d_8e580856","line":115,"in_reply_to":"7f231b9d_5b42cd3f","updated":"2017-06-16 14:44:50.000000000","message":"Done","commit_id":"e64d2d1f0ca6840896f24205f10610eab99c54ca"}],"monasca_setup/utils.py":[{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"757aeb37e53fd58e73451f9595c5ede691bc34e7","unresolved":false,"context_lines":[{"line_number":5,"context_line":"import inspect"},{"line_number":6,"context_line":"import logging"},{"line_number":7,"context_line":"import os"},{"line_number":8,"context_line":"import pwd"},{"line_number":9,"context_line":"import sys"},{"line_number":10,"context_line":"import yaml"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7f231b9d_e44582b5","line":8,"updated":"2017-06-15 14:13:49.000000000","message":"Remove","commit_id":"1e6e9c18e57d627b7ce202327371cfa165ebd802"},{"author":{"_account_id":12542,"name":"Johannes Grassler","email":"jgr-launchpad@btw23.de","username":"jgrassler"},"change_message_id":"e741adf3aa1216f9903a152e11e98a934696326e","unresolved":false,"context_lines":[{"line_number":5,"context_line":"import inspect"},{"line_number":6,"context_line":"import logging"},{"line_number":7,"context_line":"import os"},{"line_number":8,"context_line":"import pwd"},{"line_number":9,"context_line":"import sys"},{"line_number":10,"context_line":"import yaml"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7f231b9d_c7ce0559","line":8,"in_reply_to":"7f231b9d_e44582b5","updated":"2017-06-15 16:02:38.000000000","message":"Done","commit_id":"1e6e9c18e57d627b7ce202327371cfa165ebd802"}]}
