)]}'
{"rally_openstack/scenarios/octavia/listeners.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"39bcc0314f576029b268bb1db951fb917b760658","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        for loadbalancer in loadbalancers:"},{"line_number":53,"context_line":"            self.octavia.wait_for_loadbalancer_prov_status(loadbalancer)"},{"line_number":54,"context_line":"            self.octavia.listener_create("},{"line_number":55,"context_line":"                lb_id\u003dloadbalancer[\"loadbalancer\"][\"id\"],"},{"line_number":56,"context_line":"                protocol\u003dprotocol, protocol_port\u003dprotocol_port)"},{"line_number":57,"context_line":"        self.octavia.listener_list()"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_86037842","line":55,"range":{"start_line":55,"start_character":34,"end_line":55,"end_character":50},"updated":"2019-07-29 14:37:34.000000000","message":"this is redundant","commit_id":"8220300ac16c6048708955049525610cb2834f49"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"39bcc0314f576029b268bb1db951fb917b760658","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        for loadbalancer in loadbalancers:"},{"line_number":85,"context_line":"            self.octavia.wait_for_loadbalancer_prov_status(loadbalancer)"},{"line_number":86,"context_line":"            listener \u003d self.octavia.listener_create("},{"line_number":87,"context_line":"                lb_id\u003dloadbalancer[\"loadbalancer\"][\"id\"],"},{"line_number":88,"context_line":"                protocol\u003dprotocol, protocol_port\u003dprotocol_port)"},{"line_number":89,"context_line":"            self.octavia.listener_delete(listener_id\u003dlistener[\"id\"])"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_069548e4","line":87,"range":{"start_line":87,"start_character":34,"end_line":87,"end_character":50},"updated":"2019-07-29 14:37:34.000000000","message":"same here","commit_id":"8220300ac16c6048708955049525610cb2834f49"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"39bcc0314f576029b268bb1db951fb917b760658","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            }"},{"line_number":120,"context_line":"            self.octavia.wait_for_loadbalancer_prov_status(loadbalancer)"},{"line_number":121,"context_line":"            listener \u003d self.octavia.listener_create("},{"line_number":122,"context_line":"                lb_id\u003dloadbalancer[\"loadbalancer\"][\"id\"],"},{"line_number":123,"context_line":"                protocol\u003dprotocol, protocol_port\u003dprotocol_port)"},{"line_number":124,"context_line":"            self.octavia.listener_set(listener_id\u003dlistener[\"id\"],"},{"line_number":125,"context_line":"                                      listener_update_args\u003dupdate_listener)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_868858c6","line":122,"range":{"start_line":122,"start_character":34,"end_line":122,"end_character":50},"updated":"2019-07-29 14:37:34.000000000","message":"and here","commit_id":"8220300ac16c6048708955049525610cb2834f49"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"39bcc0314f576029b268bb1db951fb917b760658","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        for loadbalancer in loadbalancers:"},{"line_number":153,"context_line":"            self.octavia.wait_for_loadbalancer_prov_status(loadbalancer)"},{"line_number":154,"context_line":"            listener \u003d self.octavia.listener_create("},{"line_number":155,"context_line":"                lb_id\u003dloadbalancer[\"loadbalancer\"][\"id\"],"},{"line_number":156,"context_line":"                protocol\u003dprotocol, protocol_port\u003dprotocol_port)"},{"line_number":157,"context_line":"            self.octavia.listener_show(listener_id\u003dlistener[\"id\"])"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_668d1cd2","line":155,"range":{"start_line":155,"start_character":34,"end_line":155,"end_character":50},"updated":"2019-07-29 14:37:34.000000000","message":";)","commit_id":"8220300ac16c6048708955049525610cb2834f49"}],"rally_openstack/services/loadbalancer/octavia.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"679d769c6ae78ed98f06af2def362fc4075c8388","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        :param lb_id:"},{"line_number":161,"context_line":"            Loadbalancer id"},{"line_number":162,"context_line":"        :param listener_create:"},{"line_number":163,"context_line":"            Parameters to create a listener with (expects json\u003d)"},{"line_number":164,"context_line":"        :return:"},{"line_number":165,"context_line":"            A dict of the created listener\u0027s settings"},{"line_number":166,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_11902d4e","line":163,"range":{"start_line":162,"start_character":8,"end_line":163,"end_character":64},"updated":"2019-01-24 13:26:18.000000000","message":"it would be nice to replace this with real documentation","commit_id":"2b003d2c6683e69ecc3e46ba2a106b64b235fa50"},{"author":{"_account_id":24,"name":"Chuck Short","email":"charles.short@windriver.com","username":"zulcss"},"change_message_id":"4a90eaf9b28145636f1bce1aca0caa77423dafcc","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        :param lb_id:"},{"line_number":161,"context_line":"            Loadbalancer id"},{"line_number":162,"context_line":"        :param listener_create:"},{"line_number":163,"context_line":"            Parameters to create a listener with (expects json\u003d)"},{"line_number":164,"context_line":"        :return:"},{"line_number":165,"context_line":"            A dict of the created listener\u0027s settings"},{"line_number":166,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_71fb8646","line":163,"range":{"start_line":162,"start_character":8,"end_line":163,"end_character":64},"in_reply_to":"9fdfeff1_11902d4e","updated":"2019-01-28 13:54:15.000000000","message":"Ill try to address this another commit.","commit_id":"2b003d2c6683e69ecc3e46ba2a106b64b235fa50"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"02842a3f5b3513e22e52bc77a35f327cb70f5e99","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        :return:"},{"line_number":77,"context_line":"            Response Code from the API"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        try:"},{"line_number":80,"context_line":"            return self._clients.octavia().load_balancer_delete("},{"line_number":81,"context_line":"                lb_id, cascade\u003dcascade)"},{"line_number":82,"context_line":"        except Exception as e:"},{"line_number":83,"context_line":"            if getattr(e, \"status_code\", 409) \u003d\u003d 409:"},{"line_number":84,"context_line":"                LOG.debug(\"Loadbalancer %s was not deleted. Skip silently \""},{"line_number":85,"context_line":"                          \"because loadbalancer can already be deleted.\" %"},{"line_number":86,"context_line":"                          lb_id)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @atomic.action_timer(\"octavia.load_balancer_set\")"},{"line_number":89,"context_line":"    def load_balancer_set(self, lb_id, lb_update_args):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_0408072a","line":86,"range":{"start_line":79,"start_character":8,"end_line":86,"end_character":32},"updated":"2019-07-09 14:30:51.000000000","message":"I guess it is caused by the same issue as I saw during an attempt to extend cleanup resources [1]. It doesn\u0027t look ok and it seems that we are calculating the time of delete action not accurate for Octavia resources. API calls are async, i.e. API returns a response without waiting for action completion. \nIt would be nice to extend this delete method with something like [2] (waiting for 404 exception).\n\n[1] - https://review.opendev.org/#/c/669639/\n[2] - https://github.com/openstack/rally-openstack/blob/master/rally_openstack/services/storage/cinder_common.py#L72-L80","commit_id":"d454873e7a87312e12e575ad0bff1ceed4b32189"},{"author":{"_account_id":15209,"name":"Lucas Xu","email":"hanxu@redhat.com","username":"xuh"},"change_message_id":"c19a411968f6c6215eb7e2a9202bf3eb783f127d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        :return:"},{"line_number":77,"context_line":"            Response Code from the API"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        try:"},{"line_number":80,"context_line":"            return self._clients.octavia().load_balancer_delete("},{"line_number":81,"context_line":"                lb_id, cascade\u003dcascade)"},{"line_number":82,"context_line":"        except Exception as e:"},{"line_number":83,"context_line":"            if getattr(e, \"status_code\", 409) \u003d\u003d 409:"},{"line_number":84,"context_line":"                LOG.debug(\"Loadbalancer %s was not deleted. Skip silently \""},{"line_number":85,"context_line":"                          \"because loadbalancer can already be deleted.\" %"},{"line_number":86,"context_line":"                          lb_id)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @atomic.action_timer(\"octavia.load_balancer_set\")"},{"line_number":89,"context_line":"    def load_balancer_set(self, lb_id, lb_update_args):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_ca12ce09","line":86,"range":{"start_line":79,"start_character":8,"end_line":86,"end_character":32},"in_reply_to":"7faddb67_0408072a","updated":"2019-07-11 14:37:30.000000000","message":"Sure, thanks for the review! I will update the listener methods to reflect what you have said. For load balancer and pool, I will send a new commit. Since currently, at least for load balancer delete, it is passing the lb ID to the method. I believe for using the wait_for_status function provided by the rally, it has to be a resource. I am not sure whether getting the resources from the method here is a good idea. Maybe it should use lb (resource) rather than lb_id as its argument.","commit_id":"d454873e7a87312e12e575ad0bff1ceed4b32189"},{"author":{"_account_id":15209,"name":"Lucas Xu","email":"hanxu@redhat.com","username":"xuh"},"change_message_id":"76a390f8b6f498a27232eb27500219256fa6cce4","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        :return:"},{"line_number":77,"context_line":"            Response Code from the API"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        try:"},{"line_number":80,"context_line":"            return self._clients.octavia().load_balancer_delete("},{"line_number":81,"context_line":"                lb_id, cascade\u003dcascade)"},{"line_number":82,"context_line":"        except Exception as e:"},{"line_number":83,"context_line":"            if getattr(e, \"status_code\", 409) \u003d\u003d 409:"},{"line_number":84,"context_line":"                LOG.debug(\"Loadbalancer %s was not deleted. Skip silently \""},{"line_number":85,"context_line":"                          \"because loadbalancer can already be deleted.\" %"},{"line_number":86,"context_line":"                          lb_id)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @atomic.action_timer(\"octavia.load_balancer_set\")"},{"line_number":89,"context_line":"    def load_balancer_set(self, lb_id, lb_update_args):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_4c9ca869","line":86,"range":{"start_line":79,"start_character":8,"end_line":86,"end_character":32},"in_reply_to":"7faddb67_33f18f96","updated":"2019-07-12 14:44:42.000000000","message":"\u003e \u003e Since currently, at least for load balancer delete, it is passing\n \u003e the lb ID to the method.\n \u003e \n \u003e Actually, we have inconsistency now: some methods expect dict with\n \u003e ID, other just an idea. It relates not only to load balancers. I\n \u003e like the idea of passing just an ID of resource instead of the\n \u003e whole dict. \n \u003e \n \u003e \u003e I believe for using the wait_for_status function provided by the\n \u003e rally, it has to be a resource.\n \u003e \n \u003e It is not true. As you already did in the latest PR, wait_for\n \u003e method accepts a custom update method.\n\n\nI totally agree that we should resolve the inconsistency issue. And some formality here would be great and hopefully mitigate the confusion. \n\nSo, we should always pass the ID of the resoruces (lb, listener, pool, etc.) And for updating the resources, we should have a function that can find the resource based on the ID, most likely a show() method since there is no get() in octaviaclient. This patch is about the listener, so I would focus on the listener part then. I will send another patch after this one to change the lb and pool.","commit_id":"d454873e7a87312e12e575ad0bff1ceed4b32189"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4815e27896ce551e0452f32c35b8686c868e61fe","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        :return:"},{"line_number":77,"context_line":"            Response Code from the API"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        try:"},{"line_number":80,"context_line":"            return self._clients.octavia().load_balancer_delete("},{"line_number":81,"context_line":"                lb_id, cascade\u003dcascade)"},{"line_number":82,"context_line":"        except Exception as e:"},{"line_number":83,"context_line":"            if getattr(e, \"status_code\", 409) \u003d\u003d 409:"},{"line_number":84,"context_line":"                LOG.debug(\"Loadbalancer %s was not deleted. Skip silently \""},{"line_number":85,"context_line":"                          \"because loadbalancer can already be deleted.\" %"},{"line_number":86,"context_line":"                          lb_id)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @atomic.action_timer(\"octavia.load_balancer_set\")"},{"line_number":89,"context_line":"    def load_balancer_set(self, lb_id, lb_update_args):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_33f18f96","line":86,"range":{"start_line":79,"start_character":8,"end_line":86,"end_character":32},"in_reply_to":"7faddb67_ca12ce09","updated":"2019-07-12 12:27:54.000000000","message":"\u003e Since currently, at least for load balancer delete, it is passing the lb ID to the method.\n\nActually, we have inconsistency now: some methods expect dict with ID, other just an idea. It relates not only to load balancers. I like the idea of passing just an ID of resource instead of the whole dict.\n\n\u003e I believe for using the wait_for_status function provided by the rally, it has to be a resource.\n\nIt is not true. As you already did in the latest PR, wait_for method accepts a custom update method.","commit_id":"d454873e7a87312e12e575ad0bff1ceed4b32189"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"e596461705dc7a75b8dafa48594b52e1c5e05c6f","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        :return:"},{"line_number":137,"context_line":"            A dict of the specified listener\u0027s settings"},{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        return self._clients.octavia().listener_show(listener_id)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def update_listener_resource(self, listener):"},{"line_number":142,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_d35efb74","line":139,"range":{"start_line":139,"start_character":15,"end_line":139,"end_character":65},"updated":"2019-07-12 12:39:57.000000000","message":"We can wrap this with catching exception instead of creating a new method","commit_id":"96f410c00a98ec5cdfbe72f4e8d91962a9e5181d"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"49fb5a2e213b35e23d882dc0e8299a4ccba2f565","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        :return:"},{"line_number":137,"context_line":"            A dict of the specified listener\u0027s settings"},{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        return self._clients.octavia().listener_show(listener_id)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def update_listener_resource(self, listener):"},{"line_number":142,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_c4caac4c","line":139,"range":{"start_line":139,"start_character":15,"end_line":139,"end_character":65},"in_reply_to":"7faddb67_0cba30c0","updated":"2019-07-12 17:13:03.000000000","message":"yes","commit_id":"96f410c00a98ec5cdfbe72f4e8d91962a9e5181d"},{"author":{"_account_id":15209,"name":"Lucas Xu","email":"hanxu@redhat.com","username":"xuh"},"change_message_id":"13a663718711dae48d911eaa990482d347fdcfe8","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        :return:"},{"line_number":137,"context_line":"            A dict of the specified listener\u0027s settings"},{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        return self._clients.octavia().listener_show(listener_id)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def update_listener_resource(self, listener):"},{"line_number":142,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_0cba30c0","line":139,"range":{"start_line":139,"start_character":15,"end_line":139,"end_character":65},"in_reply_to":"7faddb67_d35efb74","updated":"2019-07-12 14:48:44.000000000","message":"sounds good, so we don\u0027t have to use the update_listener_resource() method right? This show() method would basically replace it if IIRC","commit_id":"96f410c00a98ec5cdfbe72f4e8d91962a9e5181d"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"e596461705dc7a75b8dafa48594b52e1c5e05c6f","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            new_listener \u003d self._clients.octavia().listener_show("},{"line_number":144,"context_line":"                listener[\"id\"])"},{"line_number":145,"context_line":"        except Exception as e:"},{"line_number":146,"context_line":"            if getattr(e, \"status_code\", 400) \u003d\u003d 404:"},{"line_number":147,"context_line":"                raise exceptions.GetResourceNotFound(resource\u003dlistener)"},{"line_number":148,"context_line":"            raise exceptions.GetResourceFailure(resource\u003dlistener, err\u003de)"},{"line_number":149,"context_line":"        return new_listener"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_f3c8d722","line":146,"range":{"start_line":146,"start_character":12,"end_line":146,"end_character":53},"updated":"2019-07-12 12:39:57.000000000","message":"OctaviClient raises an object which has \"code\" property which we actually should check\n\nhttps://github.com/openstack/python-octaviaclient/blob/master/octaviaclient/api/v2/octavia.py#L921","commit_id":"96f410c00a98ec5cdfbe72f4e8d91962a9e5181d"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"e596461705dc7a75b8dafa48594b52e1c5e05c6f","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                listener[\"id\"])"},{"line_number":145,"context_line":"        except Exception as e:"},{"line_number":146,"context_line":"            if getattr(e, \"status_code\", 400) \u003d\u003d 404:"},{"line_number":147,"context_line":"                raise exceptions.GetResourceNotFound(resource\u003dlistener)"},{"line_number":148,"context_line":"            raise exceptions.GetResourceFailure(resource\u003dlistener, err\u003de)"},{"line_number":149,"context_line":"        return new_listener"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_33fbcf47","line":147,"range":{"start_line":147,"start_character":53,"end_line":147,"end_character":71},"updated":"2019-07-12 12:39:57.000000000","message":"let\u0027s be more user-friendly here and put `resource\u003d\u0027load balancer [id\u003d%s]\u0027 % listener_id`, so the final exception message will look clearer.","commit_id":"96f410c00a98ec5cdfbe72f4e8d91962a9e5181d"},{"author":{"_account_id":15209,"name":"Lucas Xu","email":"hanxu@redhat.com","username":"xuh"},"change_message_id":"13a663718711dae48d911eaa990482d347fdcfe8","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                listener[\"id\"])"},{"line_number":145,"context_line":"        except Exception as e:"},{"line_number":146,"context_line":"            if getattr(e, \"status_code\", 400) \u003d\u003d 404:"},{"line_number":147,"context_line":"                raise exceptions.GetResourceNotFound(resource\u003dlistener)"},{"line_number":148,"context_line":"            raise exceptions.GetResourceFailure(resource\u003dlistener, err\u003de)"},{"line_number":149,"context_line":"        return new_listener"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_8cd2a0ff","line":147,"range":{"start_line":147,"start_character":53,"end_line":147,"end_character":71},"in_reply_to":"7faddb67_33fbcf47","updated":"2019-07-12 14:48:44.000000000","message":"I am a bit confused. Did you mean `listener [id\u003d%s] % listener_id`? \n\nBut, as you mentioned, we probably do really need this method anyways right?","commit_id":"96f410c00a98ec5cdfbe72f4e8d91962a9e5181d"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"49fb5a2e213b35e23d882dc0e8299a4ccba2f565","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                listener[\"id\"])"},{"line_number":145,"context_line":"        except Exception as e:"},{"line_number":146,"context_line":"            if getattr(e, \"status_code\", 400) \u003d\u003d 404:"},{"line_number":147,"context_line":"                raise exceptions.GetResourceNotFound(resource\u003dlistener)"},{"line_number":148,"context_line":"            raise exceptions.GetResourceFailure(resource\u003dlistener, err\u003de)"},{"line_number":149,"context_line":"        return new_listener"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_a4cd3067","line":147,"range":{"start_line":147,"start_character":53,"end_line":147,"end_character":71},"in_reply_to":"7faddb67_8cd2a0ff","updated":"2019-07-12 17:13:03.000000000","message":"\u003e Did you mean `listener [id\u003d%s] % listener_id`? \n\nyes, sorry\n\n\u003e we probably do really need this method anyways right?\n\nno, we can move this logic under listener_show method","commit_id":"96f410c00a98ec5cdfbe72f4e8d91962a9e5181d"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"e596461705dc7a75b8dafa48594b52e1c5e05c6f","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            listener,"},{"line_number":189,"context_line":"            ready_statuses\u003d[\"ACTIVE\"],"},{"line_number":190,"context_line":"            status_attr\u003d\"provisioning_status\","},{"line_number":191,"context_line":"            update_resource\u003dself.update_listener_resource,"},{"line_number":192,"context_line":"            timeout\u003dCONF.openstack.octavia_create_loadbalancer_timeout,"},{"line_number":193,"context_line":"            check_interval\u003d("},{"line_number":194,"context_line":"                CONF.openstack.octavia_create_loadbalancer_poll_interval)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_531c4bc0","line":191,"range":{"start_line":191,"start_character":28,"end_line":191,"end_character":57},"updated":"2019-07-12 12:39:57.000000000","message":"1) we can use listener show here\n2) to workaround the transformation between dict object and ID string input argument, you can use here lambda function like: labmda d: self.listener_show(d[\"id\"])","commit_id":"96f410c00a98ec5cdfbe72f4e8d91962a9e5181d"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"e596461705dc7a75b8dafa48594b52e1c5e05c6f","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        return listener"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    @atomic.action_timer(\"octavia.listener_delete\")"},{"line_number":199,"context_line":"    def listener_delete(self, listener):"},{"line_number":200,"context_line":"        \"\"\"Delete a listener"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        :param stirng listener:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_138013c0","line":199,"range":{"start_line":199,"start_character":30,"end_line":199,"end_character":38},"updated":"2019-07-12 12:39:57.000000000","message":"let\u0027s leave listener ID","commit_id":"96f410c00a98ec5cdfbe72f4e8d91962a9e5181d"}]}
