This commit is contained in:
Ryan McKinley
2025-11-25 09:42:06 +03:00
parent ede756f5a8
commit 1265bcffcf
@@ -2,7 +2,9 @@ package correlations
import ( import (
"context" "context"
b64 "encoding/base64"
"fmt" "fmt"
"strconv"
"strings" "strings"
"k8s.io/apimachinery/pkg/apis/meta/internalversion" "k8s.io/apimachinery/pkg/apis/meta/internalversion"
@@ -78,27 +80,47 @@ func (s *legacyStorage) List(ctx context.Context, options *internalversion.ListO
} }
} }
if options.Continue != "" { page := int64(0)
return nil, fmt.Errorf("paging not yet supported") limit := int64(100000)
if options != nil {
if options.Limit > 0 {
limit = options.Limit
}
if options.Continue != "" {
token, err := decodeContinueToken(options.Continue)
if err != nil {
return nil, err
}
if token.Limit != limit {
return nil, fmt.Errorf("continue token limit does not match the previous request")
}
page = token.Page
}
} }
rsp, err := s.service.GetCorrelations(ctx, correlations.GetCorrelationsQuery{ rsp, err := s.service.GetCorrelations(ctx, correlations.GetCorrelationsQuery{
OrgId: orgID, OrgId: orgID,
Limit: 1000, Limit: limit + 1,
Page: page,
SourceUIDs: uids, SourceUIDs: uids,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
} }
list := &correlationsV0.CorrelationList{ list := &correlationsV0.CorrelationList{
Items: make([]correlationsV0.Correlation, len(rsp.Correlations)), Items: make([]correlationsV0.Correlation, 0, len(rsp.Correlations)),
} }
for i, orig := range rsp.Correlations { for i, orig := range rsp.Correlations {
if i >= int(limit) {
list.Continue = encodeContinueToken(page+1, limit)
break
}
c, err := correlations.ToResource(orig, s.namespacer) c, err := correlations.ToResource(orig, s.namespacer)
if err != nil { if err != nil {
return nil, err return nil, err
} }
list.Items[i] = *c list.Items = append(list.Items, *c)
} }
return list, nil return list, nil
} }
@@ -193,3 +215,33 @@ func (s *legacyStorage) Delete(ctx context.Context, name string, deleteValidatio
func (s *legacyStorage) DeleteCollection(ctx context.Context, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions, listOptions *internalversion.ListOptions) (runtime.Object, error) { func (s *legacyStorage) DeleteCollection(ctx context.Context, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions, listOptions *internalversion.ListOptions) (runtime.Object, error) {
return nil, fmt.Errorf("DeleteCollection for shorturl not implemented") return nil, fmt.Errorf("DeleteCollection for shorturl not implemented")
} }
type continueToken struct {
Page int64
Limit int64
}
func encodeContinueToken(page, limit int64) string {
data := fmt.Sprintf("%d/%d", page, limit)
return b64.StdEncoding.EncodeToString([]byte(data)) // use base64 so it is not treated like query params
}
func decodeContinueToken(s string) (token continueToken, err error) {
decoded, err := b64.StdEncoding.DecodeString(s)
if err != nil {
return token, fmt.Errorf("invalid continue token")
}
parts := strings.Split(string(decoded), "/")
if len(parts) != 2 {
return token, fmt.Errorf("invalid continue token")
}
token.Page, err = strconv.ParseInt(parts[0], 10, 64)
if err != nil {
return token, fmt.Errorf("invalid continue token (page)")
}
token.Limit, err = strconv.ParseInt(parts[1], 10, 64)
if err != nil {
return token, fmt.Errorf("invalid continue token")
}
return token, nil
}