Grafeas golang 过滤器字符串和 DeleteOccurrence() API 错误

Grafeas golang filter string and DeleteOccurrence() API errors

我 运行 使用 Grafeas golang v1beta1 API.

分为 2 个不同的问题

我正在尝试做什么

第 1 期

我正在尝试使用此 GCP reference grafeas golang 代码作为指南来设置过滤器字段。

filterStr := fmt.Sprintf(`kind=%q`, grafeas_common_proto.NoteKind_BUILD.String())
listReq := &grafeas_proto.ListOccurrencesRequest{
    Parent:   BuildProject,
    Filter:   filterStr,
    PageSize: 100,
}

listOccResp, err := r.grafeasCommon.ListOccurrences(ctx, listReq)
for {
        if err != nil {
            log.Error("failed to iterate over occurrences", zap.NamedError("error", err))
            return nil, err
        }
        ...

但看起来我的 filterStr 无效,这是错误:

filterStr       {"filterStr": "kind=\"BUILD\""}
failed to iterate over occurrences      {"error": "rpc error: code = Internal desc = error while parsing filter expression: 4 errors occurred:\n\t* error parsing filter\n\t* Syntax error: token recognition error at: '=\"' (1:4)\n\t* Syntax error: token recognition error at: '\"' (1:11)\n\t* Syntax error: extraneous input 'BUILD' expecting <EOF> (1:6)\n\n"}

看起来 \ 转义字符引起了麻烦,但我在没有它的情况下尝试过,并得到了另一种相同类型的错误。

第 2 期

当我调用 DeleteOccurrence() 时,我可以通过检查看到事件实际上已从 Grafeas 中删除:

curl http://localhost:8080/v1beta1/projects/broker_builds/occurrences

但是 DeleteOccurrence() 总是设置 err

代码:

    for _, o := range occToDelete {
        log.Info("occToDelete", zap.String("occurrence", o))
        _, err := r.grafeasCommon.DeleteOccurrence(ctx, &grafeas_proto.DeleteOccurrenceRequest{
            Name: o,
        })
        if err != nil {
            log.Error("failed to delete occurrence", zap.String("occurrence", o), zap.NamedError("error", err))
        }
    }

错误:

failed to delete occurrence     {"occurrence": "projects/broker_builds/occurrences/f61a4c57-a3d3-44a9-86ee-5d58cb6c6052", "error": "rpc error: code = Internal desc = grpc: error while marshaling: proto: Marshal called with nil"}

我不明白错误指的是什么。

此问题已在 Grafeas message board 上交叉发布。

感谢任何帮助。谢谢。

您能否透露一些有关所用存储引擎的详细信息,以及过滤实现的详细信息?

问题 1. gitHub.com/grafeas/grafeas.

中的任何存储引擎都没有实现过滤

问题 2。这取决于您使用的存储,memstore/embededstore 似乎没有产生与您提到的类似的任何错误...如果使用 postgresql 存储,您是否尝试删除两次?

问题 #1 的解决方案

我使用 grafeas-elasticsearch 作为存储后端。它使用与我在原始 post.

中看到的示例不同的过滤器字符串格式

例如,代替 = -> ==AND -> &&

更多例子可以在这里看到: https://github.com/rode/grafeas-elasticsearch/blob/main/test/v1beta1/occurrence_test.go#L226

问题 #2 的解决方案

grafeas 的已知问题

https://github.com/grafeas/grafeas/pull/456

https://github.com/grafeas/grafeas/pull/468

遗憾的是,最新标记的 grafeas v0.1.6 版本尚未包含这些修复。因此需要在下一个版本中选择它们。

感谢@Ovidiu Ghinet,这是一个很好的提示