mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
CloudMigrations: replace slicesext.Chunk with stdlib implementation (#93743)
This commit is contained in:
parent
5880579be8
commit
1e720306dd
@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"slices"
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -13,7 +14,6 @@ import (
|
|||||||
"github.com/grafana/grafana-cloud-migration-snapshot/src/contracts"
|
"github.com/grafana/grafana-cloud-migration-snapshot/src/contracts"
|
||||||
"github.com/grafana/grafana-cloud-migration-snapshot/src/infra/crypto"
|
"github.com/grafana/grafana-cloud-migration-snapshot/src/infra/crypto"
|
||||||
"github.com/grafana/grafana/pkg/services/cloudmigration"
|
"github.com/grafana/grafana/pkg/services/cloudmigration"
|
||||||
"github.com/grafana/grafana/pkg/services/cloudmigration/slicesext"
|
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
"github.com/grafana/grafana/pkg/services/datasources"
|
"github.com/grafana/grafana/pkg/services/datasources"
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||||
@ -230,7 +230,7 @@ func (s *Service) buildSnapshot(ctx context.Context, signedInUser *user.SignedIn
|
|||||||
cloudmigration.FolderDataType,
|
cloudmigration.FolderDataType,
|
||||||
cloudmigration.DashboardDataType,
|
cloudmigration.DashboardDataType,
|
||||||
} {
|
} {
|
||||||
for _, chunk := range slicesext.Chunks(int(maxItemsPerPartition), resourcesGroupedByType[resourceType]) {
|
for chunk := range slices.Chunk(resourcesGroupedByType[resourceType], int(maxItemsPerPartition)) {
|
||||||
if err := snapshotWriter.Write(string(resourceType), chunk); err != nil {
|
if err := snapshotWriter.Write(string(resourceType), chunk); err != nil {
|
||||||
return fmt.Errorf("writing resources to snapshot writer: resourceType=%s %w", resourceType, err)
|
return fmt.Errorf("writing resources to snapshot writer: resourceType=%s %w", resourceType, err)
|
||||||
}
|
}
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
package slicesext
|
|
||||||
|
|
||||||
import "math"
|
|
||||||
|
|
||||||
// Partitions the input into slices where the length is <= chunkSize.
|
|
||||||
//
|
|
||||||
// Example:
|
|
||||||
//
|
|
||||||
// Chunks(2, []int{1, 2, 3, 4})
|
|
||||||
// => [][]int{{1, 2}, {3, 4}}
|
|
||||||
func Chunks[T any](chunkSize int, xs []T) [][]T {
|
|
||||||
if chunkSize < 0 {
|
|
||||||
panic("chunk size must be greater than or equal to 0")
|
|
||||||
}
|
|
||||||
if chunkSize == 0 {
|
|
||||||
return [][]T{}
|
|
||||||
}
|
|
||||||
|
|
||||||
out := make([][]T, 0, int(math.Ceil(float64(len(xs))/float64(chunkSize))))
|
|
||||||
|
|
||||||
for i := 0; i < len(xs); i += chunkSize {
|
|
||||||
var chunk []T
|
|
||||||
if i+chunkSize < len(xs) {
|
|
||||||
chunk = xs[i : i+chunkSize]
|
|
||||||
} else {
|
|
||||||
chunk = xs[i:]
|
|
||||||
}
|
|
||||||
|
|
||||||
out = append(out, chunk)
|
|
||||||
}
|
|
||||||
|
|
||||||
return out
|
|
||||||
}
|
|
@ -1,80 +0,0 @@
|
|||||||
package slicesext
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestChunks(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
t.Run("chunkSize must be greater than 0", func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
assert.PanicsWithValue(t, "chunk size must be greater than or equal to 0", func() {
|
|
||||||
Chunks(-1, []string{})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("basic", func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
cases := []struct {
|
|
||||||
description string
|
|
||||||
chunkSize int
|
|
||||||
input []int
|
|
||||||
expected [][]int
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
description: "empty slice",
|
|
||||||
chunkSize: 2,
|
|
||||||
input: []int{},
|
|
||||||
expected: [][]int{},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "nil slice",
|
|
||||||
chunkSize: 2,
|
|
||||||
input: nil,
|
|
||||||
expected: [][]int{},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "chunk size is 0",
|
|
||||||
chunkSize: 0,
|
|
||||||
input: []int{1, 2, 3},
|
|
||||||
expected: [][]int{},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "chunk size is greater than slice length",
|
|
||||||
chunkSize: 3,
|
|
||||||
input: []int{1},
|
|
||||||
expected: [][]int{{1}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "chunk size is 1",
|
|
||||||
chunkSize: 1,
|
|
||||||
input: []int{1, 2, 3},
|
|
||||||
expected: [][]int{{1}, {2}, {3}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "chunk size is 2 and slice length is 3",
|
|
||||||
chunkSize: 2,
|
|
||||||
input: []int{1, 2, 3},
|
|
||||||
expected: [][]int{{1, 2}, {3}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "chunk size is 2 and slice length is 6",
|
|
||||||
chunkSize: 2,
|
|
||||||
input: []int{1, 2, 3, 4, 5, 6},
|
|
||||||
expected: [][]int{{1, 2}, {3, 4}, {5, 6}},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range cases {
|
|
||||||
t.Run(tt.description, func(t *testing.T) {
|
|
||||||
result := Chunks(tt.chunkSize, tt.input)
|
|
||||||
assert.Equal(t, tt.expected, result)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user