Skip to content

Commit e6f0741

Browse files
committed
[Feature] [Platform] Install multi type support
1 parent b690631 commit e6f0741

File tree

16 files changed

+441
-92
lines changed

16 files changed

+441
-92
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ kustomize_test/
1919
tools/codegen/boilerplate.go.txt
2020

2121
.checksum.code
22-
.checksum.mod
22+
.checksum.mod
23+
24+
cache/

docs/platform.install.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
---
2+
layout: page
3+
parent: ArangoDBPlatform
4+
title: Platform Installation File Schema
5+
---
6+
7+
# Installation Definition
8+
9+
## Example
10+
11+
```yaml
12+
packages:
13+
nginx: # OCI
14+
chart: "oci://ghcr.io/nginx/charts/nginx-ingress:2.3.1"
15+
version: 2.3.1
16+
prometheus: # Helm Index
17+
chart: "index://prometheus-community.github.io/helm-charts"
18+
version: 1.3.1
19+
alertmanager: # Remote Chart
20+
chart: "https://github.com/prometheus-community/helm-charts/releases/download/alertmanager-0.1.0/alertmanager-0.1.0.tgz"
21+
version: "0.1.0"
22+
local: # Local File
23+
chart: "file:///tmp/local-0.1.0.tgz"
24+
version: "0.1.0"
25+
inline: # Inline
26+
chart: "<base64 string>"
27+
version: "0.2.5"
28+
platform: # Platform LicenseManager
29+
version: v3.0.11
30+
```
31+
32+
## Package
33+
34+
### .package.packages.\<string\>.chart
35+
36+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.3.1/pkg/util/k8sutil/helm/package.go#L87)</sup>
37+
38+
Chart defines override of the PackageSpec
39+
It supports multiple modes:
40+
- If undefined, LicenseManager OCI Repository is used
41+
- If starts with `file://` chart is fetched from local FileSystem
42+
- If starts with `http://` or `https://` chart is fetched from the remote URL
43+
- If starts with `index://` chart is fetched using Helm YAML Index File stricture (using version and name)
44+
- If Starts with `oci://` chart is fetched from Registry Compatible OCI Repository
45+
- If none above match, chart is decoded using Base64 encoding
46+
47+
***
48+
49+
### .package.packages.\<string\>.overrides
50+
51+
Type: `array` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.3.1/pkg/util/k8sutil/helm/package.go#L90)</sup>
52+
53+
Overrides defines Values to override the Helm Chart Defaults (merged with Service Overrides)
54+
55+
***
56+
57+
### .package.packages.\<string\>.stage
58+
59+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.3.1/pkg/util/k8sutil/helm/package.go#L74)</sup>
60+
61+
Stage defines stage used in the fetch from LicenseManager
62+
63+
***
64+
65+
### .package.packages.\<string\>.version
66+
67+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.3.1/pkg/util/k8sutil/helm/package.go#L77)</sup>
68+
69+
Version keeps the version of the PackageSpec
70+
71+
***
72+
73+
### .package.releases.\<string\>.overrides
74+
75+
Type: `array` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.3.1/pkg/util/k8sutil/helm/package.go#L169)</sup>
76+
77+
Overrides defines Values to override the Helm Chart Defaults during installation
78+
79+
***
80+
81+
### .package.releases.\<string\>.package
82+
83+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.3.1/pkg/util/k8sutil/helm/package.go#L166)</sup>
84+
85+
Package keeps the name of the Chart used from the installation script.
86+
References to value provided in Packages
87+

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ require (
5353
github.com/prometheus/prom2json v1.3.3
5454
github.com/robfig/cron v1.2.0
5555
github.com/rs/zerolog v1.33.0
56-
github.com/spf13/cobra v1.9.1
57-
github.com/spf13/pflag v1.0.6
56+
github.com/spf13/cobra v1.10.1
57+
github.com/spf13/pflag v1.0.10
5858
github.com/stretchr/testify v1.10.0
5959
golang.org/x/sync v0.17.0
60-
golang.org/x/sys v0.37.0
60+
golang.org/x/sys v0.38.0
6161
golang.org/x/text v0.30.0
6262
golang.org/x/time v0.11.0
6363
google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8
@@ -84,7 +84,7 @@ require (
8484
github.com/golang-jwt/jwt/v5 v5.2.2
8585
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1
8686
github.com/jedib0t/go-pretty/v6 v6.6.5
87-
github.com/regclient/regclient v0.8.3
87+
github.com/regclient/regclient v0.10.0
8888
golang.org/x/oauth2 v0.30.0
8989
google.golang.org/api v0.235.0
9090
google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b
@@ -181,7 +181,7 @@ require (
181181
github.com/josharian/intern v1.0.0 // indirect
182182
github.com/json-iterator/go v1.1.12 // indirect
183183
github.com/kkdai/maglev v0.2.0 // indirect
184-
github.com/klauspost/compress v1.18.0 // indirect
184+
github.com/klauspost/compress v1.18.1 // indirect
185185
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
186186
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
187187
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
@@ -223,7 +223,7 @@ require (
223223
github.com/stretchr/objx v0.5.2 // indirect
224224
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
225225
github.com/ugorji/go/codec v1.2.11 // indirect
226-
github.com/ulikunitz/xz v0.5.12 // indirect
226+
github.com/ulikunitz/xz v0.5.15 // indirect
227227
github.com/x448/float16 v0.8.4 // indirect
228228
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
229229
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect

go.sum

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,8 @@ github.com/kkdai/maglev v0.2.0 h1:w6DCW0kAA6fstZqXkrBrlgIC3jeIRXkjOYea/m6EK/Y=
328328
github.com/kkdai/maglev v0.2.0/go.mod h1:d+mt8Lmt3uqi9aRb/BnPjzD0fy+ETs1vVXiGRnqHVZ4=
329329
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
330330
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
331+
github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co=
332+
github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0=
331333
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
332334
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
333335
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
@@ -456,6 +458,8 @@ github.com/prometheus/prom2json v1.3.3 h1:IYfSMiZ7sSOfliBoo89PcufjWO4eAR0gznGcET
456458
github.com/prometheus/prom2json v1.3.3/go.mod h1:Pv4yIPktEkK7btWsrUTWDDDrnpUrAELaOCj+oFwlgmc=
457459
github.com/regclient/regclient v0.8.3 h1:AFAPu/vmOYGyY22AIgzdBUKbzH+83lEpRioRYJ/reCs=
458460
github.com/regclient/regclient v0.8.3/go.mod h1:gjQh5uBVZoo/CngchghtQh9Hx81HOMKRRDd5WPcPkbk=
461+
github.com/regclient/regclient v0.10.0 h1:V+mbcd/PBwQkd89M2KAPAAC1qMyrw9f5BKvCtPgw/C8=
462+
github.com/regclient/regclient v0.10.0/go.mod h1:fDYvRK2yFUE7pyEXKj+jKzTAtuwXsGQ6Tr0KPvxwP00=
459463
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
460464
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
461465
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
@@ -480,8 +484,13 @@ github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
480484
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
481485
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
482486
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
487+
github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
488+
github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
483489
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
484490
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
491+
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
492+
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
493+
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
485494
github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=
486495
github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=
487496
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -496,6 +505,8 @@ github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4d
496505
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
497506
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
498507
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
508+
github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY=
509+
github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
499510
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
500511
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
501512
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
@@ -588,6 +599,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
588599
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
589600
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
590601
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
602+
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
603+
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
591604
golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q=
592605
golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
593606
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

internal/docs_test.go

Lines changed: 77 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ package internal
2222

2323
import (
2424
"bufio"
25-
"bytes"
2625
"fmt"
2726
"go/ast"
2827
"go/token"
@@ -51,16 +50,15 @@ import (
5150
schedulerApi "github.com/arangodb/kube-arangodb/pkg/apis/scheduler/v1beta1"
5251
storageApi "github.com/arangodb/kube-arangodb/pkg/apis/storage/v1alpha"
5352
"github.com/arangodb/kube-arangodb/pkg/util"
53+
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil/helm"
5454
)
5555

5656
const (
5757
// title of docs/api/README.md page
5858
apiIndexPageTitle = "CRD reference"
5959
)
6060

61-
func (d DocDefinitions) RenderMarkdown(t *testing.T, repositoryPath string) []byte {
62-
out := bytes.NewBuffer(nil)
63-
61+
func (d DocDefinitions) RenderMarkdown(t *testing.T, out io.Writer, repositoryPath string) {
6462
els := 0
6563

6664
for _, el := range d {
@@ -189,8 +187,55 @@ func (d DocDefinitions) RenderMarkdown(t *testing.T, repositoryPath string) []by
189187
}
190188
}
191189
}
190+
}
191+
192+
func Test_GenerateSecondaryAPIDocs(t *testing.T) {
193+
root := os.Getenv("ROOT")
194+
require.NotEmpty(t, root)
195+
196+
fset := token.NewFileSet()
197+
198+
fields := parseSourceFiles(t, root, fset, path.Join(root, "pkg/util/k8sutil/helm"))
192199

193-
return out.Bytes()
200+
out, err := os.OpenFile(path.Join(root, "docs/platform.install.md"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
201+
require.NoError(t, err)
202+
203+
defer func() {
204+
require.NoError(t, out.Close())
205+
}()
206+
207+
writeFrontMatter(t, out, map[string]string{
208+
"layout": "page",
209+
"title": "Platform Installation File Schema",
210+
"parent": "ArangoDBPlatform",
211+
})
212+
writef(t, out, "# Installation Definition\n\n")
213+
writef(t, out, "## Example\n\n")
214+
writef(t, out, "```yaml\n")
215+
writef(t, out, `packages:
216+
nginx: # OCI
217+
chart: "oci://ghcr.io/nginx/charts/nginx-ingress:2.3.1"
218+
version: 2.3.1
219+
prometheus: # Helm Index
220+
chart: "index://prometheus-community.github.io/helm-charts"
221+
version: 1.3.1
222+
alertmanager: # Remote Chart
223+
chart: "https://github.com/prometheus-community/helm-charts/releases/download/alertmanager-0.1.0/alertmanager-0.1.0.tgz"
224+
version: "0.1.0"
225+
local: # Local File
226+
chart: "file:///tmp/local-0.1.0.tgz"
227+
version: "0.1.0"
228+
inline: # Inline
229+
chart: "<base64 string>"
230+
version: "0.2.5"
231+
platform: # Platform LicenseManager
232+
version: v3.0.11
233+
`)
234+
writef(t, out, "```\n\n")
235+
236+
generateDocsOut(t, "Package", map[string]interface{}{
237+
"Package": helm.Package{},
238+
}, fields, fset, out)
194239
}
195240

196241
func Test_GenerateAPIDocs(t *testing.T) {
@@ -503,59 +548,59 @@ func prepareGitHubTreePath(t *testing.T, root string) string {
503548
return fmt.Sprintf("https://github.com/arangodb/kube-arangodb/blob/%s", ref)
504549
}
505550

506-
func generateDocs(t *testing.T, objects map[string]map[string]interface{}, fields map[string]*ast.Field, fs *token.FileSet) map[string]string {
551+
func generateDocsOut(t *testing.T, objectName string, sections map[string]interface{}, fields map[string]*ast.Field, fs *token.FileSet, out io.Writer) {
507552
root := os.Getenv("ROOT")
508553
require.NotEmpty(t, root)
509554

510-
outPaths := make(map[string]string)
511-
512555
repositoryPath := prepareGitHubTreePath(t, root)
513556

514-
for objectName, sections := range objects {
515-
t.Run(objectName, func(t *testing.T) {
516-
renderSections := map[string][]byte{}
517-
for section, fieldInstance := range sections {
518-
t.Run(section, func(t *testing.T) {
557+
t.Run(objectName, func(t *testing.T) {
558+
for _, section := range util.SortKeys(sections) {
559+
writef(t, out, "## %s\n\n", util.BoolSwitch(section == "", "Object", section))
519560

520-
sectionParsed := iterateOverObject(t, fields, "", goStrings.ToLower(section), reflect.TypeOf(fieldInstance), "")
561+
t.Run(section, func(t *testing.T) {
562+
fieldInstance := sections[section]
521563

522-
defs := make(DocDefinitions, 0, len(sectionParsed))
523-
for _, el := range sectionParsed {
524-
defs = append(defs, parseDocDefinition(t, root, cleanPrefixPath(el.K.path), el.K.typ, el.K, el.V, fs))
525-
}
526-
defs.Sort()
564+
sectionParsed := iterateOverObject(t, fields, "", goStrings.ToLower(section), reflect.TypeOf(fieldInstance), "")
527565

528-
renderSections[section] = defs.RenderMarkdown(t, repositoryPath)
529-
})
530-
}
566+
defs := make(DocDefinitions, 0, len(sectionParsed))
567+
for _, el := range sectionParsed {
568+
defs = append(defs, parseDocDefinition(t, root, cleanPrefixPath(el.K.path), el.K.typ, el.K, el.V, fs))
569+
}
570+
defs.Sort()
571+
572+
defs.RenderMarkdown(t, out, repositoryPath)
573+
})
574+
}
575+
})
576+
}
531577

532-
fileName := fmt.Sprintf("%s.md", objectName)
533-
outPaths[objectName] = fileName
578+
func generateDocs(t *testing.T, objects map[string]map[string]interface{}, fields map[string]*ast.Field, fs *token.FileSet) {
579+
root := os.Getenv("ROOT")
580+
require.NotEmpty(t, root)
581+
582+
for objectName, sections := range objects {
583+
t.Run(objectName, func(t *testing.T) {
534584
outPath := path.Join(root, "docs/api", fmt.Sprintf("%s.md", objectName))
535-
out, err := os.OpenFile(outPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
585+
out, err := os.OpenFile(outPath, os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0644)
536586
require.NoError(t, err)
537587

538588
defer func() {
539589
require.NoError(t, out.Close())
540590
}()
541591

542592
objName := goStrings.ReplaceAll(objectName, ".", " ")
593+
543594
writeFrontMatter(t, out, map[string]string{
544595
"layout": "page",
545596
"title": objName,
546597
"parent": apiIndexPageTitle,
547598
})
548599
writef(t, out, "# API Reference for %s\n\n", objName)
549600

550-
util.IterateSorted(renderSections, func(name string, section []byte) {
551-
writef(t, out, "## %s\n\n", util.BoolSwitch(name == "", "Object", name))
552-
553-
_, err = out.Write(section)
554-
require.NoError(t, err)
555-
})
601+
generateDocsOut(t, objectName, sections, fields, fs, out)
556602
})
557603
}
558-
return outPaths
559604
}
560605

561606
func write(t *testing.T, out io.Writer, format string) {

pkg/license_manager/client.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ func NewClientFromConn(conn driver.Connection) Client {
7474
}
7575

7676
type Client interface {
77+
Identity(ctx context.Context) (Identity, error)
78+
7779
License(ctx context.Context, req LicenseRequest) (LicenseResponse, error)
7880

7981
Registry(ctx context.Context) (RegistryResponse, error)
@@ -92,6 +94,9 @@ type LicenseResponse struct {
9294
Expires *ugrpc.Object[*timestamppb.Timestamp] `json:"expires,omitempty"`
9395
}
9496

97+
type Identity struct {
98+
}
99+
95100
type RegistryResponse struct {
96101
Token string `json:"token"`
97102
}
@@ -100,6 +105,10 @@ type client struct {
100105
conn driver.Connection
101106
}
102107

108+
func (c client) Identity(ctx context.Context) (Identity, error) {
109+
return arangod.GetRequest[Identity](ctx, c.conn, "_api", "v1", "identity").AcceptCode(200).Response()
110+
}
111+
103112
func (c client) RegistryConfig(ctx context.Context, endpoint, id string, token *string, stages ...Stage) ([]byte, error) {
104113
var t string
105114

pkg/platform/pack/cache.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
"path"
3030
"sync"
3131

32-
"github.com/pkg/errors"
32+
"github.com/arangodb/kube-arangodb/pkg/util/errors"
3333
)
3434

3535
func NewCache(path string) Cache {

0 commit comments

Comments
 (0)