)]}'
{"rally_openstack/services/loadbalancer/octavia.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"823f97a7db9ec539af464f248aa37ecde8dd9925","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            \"vip_subnet_id\": subnet_id,"},{"line_number":71,"context_line":"            \"vip_qos_policy_id\": vip_qos_policy_id,"},{"line_number":72,"context_line":"        }"},{"line_number":73,"context_line":"        return self._clients.octavia().load_balancer_create("},{"line_number":74,"context_line":"            json\u003d{\"loadbalancer\": args})"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @atomic.action_timer(\"octavia.load_balancer_delete\")"},{"line_number":77,"context_line":"    def load_balancer_delete(self, lb_id, cascade\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_c3d91757","line":74,"range":{"start_line":73,"start_character":16,"end_line":74,"end_character":40},"updated":"2019-07-16 17:03:01.000000000","message":"can we grep value of \"loadbalancer\" key here instead of returning {\"loadbalancer\": {actual_load_balancer_obj}} ? It will simplify usage of return object.","commit_id":"e99f11408afc7d893c55cb36ca8a44c260f2ed4b"},{"author":{"_account_id":15209,"name":"Lucas Xu","email":"hanxu@redhat.com","username":"xuh"},"change_message_id":"93f075146e78e8f77ffe66c3a3d04c5994b5a5fe","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            \"vip_subnet_id\": subnet_id,"},{"line_number":71,"context_line":"            \"vip_qos_policy_id\": vip_qos_policy_id,"},{"line_number":72,"context_line":"        }"},{"line_number":73,"context_line":"        return self._clients.octavia().load_balancer_create("},{"line_number":74,"context_line":"            json\u003d{\"loadbalancer\": args})"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @atomic.action_timer(\"octavia.load_balancer_delete\")"},{"line_number":77,"context_line":"    def load_balancer_delete(self, lb_id, cascade\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_6cdfe168","line":74,"range":{"start_line":73,"start_character":16,"end_line":74,"end_character":40},"in_reply_to":"7faddb67_c3d91757","updated":"2019-07-17 18:09:45.000000000","message":"yeah, I think here we have to put it in the octavia api. But we can let this function returns the actual obj for sure","commit_id":"e99f11408afc7d893c55cb36ca8a44c260f2ed4b"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"823f97a7db9ec539af464f248aa37ecde8dd9925","unresolved":false,"context_lines":[{"line_number":616,"context_line":"        return self._clients.octavia().amphora_list(**kwargs)"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"    @atomic.action_timer(\"octavia.wait_for_loadbalancers\")"},{"line_number":619,"context_line":"    def wait_for_loadbalancer_prov_status(self, lb, prov_status\u003d\"ACTIVE\"):"},{"line_number":620,"context_line":"        return utils.wait_for_status("},{"line_number":621,"context_line":"            lb[\"loadbalancer\"][\"id\"],"},{"line_number":622,"context_line":"            ready_statuses\u003d[prov_status],"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_c3efd71b","line":619,"range":{"start_line":619,"start_character":48,"end_line":619,"end_character":50},"updated":"2019-07-16 17:03:01.000000000","message":"it would be nice to port it to lb_id as well","commit_id":"e99f11408afc7d893c55cb36ca8a44c260f2ed4b"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"823f97a7db9ec539af464f248aa37ecde8dd9925","unresolved":false,"context_lines":[{"line_number":621,"context_line":"            lb[\"loadbalancer\"][\"id\"],"},{"line_number":622,"context_line":"            ready_statuses\u003d[prov_status],"},{"line_number":623,"context_line":"            status_attr\u003d\"provisioning_status\","},{"line_number":624,"context_line":"            update_resource\u003dself.load_balancer_show,"},{"line_number":625,"context_line":"            timeout\u003dCONF.openstack.octavia_create_loadbalancer_timeout,"},{"line_number":626,"context_line":"            check_interval\u003d("},{"line_number":627,"context_line":"                CONF.openstack.octavia_create_loadbalancer_poll_interval)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_03716f0c","line":624,"range":{"start_line":624,"start_character":12,"end_line":624,"end_character":52},"updated":"2019-07-16 17:03:01.000000000","message":"There is an issue with how wait_for_status works. wait_for_status method has a loop that calls the function from update_resource argument. At first iteration, it calls it with  what is transmitted as the first argument to wait_for_status (lb[\"loadbalancer\"][\"id\"] in our case), for the second and all other iterations update_resource function is called with the result of previous execution of it[*].\nThis means that for the second and all other iterations self.load_balancer_show method is executed with a dict of load_balancer, not a string with id.\n\nit can be fixed like with adding lambda function like:\n\n    # hope that we can make self.load_balancer_show \n    # and all other methods to return actual objs instead of {\"loadbalancer\": {actual obj}}\n    update_resource\u003dlambda lb: self.load_balancer_show(lb[\"loadbalancer\"][\"id\"])\n\n\n[*] - https://github.com/openstack/rally/blob/1.6.0/rally/task/utils.py#L214","commit_id":"e99f11408afc7d893c55cb36ca8a44c260f2ed4b"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"900d16a018636e40b307a492bf37449fb0dd8724","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            if getattr(e, \"code\", 400) \u003d\u003d 404:"},{"line_number":51,"context_line":"                raise exceptions.GetResourceNotFound(resource\u003dlb_id)"},{"line_number":52,"context_line":"            raise exceptions.GetResourceFailure(resource\u003dlb_id, err\u003de)"},{"line_number":53,"context_line":"        return new_lb"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @atomic.action_timer(\"octavia.load_balancer_create\")"},{"line_number":56,"context_line":"    def load_balancer_create(self, subnet_id, description\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_03e28102","line":53,"range":{"start_line":53,"start_character":15,"end_line":53,"end_character":21},"updated":"2019-07-22 13:29:02.000000000","message":"should it be here `new_lb[\"loadbalancer\"]` ?","commit_id":"6832082aa55dfddef50a71ec827c2974e60f04a7"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"55b07736841a999a1836c70f8423fe6f983aac44","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            if getattr(e, \"code\", 400) \u003d\u003d 404:"},{"line_number":51,"context_line":"                raise exceptions.GetResourceNotFound(resource\u003dlb_id)"},{"line_number":52,"context_line":"            raise exceptions.GetResourceFailure(resource\u003dlb_id, err\u003de)"},{"line_number":53,"context_line":"        return new_lb"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @atomic.action_timer(\"octavia.load_balancer_create\")"},{"line_number":56,"context_line":"    def load_balancer_create(self, subnet_id, description\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_dec17b82","line":53,"range":{"start_line":53,"start_character":15,"end_line":53,"end_character":21},"in_reply_to":"7faddb67_03e28102","updated":"2019-07-24 12:22:59.000000000","message":"it looks like it is not needed","commit_id":"6832082aa55dfddef50a71ec827c2974e60f04a7"}]}
