)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"3e1357dc994987edfc0523a50043f1587ac3ba4d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cindia-blue \u003clxinhui@vmware.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-29 10:29:28 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add node resource into cluster service"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds node check and recover into the cluster service."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7a5de9d1_bebac2be","line":7,"updated":"2016-01-29 02:57:59.000000000","message":"please make it accurate. this is not about adding a new resource, this is only about adding check/recover actions to cluster nodes.","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"}],"openstack/cluster/v1/_proxy.py":[{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"3e1357dc994987edfc0523a50043f1587ac3ba4d","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        \"\"\""},{"line_number":406,"context_line":"        self._delete(_node.Node, node, ignore_missing\u003dignore_missing)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def check_node(self, node, **attrs):"},{"line_number":409,"context_line":"        \"\"\"check a node."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        :param node: The value can be either the name or ID of a node or a"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_7eebeab0","line":408,"range":{"start_line":408,"start_character":33,"end_line":408,"end_character":38},"updated":"2016-01-29 02:57:59.000000000","message":"suggest to rename this to \u0027params\u0027 since it is not about node to create or to update. \u0027params\u0027 reads more proper IMO.","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"},{"author":{"_account_id":15857,"name":"Xinhui Li","email":"lxinhui@vmware.com","username":"Cindia-blue"},"change_message_id":"13454617ae82563cc209029d8ffe7d394ebee6f7","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        \"\"\""},{"line_number":406,"context_line":"        self._delete(_node.Node, node, ignore_missing\u003dignore_missing)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def check_node(self, node, **attrs):"},{"line_number":409,"context_line":"        \"\"\"check a node."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        :param node: The value can be either the name or ID of a node or a"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_23ac76ec","line":408,"range":{"start_line":408,"start_character":33,"end_line":408,"end_character":38},"in_reply_to":"7a5de9d1_7eebeab0","updated":"2016-01-29 03:56:22.000000000","message":"Thanks. I should revise it before commit.","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"3e1357dc994987edfc0523a50043f1587ac3ba4d","unresolved":false,"context_lines":[{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        :param node: The value can be either the name or ID of a node or a"},{"line_number":412,"context_line":"            :class:`~openstack.cluster.v1.node.Node` instance."},{"line_number":413,"context_line":"        :param bool ignore_missing: When set to ``False``, an exception"},{"line_number":414,"context_line":"            :class:`~openstack.exceptions.ResourceNotFound` will be raised when"},{"line_number":415,"context_line":"            the node could not be found. When set to ``True``, no exception"},{"line_number":416,"context_line":"            will be raised when attempting to delete a non-existent node."}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_fed7daea","line":413,"updated":"2016-01-29 02:57:59.000000000","message":"Please update the above parameter, we don\u0027t have ignore_missing, we have attrs/params.","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"},{"author":{"_account_id":15857,"name":"Xinhui Li","email":"lxinhui@vmware.com","username":"Cindia-blue"},"change_message_id":"13454617ae82563cc209029d8ffe7d394ebee6f7","unresolved":false,"context_lines":[{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        :param node: The value can be either the name or ID of a node or a"},{"line_number":412,"context_line":"            :class:`~openstack.cluster.v1.node.Node` instance."},{"line_number":413,"context_line":"        :param bool ignore_missing: When set to ``False``, an exception"},{"line_number":414,"context_line":"            :class:`~openstack.exceptions.ResourceNotFound` will be raised when"},{"line_number":415,"context_line":"            the node could not be found. When set to ``True``, no exception"},{"line_number":416,"context_line":"            will be raised when attempting to delete a non-existent node."}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_8383ea55","line":413,"in_reply_to":"7a5de9d1_fed7daea","updated":"2016-01-29 03:56:22.000000000","message":"Done","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"3e1357dc994987edfc0523a50043f1587ac3ba4d","unresolved":false,"context_lines":[{"line_number":423,"context_line":"            obj \u003d self._find(_node.Node, node, ignore_missing\u003dFalse)"},{"line_number":424,"context_line":"        return obj.check(self.session, **attrs)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def recover_node(self, node, **attrs):"},{"line_number":427,"context_line":"        \"\"\"recover a node."},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        :param node: The value can be either the name or ID of a node or a"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_feeefab2","line":426,"range":{"start_line":426,"start_character":35,"end_line":426,"end_character":40},"updated":"2016-01-29 02:57:59.000000000","message":"same","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"},{"author":{"_account_id":15857,"name":"Xinhui Li","email":"lxinhui@vmware.com","username":"Cindia-blue"},"change_message_id":"13454617ae82563cc209029d8ffe7d394ebee6f7","unresolved":false,"context_lines":[{"line_number":423,"context_line":"            obj \u003d self._find(_node.Node, node, ignore_missing\u003dFalse)"},{"line_number":424,"context_line":"        return obj.check(self.session, **attrs)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def recover_node(self, node, **attrs):"},{"line_number":427,"context_line":"        \"\"\"recover a node."},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        :param node: The value can be either the name or ID of a node or a"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_036a9ab3","line":426,"range":{"start_line":426,"start_character":35,"end_line":426,"end_character":40},"in_reply_to":"7a5de9d1_feeefab2","updated":"2016-01-29 03:56:22.000000000","message":"Done","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"3e1357dc994987edfc0523a50043f1587ac3ba4d","unresolved":false,"context_lines":[{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        :param node: The value can be either the name or ID of a node or a"},{"line_number":430,"context_line":"            :class:`~openstack.cluster.v1.node.Node` instance."},{"line_number":431,"context_line":"        :param bool ignore_missing: When set to ``False``, an exception"},{"line_number":432,"context_line":"            :class:`~openstack.exceptions.ResourceNotFound` will be raised when"},{"line_number":433,"context_line":"            the node could not be found. When set to ``True``, no exception"},{"line_number":434,"context_line":"            will be raised when attempting to delete a non-existent node."}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_be2f22f5","line":431,"range":{"start_line":431,"start_character":20,"end_line":431,"end_character":34},"updated":"2016-01-29 02:57:59.000000000","message":"same","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"},{"author":{"_account_id":15857,"name":"Xinhui Li","email":"lxinhui@vmware.com","username":"Cindia-blue"},"change_message_id":"13454617ae82563cc209029d8ffe7d394ebee6f7","unresolved":false,"context_lines":[{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        :param node: The value can be either the name or ID of a node or a"},{"line_number":430,"context_line":"            :class:`~openstack.cluster.v1.node.Node` instance."},{"line_number":431,"context_line":"        :param bool ignore_missing: When set to ``False``, an exception"},{"line_number":432,"context_line":"            :class:`~openstack.exceptions.ResourceNotFound` will be raised when"},{"line_number":433,"context_line":"            the node could not be found. When set to ``True``, no exception"},{"line_number":434,"context_line":"            will be raised when attempting to delete a non-existent node."}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_236556e0","line":431,"range":{"start_line":431,"start_character":20,"end_line":431,"end_character":34},"in_reply_to":"7a5de9d1_be2f22f5","updated":"2016-01-29 03:56:22.000000000","message":"Done","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"02e6ebbd1886aa07f1cc2173007241ac66f3493f","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        if isinstance(node, _node.Node):"},{"line_number":419,"context_line":"            obj \u003d node"},{"line_number":420,"context_line":"        else:"},{"line_number":421,"context_line":"            obj \u003d self._find(_node.Node, node, ignore_missing\u003dFalse)"},{"line_number":422,"context_line":"        return obj.check(self.session, **params)"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def recover_node(self, node, **params):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a5ae5dd_11fa2243","line":421,"range":{"start_line":421,"start_character":23,"end_line":421,"end_character":28},"updated":"2016-02-03 20:37:49.000000000","message":"While this is documented similarly to how other methods like this work -- where it can take an instance of the resource or a value that correlates to one -- it is functionally very different as it\u0027s making at least two but possibly three roundtrips to the server in order to complete the operation. Does this absolutely need to do the _find call? It would seem that this should really just use something like the following\n\n    obj \u003d self._get_resource(_node.Node, node)\n    obj.check(self.session, **params)\n\nThat will work if you call check_node(a_real_node_resource) or check_node(\"a_node_id\")\n\nAdditionally, the failure that is going to occur if the _find fails is not going to be immediately clear that it\u0027s related to check_node.\n\nSo far there is no precedent for this type of operation to be occurring -- are you sure that we need it?","commit_id":"a420e41fe2a7be2b71da92a63a7e1222da60829b"},{"author":{"_account_id":15857,"name":"Xinhui Li","email":"lxinhui@vmware.com","username":"Cindia-blue"},"change_message_id":"525828db240b22c096cdad18766049bb9b8406f3","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        if isinstance(node, _node.Node):"},{"line_number":419,"context_line":"            obj \u003d node"},{"line_number":420,"context_line":"        else:"},{"line_number":421,"context_line":"            obj \u003d self._find(_node.Node, node, ignore_missing\u003dFalse)"},{"line_number":422,"context_line":"        return obj.check(self.session, **params)"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def recover_node(self, node, **params):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a5ae5dd_36a5c6b4","line":421,"range":{"start_line":421,"start_character":23,"end_line":421,"end_character":28},"in_reply_to":"5a5ae5dd_11fa2243","updated":"2016-02-04 02:07:44.000000000","message":"_get_resource will create and return the value of given type. Not like this, _find will return None and the failure will be returned and meaningful. \n\nNode check and recover are important actions for health_management purpose and irreplaceable in other ways.","commit_id":"a420e41fe2a7be2b71da92a63a7e1222da60829b"},{"author":{"_account_id":15857,"name":"Xinhui Li","email":"lxinhui@vmware.com","username":"Cindia-blue"},"change_message_id":"e3e77ee15dd03c782d791ada088a43e15c37d86d","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        if isinstance(node, _node.Node):"},{"line_number":419,"context_line":"            obj \u003d node"},{"line_number":420,"context_line":"        else:"},{"line_number":421,"context_line":"            obj \u003d self._find(_node.Node, node, ignore_missing\u003dFalse)"},{"line_number":422,"context_line":"        return obj.check(self.session, **params)"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def recover_node(self, node, **params):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a5ae5dd_5b606ba5","line":421,"range":{"start_line":421,"start_character":23,"end_line":421,"end_character":28},"in_reply_to":"5a5ae5dd_1a520dde","updated":"2016-02-05 02:20:22.000000000","message":"Okay, Brian. I will change accordingly to keep the consistency.","commit_id":"a420e41fe2a7be2b71da92a63a7e1222da60829b"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"884b9bb656060c8ff6cc4609e9dcedee5f228429","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        if isinstance(node, _node.Node):"},{"line_number":419,"context_line":"            obj \u003d node"},{"line_number":420,"context_line":"        else:"},{"line_number":421,"context_line":"            obj \u003d self._find(_node.Node, node, ignore_missing\u003dFalse)"},{"line_number":422,"context_line":"        return obj.check(self.session, **params)"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def recover_node(self, node, **params):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a5ae5dd_cb96e5ef","line":421,"range":{"start_line":421,"start_character":23,"end_line":421,"end_character":28},"in_reply_to":"5a5ae5dd_36a5c6b4","updated":"2016-02-04 15:22:47.000000000","message":"Cindia, I agree with Brian that this could be optimized as suggested. The only thing we will lose is that we cannot pass a node name. From SDK\u0027s perspective, consistency is more important than anything else.","commit_id":"a420e41fe2a7be2b71da92a63a7e1222da60829b"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"36dfab2ac894a992a151ff253c975f8799a7a96b","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        if isinstance(node, _node.Node):"},{"line_number":419,"context_line":"            obj \u003d node"},{"line_number":420,"context_line":"        else:"},{"line_number":421,"context_line":"            obj \u003d self._find(_node.Node, node, ignore_missing\u003dFalse)"},{"line_number":422,"context_line":"        return obj.check(self.session, **params)"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def recover_node(self, node, **params):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a5ae5dd_1a520dde","line":421,"range":{"start_line":421,"start_character":23,"end_line":421,"end_character":28},"in_reply_to":"5a5ae5dd_36a5c6b4","updated":"2016-02-04 14:26:03.000000000","message":"I understand that check and recover are important and irreplaceable, so it\u0027s great to add them, but the fact that they behave differently than anything else in the SDK is what I dislike about how they are added.\n\nWhile I can see a very small benefit in some cases, overall the _find hurts this change and I\u0027d prefer this was consistent with other types of methods using _get_resource.","commit_id":"a420e41fe2a7be2b71da92a63a7e1222da60829b"},{"author":{"_account_id":15857,"name":"Xinhui Li","email":"lxinhui@vmware.com","username":"Cindia-blue"},"change_message_id":"e3e77ee15dd03c782d791ada088a43e15c37d86d","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        if isinstance(node, _node.Node):"},{"line_number":419,"context_line":"            obj \u003d node"},{"line_number":420,"context_line":"        else:"},{"line_number":421,"context_line":"            obj \u003d self._find(_node.Node, node, ignore_missing\u003dFalse)"},{"line_number":422,"context_line":"        return obj.check(self.session, **params)"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def recover_node(self, node, **params):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a5ae5dd_9b182320","line":421,"range":{"start_line":421,"start_character":23,"end_line":421,"end_character":28},"in_reply_to":"5a5ae5dd_cb96e5ef","updated":"2016-02-05 02:20:22.000000000","message":"Thanks, Qiming, for the explanation.","commit_id":"a420e41fe2a7be2b71da92a63a7e1222da60829b"}],"openstack/cluster/v1/node.py":[{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"3e1357dc994987edfc0523a50043f1587ac3ba4d","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \"\"\"An action procedure for the node to check its health status."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param session: A session object used for sending request."},{"line_number":87,"context_line":"        :returns: A dictionary containing the action ID."},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        body \u003d {"},{"line_number":90,"context_line":"            \u0027check\u0027: params"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_3e51f262","line":87,"updated":"2016-01-29 02:57:59.000000000","message":"we may want to update the methods in _proxy so that the return values are always consistent. We are saying that node_check is returning None there.","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"},{"author":{"_account_id":15857,"name":"Xinhui Li","email":"lxinhui@vmware.com","username":"Cindia-blue"},"change_message_id":"13454617ae82563cc209029d8ffe7d394ebee6f7","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \"\"\"An action procedure for the node to check its health status."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param session: A session object used for sending request."},{"line_number":87,"context_line":"        :returns: A dictionary containing the action ID."},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        body \u003d {"},{"line_number":90,"context_line":"            \u0027check\u0027: params"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_83ea0a0e","line":87,"in_reply_to":"7a5de9d1_3e51f262","updated":"2016-01-29 03:56:22.000000000","message":"will do","commit_id":"4464631d222beb7c6c15d2585cfa562c9f285031"}]}
