Skip to content

Commit

Permalink
Updates
Browse files Browse the repository at this point in the history
  • Loading branch information
MeNsaaH committed Jan 10, 2024
1 parent 7d5cc21 commit 1aa76be
Show file tree
Hide file tree
Showing 10 changed files with 95 additions and 32 deletions.
5 changes: 2 additions & 3 deletions Earthfile
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ build-debug-binary:
SAVE ARTIFACT kubechecks

docker:
ARG --required IMAGE_NAME
ARG TARGETPLATFORM
ARG TARGETARCH
ARG TARGETVARIANT
Expand Down Expand Up @@ -127,7 +126,7 @@ docker:
RUN ./kubechecks help

CMD ["./kubechecks", "controller"]

ARG --required IMAGE_NAME
SAVE IMAGE --push $IMAGE_NAME

dlv:
Expand All @@ -139,14 +138,14 @@ dlv:
SAVE ARTIFACT /go/bin/dlv

docker-debug:
ARG IMAGE_NAME="kubechecks:debug"
FROM +docker --GIT_TAG=debug --GIT_COMMIT=abcdef

COPY (+dlv/dlv --GOARCH=$GOARCH --VARIANT=$TARGETVARIANT) /usr/local/bin/dlv
COPY (+build-debug-binary/kubechecks --GOARCH=$GOARCH --VARIANT=$TARGETVARIANT) .

CMD ["/usr/local/bin/dlv", "--listen=:2345", "--api-version=2", "--headless=true", "--accept-multiclient", "exec", "--continue", "./kubechecks", "controller"]

ARG IMAGE_NAME="kubechecks:debug"
SAVE IMAGE --push $IMAGE_NAME

fmt-golang:
Expand Down
8 changes: 4 additions & 4 deletions Tiltfile
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,10 @@ k8s_yaml(helm(
name='kubechecks',
values='./localdev/kubechecks/values.yaml',
set=[
'deployment.env[0].name=KUBECHECKS_WEBHOOK_URL_BASE', 'deployment.env[0].value=' + get_ngrok_url(cfg),
'deployment.env[1].name=NGROK_URL', 'deployment.env[1].value=' + get_ngrok_url(cfg),
'deployment.env[2].name=KUBECHECKS_ARGOCD_WEBHOOK_URL', 'deployment.env[2].value=' + get_ngrok_url(cfg) +'/argocd/api/webhook',
'deployment.env[3].name=KUBECHECKS_VCS_TYPE', 'deployment.env[3].value=' + cfg.get('vcs-type', 'gitlab'),
'deployment.env[15].name=KUBECHECKS_WEBHOOK_URL_BASE', 'deployment.env[15].value=' + get_ngrok_url(cfg),
'deployment.env[16].name=NGROK_URL', 'deployment.env[16].value=' + get_ngrok_url(cfg),
'deployment.env[17].name=KUBECHECKS_ARGOCD_WEBHOOK_URL', 'deployment.env[17].value=' + get_ngrok_url(cfg) +'/argocd/api/webhook',
'deployment.env[18].name=KUBECHECKS_VCS_TYPE', 'deployment.env[18].value=' + cfg.get('vcs-type', 'gitlab'),
'secrets.env.KUBECHECKS_VCS_TOKEN=' + (os.getenv('GITLAB_TOKEN') if 'gitlab' in cfg.get('vcs-type', 'gitlab') else os.getenv('GITHUB_TOKEN')),
'secrets.env.KUBECHECKS_WEBHOOK_SECRET=' + (os.getenv('KUBECHECKS_WEBHOOK_SECRET') if os.getenv('KUBECHECKS_WEBHOOK_SECRET') != None else ""),
'secrets.env.KUBECHECKS_OPENAI_API_TOKEN=' + (os.getenv('OPENAI_API_TOKEN') if os.getenv('OPENAI_API_TOKEN') != None else ""),
Expand Down
2 changes: 1 addition & 1 deletion charts/kubechecks/templates/role.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
kind: ClusterRole
metadata:
name: {{ include "kubechecks.fullname" . }}
rules:
Expand Down
5 changes: 3 additions & 2 deletions charts/kubechecks/templates/rolebinding.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
kind: ClusterRoleBinding
metadata:
name: {{ include "kubechecks.fullname" . }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
kind: ClusterRole
name: {{ include "kubechecks.fullname" . }}
subjects:
- kind: ServiceAccount
name: {{ include "kubechecks.serviceAccountName" . }}
namespace: {{ .Release.Namespace }}
6 changes: 3 additions & 3 deletions pkg/app_watcher/appwatcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,17 +79,16 @@ func (ctrl *ApplicationWatcher) onApplicationAdded(obj interface{}) {
log.Error().Err(err).Msg("appwatcher: could not get key for added application")
}
log.Trace().Str("key", key).Msg("appwatcher: onApplicationAdded")
ctrl.cfg.VcsToArgoMap.AddApp(obj.(appv1alpha1.Application))
ctrl.cfg.VcsToArgoMap.AddApp(obj.(*appv1alpha1.Application))
}

func (ctrl *ApplicationWatcher) onApplicationUpdated(old, new interface{}) {
key, err := cache.MetaNamespaceKeyFunc(new)
if err != nil {
log.Warn().Err(err).Msg("appwatcher: could not get key for updated application")
}
// TODO
// have any of the Source repoURLs changed?
log.Trace().Str("key", key).Msg("appwatcher: onApplicationUpdated")
ctrl.cfg.VcsToArgoMap.UpdateApp(old.(*appv1alpha1.Application), new.(*appv1alpha1.Application))
}

func (ctrl *ApplicationWatcher) onApplicationDeleted(obj interface{}) {
Expand All @@ -102,6 +101,7 @@ func (ctrl *ApplicationWatcher) onApplicationDeleted(obj interface{}) {
}

log.Trace().Str("key", key).Msg("appwatcher: onApplicationDeleted")
ctrl.cfg.VcsToArgoMap.DeleteApp(obj.(*appv1alpha1.Application))
}

/*
Expand Down
1 change: 1 addition & 0 deletions pkg/argo_client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func GetArgoClient() *ArgoClient {
}

func createArgoClient() *ArgoClient {
log.Info().Bool("Argocd Insecure", viper.GetBool("argocd-api-insecure")).Msg("Vars")
clientOptions := &apiclient.ClientOptions{
ServerAddr: viper.GetString("argocd-api-server-addr"),
AuthToken: viper.GetString("argocd-api-token"),
Expand Down
33 changes: 33 additions & 0 deletions pkg/config/app_directory.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,30 @@ func (d *AppDirectory) AddFile(appName, path string) {
d.appFiles[path] = append(d.appFiles[path], appName)
}

func (d *AppDirectory) RemoveApp(app v1alpha1.Application) {
// remove app from appsMap
delete(d.appsMap, app.Name)

// Clean up app from appDirs
sourcePath := getSourcePath(app)
d.appDirs[sourcePath] = removeFromSlice[string](d.appDirs[sourcePath], app.Name, func(a, b string) bool { return a == b })

// Clean up app from appFiles
src := app.Spec.GetSource()
srcPath := src.Path
if helm := src.Helm; helm != nil {
for _, param := range helm.FileParameters {
path := filepath.Join(srcPath, param.Path)
d.appFiles[path] = removeFromSlice[string](d.appFiles[path], app.Name, func(a, b string) bool { return a == b })
}

for _, valueFilePath := range helm.ValueFiles {
path := filepath.Join(srcPath, valueFilePath)
d.appFiles[path] = removeFromSlice[string](d.appFiles[path], app.Name, func(a, b string) bool { return a == b })
}
}
}

func mergeMaps[T any](first map[string]T, second map[string]T, combine func(T, T) T) map[string]T {
result := make(map[string]T)
for key, value := range first {
Expand All @@ -186,3 +210,12 @@ func mergeLists[T any](a []T, b []T) []T {
func takeFirst[T any](a, _ T) T {
return a
}

func removeFromSlice[T any](slice []T, element T, equal func(T, T) bool) []T {
for i, j := range slice {
if equal(j, element) {
return append(slice[:i], slice[i+1:]...)
}
}
return slice
}
27 changes: 25 additions & 2 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,37 @@ func NormalizeRepoUrl(s string) (RepoURL, error) {
return buildNormalizedRepoUrl(r.Host, r.Path), nil
}

func (v2a *VcsToArgoMap) AddApp(app v1alpha1.Application) {
func (v2a *VcsToArgoMap) AddApp(app *v1alpha1.Application) {
if app.Spec.Source == nil {
log.Warn().Msgf("%s/%s: no source, skipping", app.Namespace, app.Name)
return
}

appDirectory := v2a.GetAppsInRepo(app.Spec.Source.RepoURL)
appDirectory.ProcessApp(app)
appDirectory.ProcessApp(*app)
}

func (v2a *VcsToArgoMap) UpdateApp(old *v1alpha1.Application, new *v1alpha1.Application) {
if new.Spec.Source == nil {
log.Warn().Msgf("%s/%s: no source, skipping", new.Namespace, new.Name)
return
}

oldAppDirectory := v2a.GetAppsInRepo(old.Spec.Source.RepoURL)
oldAppDirectory.RemoveApp(*old)

newAppDirectory := v2a.GetAppsInRepo(new.Spec.Source.RepoURL)
newAppDirectory.ProcessApp(*new)
}

func (v2a *VcsToArgoMap) DeleteApp(app *v1alpha1.Application) {
if app.Spec.Source == nil {
log.Warn().Msgf("%s/%s: no source, skipping", app.Namespace, app.Name)
return
}

oldAppDirectory := v2a.GetAppsInRepo(app.Spec.Source.RepoURL)
oldAppDirectory.RemoveApp(*app)
}

type ServerConfig struct {
Expand Down
2 changes: 1 addition & 1 deletion pkg/config/vcstoargomap.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func BuildAppsMap(ctx context.Context) (VcsToArgoMap, error) {
return result, errors.Wrap(err, "failed to list applications")
}
for _, app := range apps.Items {
result.AddApp(app)
result.AddApp(&app)
}

return result, nil
Expand Down
38 changes: 22 additions & 16 deletions pkg/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,41 @@ import (
"github.com/spf13/viper"
"github.com/ziflex/lecho/v3"

"github.com/zapier/kubechecks/pkg/app_watcher"
"github.com/zapier/kubechecks/pkg/config"
"github.com/zapier/kubechecks/pkg/vcs"
)

const KubeChecksHooksPathPrefix = "/hooks"

type Server struct {
cfg *config.ServerConfig
cfg *config.ServerConfig
appWatcher *app_watcher.ApplicationWatcher
}

func NewServer(cfg *config.ServerConfig) *Server {
return &Server{cfg: cfg}
var appWatcher *app_watcher.ApplicationWatcher
if viper.GetBool("monitor-all-applications") {
argoMap, err := config.BuildAppsMap(context.TODO())
if err != nil {
log.Fatal().Err(err).Msg("could not build VcsToArgoMap")
}
cfg.VcsToArgoMap = argoMap

appWatcher, err = app_watcher.NewApplicationWatcher(cfg)
if err != nil {
log.Fatal().Err(err).Msg("could not create ApplicationWatcher")
}
} else {
cfg.VcsToArgoMap = config.NewVcsToArgoMap()
}

return &Server{cfg: cfg, appWatcher: appWatcher}
}

func (s *Server) Start(ctx context.Context) {
if argoMap, err := s.buildVcsToArgoMap(ctx); err != nil {
log.Warn().Err(err).Msg("failed to build vcs app map from argo")
} else {
s.cfg.VcsToArgoMap = argoMap
if s.appWatcher != nil {
go s.appWatcher.Run(context.Background(), 1)
}

if err := s.ensureWebhooks(); err != nil {
Expand Down Expand Up @@ -120,13 +136,3 @@ func (s *Server) ensureWebhooks() error {

return nil
}

func (s *Server) buildVcsToArgoMap(ctx context.Context) (config.VcsToArgoMap, error) {
if !viper.GetBool("monitor-all-applications") {
return config.NewVcsToArgoMap(), nil
}

log.Debug().Msg("building VCS to Application Map")

return config.BuildAppsMap(ctx)
}

0 comments on commit 1aa76be

Please sign in to comment.