Skip to content

Commit 16d57e5

Browse files
authored
feat: initial custom analysis server mode (#1205)
* chore: initial custom analysis Signed-off-by: Alex Jones <[email protected]> * chore: saving the missing stuff Signed-off-by: Alex Jones <[email protected]> * chore: removed redundant error handling Signed-off-by: Alex Jones <[email protected]> * chore: missing piece of the custom analysis response Signed-off-by: Alex Jones <[email protected]> --------- Signed-off-by: Alex Jones <[email protected]> Signed-off-by: AlexsJones <[email protected]>
1 parent 3547c48 commit 16d57e5

File tree

5 files changed

+62
-11
lines changed

5 files changed

+62
-11
lines changed

go.mod

+3-2
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ require github.com/adrg/xdg v0.4.0
2929

3030
require (
3131
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc-ecosystem/gateway/v2 v2.20.0-20240406062209-1cc152efbf5c.1
32-
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go v1.3.0-20240406062209-1cc152efbf5c.3
33-
buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go v1.34.2-20240717144446-c4efcc29ff16.2
32+
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go v1.4.0-20240720172138-1b9bcd834f17.2
33+
buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go v1.34.2-20240720172138-1b9bcd834f17.2
3434
cloud.google.com/go/storage v1.43.0
3535
cloud.google.com/go/vertexai v0.7.1
3636
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0
@@ -261,3 +261,4 @@ require (
261261
// v1.2.0 is taken from github.com/open-policy-agent/opa v0.42.0
262262
// v1.2.0 incompatible with github.com/docker/docker v23.0.0-rc.1+incompatible
263263
//replace oras.land/oras-go => oras.land/oras-go v1.2.4
264+
replace github.com/docker/docker => github.com/docker/docker v27.1.1+incompatible

go.sum

+6-5
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs=
88
atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU=
99
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc-ecosystem/gateway/v2 v2.20.0-20240406062209-1cc152efbf5c.1 h1:0x36l6ETxg5YDlfFTxSR+4SpL0bwLezTCUfGdcPUN44=
1010
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc-ecosystem/gateway/v2 v2.20.0-20240406062209-1cc152efbf5c.1/go.mod h1:/n44w/baTCuEmDgCBgSxQ2GEiO7N645eKxLKbygzW4s=
11-
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go v1.3.0-20240406062209-1cc152efbf5c.3 h1:EiautHLlnNmBZdh1wFpmrSDvV4t8sucXGwV6vaE8Xuc=
1211
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go v1.3.0-20240406062209-1cc152efbf5c.3/go.mod h1:4QVX5iWdNcwSFhpXXIXwVH7qT/g9LKvxiqa0SvYJ9hE=
12+
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go v1.4.0-20240720172138-1b9bcd834f17.2 h1:/NS8lwYyuLPJqiI0q7IwqFnJeMjX0BJFmZCA7mTayjg=
13+
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go v1.4.0-20240720172138-1b9bcd834f17.2/go.mod h1:3aZ3RYlHseQY62oAtqo5Oh5XN78nogunCXJQdxB2YO0=
1314
buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go v1.34.0-20240406062209-1cc152efbf5c.1/go.mod h1:qFzoT6sNuRF9vPeDFmxd9KZ1YgU2vnnno5E5I0OUjOc=
1415
buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go v1.34.1-20240406062209-1cc152efbf5c.1/go.mod h1:qEarbrHjaZEQ5GeUH6XqSqqJMvtPwAGFpAc0nkSBzrQ=
15-
buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go v1.34.2-20240717144446-c4efcc29ff16.2 h1:INIYy743CJ4MEZu+O4by7oeC/m+a/l4HBk79FshPGBI=
16-
buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go v1.34.2-20240717144446-c4efcc29ff16.2/go.mod h1:1wq1qVxvJkTEUQsF5/XjmhQYXYhbVoLSGhKnzS3ie54=
16+
buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go v1.34.2-20240720172138-1b9bcd834f17.2 h1:IGBeVvzzeoEl0Ck0uxWXIUn8/my/ZeBvQEIaXCLteOc=
17+
buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go v1.34.2-20240720172138-1b9bcd834f17.2/go.mod h1:1wq1qVxvJkTEUQsF5/XjmhQYXYhbVoLSGhKnzS3ie54=
1718
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
1819
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
1920
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -1571,8 +1572,8 @@ github.com/docker/cli v26.1.4+incompatible h1:I8PHdc0MtxEADqYJZvhBrW9bo8gawKwwen
15711572
github.com/docker/cli v26.1.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
15721573
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
15731574
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
1574-
github.com/docker/docker v27.0.0+incompatible h1:JRugTYuelmWlW0M3jakcIadDx2HUoUO6+Tf2C5jVfwA=
1575-
github.com/docker/docker v27.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
1575+
github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY=
1576+
github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
15761577
github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo=
15771578
github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
15781579
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=

pkg/analysis/analysis.go

+14
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,14 @@ func NewAnalysis(
160160
return a, nil
161161
}
162162

163+
func (a *Analysis) CustomAnalyzersAreAvailable() bool {
164+
var customAnalyzers []custom.CustomAnalyzer
165+
if err := viper.UnmarshalKey("custom_analyzers", &customAnalyzers); err != nil {
166+
return false
167+
}
168+
return len(customAnalyzers) > 0
169+
}
170+
163171
func (a *Analysis) RunCustomAnalysis() {
164172
var customAnalyzers []custom.CustomAnalyzer
165173
if err := viper.UnmarshalKey("custom_analyzers", &customAnalyzers); err != nil {
@@ -184,6 +192,12 @@ func (a *Analysis) RunCustomAnalysis() {
184192
}
185193

186194
result, err := canClient.Run()
195+
if result.Kind == "" {
196+
// for custom analyzer name, we must use a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.',
197+
//and must start and end with an alphanumeric character (e.g. 'example.com',
198+
//regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')
199+
result.Kind = cAnalyzer.Name
200+
}
187201
if err != nil {
188202
mutex.Lock()
189203
a.Errors = append(a.Errors, fmt.Sprintf("[%s] %s", cAnalyzer.Name, err))

pkg/server/analyze.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package server
22

33
import (
4+
schemav1 "buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go/schema/v1"
45
"context"
56
json "encoding/json"
6-
7-
schemav1 "buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go/schema/v1"
87
"github.com/k8sgpt-ai/k8sgpt/pkg/analysis"
98
)
109

@@ -39,6 +38,9 @@ func (h *handler) Analyze(ctx context.Context, i *schemav1.AnalyzeRequest) (
3938
}
4039
defer config.Close()
4140

41+
if config.CustomAnalyzersAreAvailable() {
42+
config.RunCustomAnalysis()
43+
}
4244
config.RunAnalysis()
4345

4446
if i.Explain {

pkg/server/config.go

+35-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package server
22

33
import (
4-
"context"
5-
64
schemav1 "buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go/schema/v1"
5+
"context"
76
"github.com/k8sgpt-ai/k8sgpt/pkg/cache"
7+
"github.com/k8sgpt-ai/k8sgpt/pkg/custom"
8+
"github.com/spf13/viper"
89
"google.golang.org/grpc/codes"
910
"google.golang.org/grpc/status"
1011
)
@@ -27,6 +28,38 @@ func (h *handler) AddConfig(ctx context.Context, i *schemav1.AddConfigRequest) (
2728
return resp, err
2829
}
2930

31+
if i.CustomAnalyzers != nil {
32+
// We need to add the custom analyzers to the viper config and save them
33+
var customAnalyzers = make([]custom.CustomAnalyzer, 0)
34+
if err := viper.UnmarshalKey("custom_analyzers", &customAnalyzers); err != nil {
35+
return resp, err
36+
} else {
37+
// If there are analyzers are already in the config we will append the ones with new names
38+
for _, ca := range i.CustomAnalyzers {
39+
exists := false
40+
for _, c := range customAnalyzers {
41+
if c.Name == ca.Name {
42+
exists = true
43+
break
44+
}
45+
}
46+
if !exists {
47+
customAnalyzers = append(customAnalyzers, custom.CustomAnalyzer{
48+
Name: ca.Name,
49+
Connection: custom.Connection{
50+
Url: ca.Connection.Url,
51+
Port: ca.Connection.Port,
52+
},
53+
})
54+
}
55+
}
56+
// save the config
57+
viper.Set("custom_analyzers", customAnalyzers)
58+
if err := viper.WriteConfig(); err != nil {
59+
return resp, err
60+
}
61+
}
62+
}
3063
if i.Cache != nil {
3164
var err error
3265
var remoteCache cache.CacheProvider

0 commit comments

Comments
 (0)