)]}'
{"contrib/vdu/vdu/server.py":[{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"f1472131404b870e66fad14e6412d96d541285c9","unresolved":false,"context_lines":[{"line_number":704,"context_line":"            ctx \u003d context.get_admin_context()"},{"line_number":705,"context_line":"            node_obj.Node.update(ctx, obj.id, {\u0027data\u0027: obj.data})"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"    def _get_user_data_parameters(self, obj, extra\u003d{}):"},{"line_number":708,"context_line":"        \"\"\" Get jinja2 parameters from metadata[\u0027config\u0027]"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        :param obj: The node object"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_5bf9c77f","line":707,"range":{"start_line":707,"start_character":8,"end_line":707,"end_character":33},"updated":"2017-02-11 12:15:48.000000000","message":"_preprocess_user_data() ?","commit_id":"7b2cb512ad9f6e81380aa63c8a5a5025bfd8872b"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"64e0cf22f6c6fc9e96d982994e55da19d79e8337","unresolved":false,"context_lines":[{"line_number":704,"context_line":"            ctx \u003d context.get_admin_context()"},{"line_number":705,"context_line":"            node_obj.Node.update(ctx, obj.id, {\u0027data\u0027: obj.data})"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"    def _get_user_data_parameters(self, obj, extra\u003d{}):"},{"line_number":708,"context_line":"        \"\"\" Get jinja2 parameters from metadata[\u0027config\u0027]"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        :param obj: The node object"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_66698ebe","line":707,"range":{"start_line":707,"start_character":8,"end_line":707,"end_character":33},"in_reply_to":"fa31d9ce_5bf9c77f","updated":"2017-02-11 13:58:11.000000000","message":"Done","commit_id":"7b2cb512ad9f6e81380aa63c8a5a5025bfd8872b"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"f1472131404b870e66fad14e6412d96d541285c9","unresolved":false,"context_lines":[{"line_number":711,"context_line":"        :param extra: The existing parameters to be merged."},{"line_number":712,"context_line":"        :returns: jinja2 parameters to be used."},{"line_number":713,"context_line":"        \"\"\""},{"line_number":714,"context_line":"        def _to_json(astr):"},{"line_number":715,"context_line":"            try:"},{"line_number":716,"context_line":"                ret \u003d jsonutils.loads(astr)"},{"line_number":717,"context_line":"                return ret"},{"line_number":718,"context_line":"            except (ValueError, TypeError):"},{"line_number":719,"context_line":"                return astr"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        n_config \u003d obj.metadata.get(\u0027config\u0027, {})"},{"line_number":722,"context_line":"        # Load from node\u0027s metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_7bf4cb86","line":719,"range":{"start_line":714,"start_character":1,"end_line":719,"end_character":27},"updated":"2017-02-11 12:15:48.000000000","message":"this doesn\u0027t belong here ...","commit_id":"7b2cb512ad9f6e81380aa63c8a5a5025bfd8872b"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"f1472131404b870e66fad14e6412d96d541285c9","unresolved":false,"context_lines":[{"line_number":718,"context_line":"            except (ValueError, TypeError):"},{"line_number":719,"context_line":"                return astr"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        n_config \u003d obj.metadata.get(\u0027config\u0027, {})"},{"line_number":722,"context_line":"        # Load from node\u0027s metadata"},{"line_number":723,"context_line":"        extra.update(_to_json(n_config))"},{"line_number":724,"context_line":"        # Cover with cluster\u0027s metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_1b366f52","line":721,"range":{"start_line":721,"start_character":18,"end_line":721,"end_character":31},"updated":"2017-02-11 12:15:48.000000000","message":"node.metadata is always a dict, there is no point for the conversion","commit_id":"7b2cb512ad9f6e81380aa63c8a5a5025bfd8872b"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"64e0cf22f6c6fc9e96d982994e55da19d79e8337","unresolved":false,"context_lines":[{"line_number":718,"context_line":"            except (ValueError, TypeError):"},{"line_number":719,"context_line":"                return astr"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        n_config \u003d obj.metadata.get(\u0027config\u0027, {})"},{"line_number":722,"context_line":"        # Load from node\u0027s metadata"},{"line_number":723,"context_line":"        extra.update(_to_json(n_config))"},{"line_number":724,"context_line":"        # Cover with cluster\u0027s metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_8664c2e5","line":721,"range":{"start_line":721,"start_character":18,"end_line":721,"end_character":31},"in_reply_to":"fa31d9ce_1b366f52","updated":"2017-02-11 13:58:11.000000000","message":"yes, node.metadata is a dict, so what I do is to get \u0027config\u0027 key from this dict, it\u0027s correct here.","commit_id":"7b2cb512ad9f6e81380aa63c8a5a5025bfd8872b"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"f1472131404b870e66fad14e6412d96d541285c9","unresolved":false,"context_lines":[{"line_number":727,"context_line":"                user\u003dobj.user, project\u003dobj.project)"},{"line_number":728,"context_line":"            ctx \u003d context.RequestContext.from_dict(ctx_dict)"},{"line_number":729,"context_line":"            cluster \u003d cluster_obj.Cluster.get(ctx, obj.cluster_id)"},{"line_number":730,"context_line":"            c_config \u003d cluster.metadata.get(\u0027config\u0027, {})"},{"line_number":731,"context_line":"            extra.update(_to_json(c_config))"},{"line_number":732,"context_line":"        return extra"},{"line_number":733,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_fb2efbf8","line":730,"range":{"start_line":730,"start_character":23,"end_line":730,"end_character":39},"updated":"2017-02-11 12:15:48.000000000","message":"cluster.metadata can always be treated as a dict, so the next _to_json is meaningless","commit_id":"7b2cb512ad9f6e81380aa63c8a5a5025bfd8872b"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"64e0cf22f6c6fc9e96d982994e55da19d79e8337","unresolved":false,"context_lines":[{"line_number":727,"context_line":"                user\u003dobj.user, project\u003dobj.project)"},{"line_number":728,"context_line":"            ctx \u003d context.RequestContext.from_dict(ctx_dict)"},{"line_number":729,"context_line":"            cluster \u003d cluster_obj.Cluster.get(ctx, obj.cluster_id)"},{"line_number":730,"context_line":"            c_config \u003d cluster.metadata.get(\u0027config\u0027, {})"},{"line_number":731,"context_line":"            extra.update(_to_json(c_config))"},{"line_number":732,"context_line":"        return extra"},{"line_number":733,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_a66386db","line":730,"range":{"start_line":730,"start_character":23,"end_line":730,"end_character":39},"in_reply_to":"fa31d9ce_fb2efbf8","updated":"2017-02-11 13:58:11.000000000","message":"Hi Qiming, Since I talk to you before.\n\nFrom cli, we can use -M config\u003d\u0027{\"word\": \"world\"}\u0027 to pass the metadata, but the value of \u0027config\u0027 here might be a string, so I try to convert it to dict here using _to_json.","commit_id":"7b2cb512ad9f6e81380aa63c8a5a5025bfd8872b"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"f1472131404b870e66fad14e6412d96d541285c9","unresolved":false,"context_lines":[{"line_number":796,"context_line":"                # Get parameters from metadata"},{"line_number":797,"context_line":"                jj_vars \u003d self._get_user_data_parameters(obj, jj_vars)"},{"line_number":798,"context_line":"                jj_t \u003d jinja2.Template(user_data)"},{"line_number":799,"context_line":"                new_user_data \u003d jj_t.render(**jj_vars)"},{"line_number":800,"context_line":"                user_data \u003d new_user_data"},{"line_number":801,"context_line":"            except (jinja2.exceptions.UndefinedError, ValueError) as ex:"},{"line_number":802,"context_line":"                # (TODO) Handle jinja2 error, for now I just let it pass"},{"line_number":803,"context_line":"                # and use the original user_data"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_1b0d8f90","line":800,"range":{"start_line":799,"start_character":0,"end_line":800,"end_character":41},"updated":"2017-02-11 12:15:48.000000000","message":"why two lines for this logic?","commit_id":"7b2cb512ad9f6e81380aa63c8a5a5025bfd8872b"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"64e0cf22f6c6fc9e96d982994e55da19d79e8337","unresolved":false,"context_lines":[{"line_number":796,"context_line":"                # Get parameters from metadata"},{"line_number":797,"context_line":"                jj_vars \u003d self._get_user_data_parameters(obj, jj_vars)"},{"line_number":798,"context_line":"                jj_t \u003d jinja2.Template(user_data)"},{"line_number":799,"context_line":"                new_user_data \u003d jj_t.render(**jj_vars)"},{"line_number":800,"context_line":"                user_data \u003d new_user_data"},{"line_number":801,"context_line":"            except (jinja2.exceptions.UndefinedError, ValueError) as ex:"},{"line_number":802,"context_line":"                # (TODO) Handle jinja2 error, for now I just let it pass"},{"line_number":803,"context_line":"                # and use the original user_data"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_e69bbec7","line":800,"range":{"start_line":799,"start_character":0,"end_line":800,"end_character":41},"in_reply_to":"fa31d9ce_1b0d8f90","updated":"2017-02-11 13:58:11.000000000","message":"Let me think..........maybe a typo.....","commit_id":"7b2cb512ad9f6e81380aa63c8a5a5025bfd8872b"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"589d95edd1a0dce169bbfc5bd00263fe5ca0edb9","unresolved":false,"context_lines":[{"line_number":719,"context_line":"            except (ValueError, TypeError):"},{"line_number":720,"context_line":"                return astr"},{"line_number":721,"context_line":""},{"line_number":722,"context_line":"        n_config \u003d obj.metadata.get(\u0027config\u0027, {})"},{"line_number":723,"context_line":"        # Load from node\u0027s metadata"},{"line_number":724,"context_line":"        extra.update(_to_json(n_config))"},{"line_number":725,"context_line":"        # Cover with cluster\u0027s metadata"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_992f6b87","line":722,"range":{"start_line":722,"start_character":37,"end_line":722,"end_character":43},"updated":"2017-02-14 12:43:23.000000000","message":"it is hard to guarantee that the \u0027config\u0027 is a dict. Maybe in a future revision, we need to add a separate server property for  this.","commit_id":"a2730ec07d0df815a3f9519cf5d41911fb2319ba"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"055381449f1d53c284c8298c161e27738fd7c9ae","unresolved":false,"context_lines":[{"line_number":719,"context_line":"            except (ValueError, TypeError):"},{"line_number":720,"context_line":"                return astr"},{"line_number":721,"context_line":""},{"line_number":722,"context_line":"        n_config \u003d obj.metadata.get(\u0027config\u0027, {})"},{"line_number":723,"context_line":"        # Load from node\u0027s metadata"},{"line_number":724,"context_line":"        extra.update(_to_json(n_config))"},{"line_number":725,"context_line":"        # Cover with cluster\u0027s metadata"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_c514744e","line":722,"range":{"start_line":722,"start_character":37,"end_line":722,"end_character":43},"in_reply_to":"fa31d9ce_992f6b87","updated":"2017-02-15 02:56:00.000000000","message":"Yes, agree, might need to add new property to cluster/node object.","commit_id":"a2730ec07d0df815a3f9519cf5d41911fb2319ba"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"589d95edd1a0dce169bbfc5bd00263fe5ca0edb9","unresolved":false,"context_lines":[{"line_number":721,"context_line":""},{"line_number":722,"context_line":"        n_config \u003d obj.metadata.get(\u0027config\u0027, {})"},{"line_number":723,"context_line":"        # Load from node\u0027s metadata"},{"line_number":724,"context_line":"        extra.update(_to_json(n_config))"},{"line_number":725,"context_line":"        # Cover with cluster\u0027s metadata"},{"line_number":726,"context_line":"        if obj.cluster_id:"},{"line_number":727,"context_line":"            ctx_dict \u003d context.get_service_context("}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_36276ccb","line":724,"range":{"start_line":724,"start_character":14,"end_line":724,"end_character":20},"updated":"2017-02-14 12:43:23.000000000","message":"this logic is problematic. if _to_json returns a string, you cannot call update using it.","commit_id":"a2730ec07d0df815a3f9519cf5d41911fb2319ba"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"055381449f1d53c284c8298c161e27738fd7c9ae","unresolved":false,"context_lines":[{"line_number":721,"context_line":""},{"line_number":722,"context_line":"        n_config \u003d obj.metadata.get(\u0027config\u0027, {})"},{"line_number":723,"context_line":"        # Load from node\u0027s metadata"},{"line_number":724,"context_line":"        extra.update(_to_json(n_config))"},{"line_number":725,"context_line":"        # Cover with cluster\u0027s metadata"},{"line_number":726,"context_line":"        if obj.cluster_id:"},{"line_number":727,"context_line":"            ctx_dict \u003d context.get_service_context("}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_08e6a314","line":724,"range":{"start_line":724,"start_character":14,"end_line":724,"end_character":20},"in_reply_to":"fa31d9ce_36276ccb","updated":"2017-02-15 02:56:00.000000000","message":"right, will modify it.","commit_id":"a2730ec07d0df815a3f9519cf5d41911fb2319ba"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"589d95edd1a0dce169bbfc5bd00263fe5ca0edb9","unresolved":false,"context_lines":[{"line_number":722,"context_line":"        n_config \u003d obj.metadata.get(\u0027config\u0027, {})"},{"line_number":723,"context_line":"        # Load from node\u0027s metadata"},{"line_number":724,"context_line":"        extra.update(_to_json(n_config))"},{"line_number":725,"context_line":"        # Cover with cluster\u0027s metadata"},{"line_number":726,"context_line":"        if obj.cluster_id:"},{"line_number":727,"context_line":"            ctx_dict \u003d context.get_service_context("},{"line_number":728,"context_line":"                user\u003dobj.user, project\u003dobj.project)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_b6199c8a","line":725,"range":{"start_line":725,"start_character":10,"end_line":725,"end_character":20},"updated":"2017-02-14 12:43:23.000000000","message":"Check","commit_id":"a2730ec07d0df815a3f9519cf5d41911fb2319ba"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"055381449f1d53c284c8298c161e27738fd7c9ae","unresolved":false,"context_lines":[{"line_number":722,"context_line":"        n_config \u003d obj.metadata.get(\u0027config\u0027, {})"},{"line_number":723,"context_line":"        # Load from node\u0027s metadata"},{"line_number":724,"context_line":"        extra.update(_to_json(n_config))"},{"line_number":725,"context_line":"        # Cover with cluster\u0027s metadata"},{"line_number":726,"context_line":"        if obj.cluster_id:"},{"line_number":727,"context_line":"            ctx_dict \u003d context.get_service_context("},{"line_number":728,"context_line":"                user\u003dobj.user, project\u003dobj.project)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_28f1a7cd","line":725,"range":{"start_line":725,"start_character":10,"end_line":725,"end_character":20},"in_reply_to":"fa31d9ce_b6199c8a","updated":"2017-02-15 02:56:00.000000000","message":"Done","commit_id":"a2730ec07d0df815a3f9519cf5d41911fb2319ba"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"589d95edd1a0dce169bbfc5bd00263fe5ca0edb9","unresolved":false,"context_lines":[{"line_number":724,"context_line":"        extra.update(_to_json(n_config))"},{"line_number":725,"context_line":"        # Cover with cluster\u0027s metadata"},{"line_number":726,"context_line":"        if obj.cluster_id:"},{"line_number":727,"context_line":"            ctx_dict \u003d context.get_service_context("},{"line_number":728,"context_line":"                user\u003dobj.user, project\u003dobj.project)"},{"line_number":729,"context_line":"            ctx \u003d context.RequestContext.from_dict(ctx_dict)"},{"line_number":730,"context_line":"            cluster \u003d cluster_obj.Cluster.get(ctx, obj.cluster_id)"},{"line_number":731,"context_line":"            c_config \u003d cluster.metadata.get(\u0027config\u0027, {})"},{"line_number":732,"context_line":"            extra.update(_to_json(c_config))"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_5624e0c3","line":729,"range":{"start_line":727,"start_character":0,"end_line":729,"end_character":60},"updated":"2017-02-14 12:43:23.000000000","message":"this can use the new get_service_context method when rebased","commit_id":"a2730ec07d0df815a3f9519cf5d41911fb2319ba"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"055381449f1d53c284c8298c161e27738fd7c9ae","unresolved":false,"context_lines":[{"line_number":724,"context_line":"        extra.update(_to_json(n_config))"},{"line_number":725,"context_line":"        # Cover with cluster\u0027s metadata"},{"line_number":726,"context_line":"        if obj.cluster_id:"},{"line_number":727,"context_line":"            ctx_dict \u003d context.get_service_context("},{"line_number":728,"context_line":"                user\u003dobj.user, project\u003dobj.project)"},{"line_number":729,"context_line":"            ctx \u003d context.RequestContext.from_dict(ctx_dict)"},{"line_number":730,"context_line":"            cluster \u003d cluster_obj.Cluster.get(ctx, obj.cluster_id)"},{"line_number":731,"context_line":"            c_config \u003d cluster.metadata.get(\u0027config\u0027, {})"},{"line_number":732,"context_line":"            extra.update(_to_json(c_config))"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_c8a1eb47","line":729,"range":{"start_line":727,"start_character":0,"end_line":729,"end_character":60},"in_reply_to":"fa31d9ce_5624e0c3","updated":"2017-02-15 02:56:00.000000000","message":"Done","commit_id":"a2730ec07d0df815a3f9519cf5d41911fb2319ba"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"589d95edd1a0dce169bbfc5bd00263fe5ca0edb9","unresolved":false,"context_lines":[{"line_number":795,"context_line":"            # Use jinja2 to replace variables defined in user_data"},{"line_number":796,"context_line":"            try:"},{"line_number":797,"context_line":"                # Get parameters from metadata"},{"line_number":798,"context_line":"                jj_vars \u003d self._preprocess_user_data(obj, jj_vars)"},{"line_number":799,"context_line":"                jj_t \u003d jinja2.Template(user_data)"},{"line_number":800,"context_line":"                user_data \u003d jj_t.render(**jj_vars)"},{"line_number":801,"context_line":"            except (jinja2.exceptions.UndefinedError, ValueError) as ex:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_59409334","line":798,"range":{"start_line":798,"start_character":31,"end_line":798,"end_character":52},"updated":"2017-02-14 12:43:23.000000000","message":"should we move this line out of the try block? then we can be specific about the exception types we are trying to catch.","commit_id":"a2730ec07d0df815a3f9519cf5d41911fb2319ba"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"055381449f1d53c284c8298c161e27738fd7c9ae","unresolved":false,"context_lines":[{"line_number":795,"context_line":"            # Use jinja2 to replace variables defined in user_data"},{"line_number":796,"context_line":"            try:"},{"line_number":797,"context_line":"                # Get parameters from metadata"},{"line_number":798,"context_line":"                jj_vars \u003d self._preprocess_user_data(obj, jj_vars)"},{"line_number":799,"context_line":"                jj_t \u003d jinja2.Template(user_data)"},{"line_number":800,"context_line":"                user_data \u003d jj_t.render(**jj_vars)"},{"line_number":801,"context_line":"            except (jinja2.exceptions.UndefinedError, ValueError) as ex:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_a843d76a","line":798,"range":{"start_line":798,"start_character":31,"end_line":798,"end_character":52},"in_reply_to":"fa31d9ce_59409334","updated":"2017-02-15 02:56:00.000000000","message":"Done, actually ValueError is raised by jinja2 render.","commit_id":"a2730ec07d0df815a3f9519cf5d41911fb2319ba"}]}
