Skip to content

Commit

Permalink
Merge pull request #34 from adrianliechti/feature/extensions
Browse files Browse the repository at this point in the history
Feature/extensions
  • Loading branch information
adrianliechti authored Jul 12, 2024
2 parents 7c70a80 + b6aad15 commit 3b59970
Show file tree
Hide file tree
Showing 23 changed files with 559 additions and 95 deletions.
99 changes: 9 additions & 90 deletions app/create/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,8 @@ import (

"github.com/adrianliechti/devkube/app"
"github.com/adrianliechti/devkube/app/setup"
"github.com/adrianliechti/devkube/extension"
"github.com/adrianliechti/devkube/pkg/cli"

"github.com/adrianliechti/devkube/extension/certmanager"
"github.com/adrianliechti/devkube/extension/crossplane"
"github.com/adrianliechti/devkube/extension/dashboard"
"github.com/adrianliechti/devkube/extension/gatekeeper"
"github.com/adrianliechti/devkube/extension/grafana"
"github.com/adrianliechti/devkube/extension/loki"
"github.com/adrianliechti/devkube/extension/metrics"
"github.com/adrianliechti/devkube/extension/monitoring"
"github.com/adrianliechti/devkube/extension/otel"
"github.com/adrianliechti/devkube/extension/promtail"
"github.com/adrianliechti/devkube/extension/registry"
"github.com/adrianliechti/devkube/extension/tempo"
)

func Command() *cli.Command {
Expand All @@ -37,88 +25,19 @@ func Command() *cli.Command {
return errors.New("invalid cluster specified")
}

cli.Info("★ installing Kubernetes Cluster...")

if err := provider.Create(c.Context, cluster); err != nil {
//return err
}
cli.MustRun("Installing Kubernetes Cluster...", func() error {
provider.Create(c.Context, cluster)
return nil
})

client := app.MustClient(c)

cli.Info("★ installing Cert-Manager...")

if err := certmanager.Ensure(c.Context, client); err != nil {
return err
}

cli.Info("★ installing Gatekeeper...")

if err := gatekeeper.Ensure(c.Context, client); err != nil {
return err
}

cli.Info("★ installing Crossplane...")

if err := crossplane.Ensure(c.Context, client); err != nil {
return err
}

cli.Info("★ installing Registry...")

if err := registry.Ensure(c.Context, client); err != nil {
return err
}

cli.Info("★ installing Dashboard...")

if err := dashboard.Ensure(c.Context, client); err != nil {
return err
}

cli.Info("★ installing Prometheus...")

if err := metrics.Ensure(c.Context, client); err != nil {
return err
for _, e := range extension.Default {
cli.MustRun("Installing "+e.Title+"...", func() error {
return e.Ensure(c.Context, client)
})
}

if err := monitoring.Ensure(c.Context, client); err != nil {
return err
}

cli.Info("★ installing Grafana Loki...")

if err := loki.Ensure(c.Context, client); err != nil {
return err
}

cli.Info("★ installing Grafana Tempo...")

if err := tempo.Ensure(c.Context, client); err != nil {
return err
}

cli.Info("★ installing Grafana...")

if err := grafana.Ensure(c.Context, client); err != nil {
return err
}

cli.Info("★ installing Promtail...")

if err := promtail.Ensure(c.Context, client); err != nil {
return err
}

cli.Info("★ installing OpenTelemetry...")

if err := otel.Ensure(c.Context, client); err != nil {
return err
}

// if err := ingress.Install(c.Context, kubeconfig, app.DefaultNamespace); err != nil {
// return err
// }

return setup.Export(c.Context, provider, cluster, "")
},
}
Expand Down
10 changes: 9 additions & 1 deletion app/delete/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,15 @@ func Command() *cli.Command {
Action: func(c *cli.Context) error {
provider, cluster := app.MustCluster(c)

return provider.Delete(c.Context, cluster)
if ok := cli.MustConfirm("Are you sure you want to delete the cluster?", false); !ok {
return nil
}

cli.MustRun("Deleting Kubernetes Cluster...", func() error {
return provider.Delete(c.Context, cluster)
})

return nil
},
}
}
66 changes: 66 additions & 0 deletions app/install/install.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package install

import (
"errors"
"strings"

"github.com/adrianliechti/devkube/app"
"github.com/adrianliechti/devkube/extension"
"github.com/adrianliechti/devkube/pkg/cli"
)

func Command() *cli.Command {
return &cli.Command{
Name: "install",
Usage: "install extension",

Hidden: true,

Action: func(c *cli.Context) error {
provider, cluster, _ := app.Cluster(c)

if provider == nil {
return errors.New("invalid provider specified")
}

if cluster == "" {
return errors.New("invalid cluster specified")
}

client := app.MustClient(c)

var e extension.Extension

if c.Args().Len() > 0 {
if c.Args().Len() > 1 {
return errors.New("too many arguments")
}

for _, i := range extension.Optional {
if strings.EqualFold(c.Args().Get(0), i.Name) {
e = i
}
}
} else {
var labels []string

for _, i := range extension.Optional {
labels = append(labels, i.Title)
}

i, _ := cli.MustSelect("Extension", labels)
e = extension.Optional[i]
}

if e.Ensure == nil {
return errors.New("unknown extension")
}

cli.MustRun("Installing "+e.Title+"...", func() error {
return e.Ensure(c.Context, client)
})

return nil
},
}
}
17 changes: 16 additions & 1 deletion app/setup/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"github.com/adrianliechti/devkube/app"
"github.com/adrianliechti/devkube/pkg/cli"
"github.com/adrianliechti/devkube/pkg/kubeconfig"
"github.com/adrianliechti/devkube/provider"
"github.com/adrianliechti/loop/pkg/kubernetes"
)
Expand Down Expand Up @@ -39,5 +40,19 @@ func Export(ctx context.Context, provider provider.Provider, cluster string, pat
return err
}

return os.WriteFile(path, data, 0600)
var configs [][]byte

if source, _ := os.ReadFile(path); source != nil {
configs = append(configs, source)
}

configs = append(configs, data)

result, err := kubeconfig.Merge(configs...)

if err != nil {
return os.WriteFile(path, data, 0600)
}

return os.WriteFile(path, result, 0600)
}
21 changes: 21 additions & 0 deletions examples/argocd/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Argo CD

## Install Argo CD

```shell
$ devkube install argocd
```

### Open Server UI

```shell
$ kubectl port-forward -n argocd service/argocd-server 8080:80
```

open [http://localhost:8080](http://localhost:8080) in browser

### Sample App

```shell
$ kubectl apply -n argocd -f guestbook/
```
16 changes: 16 additions & 0 deletions examples/argocd/guestbook/application.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook
namespace: argocd
spec:
project: default
destination:
namespace: default
server: https://kubernetes.default.svc
source:
path: guestbook
repoURL: https://github.com/argoproj/argocd-example-apps.git
targetRevision: HEAD
syncPolicy:
automated: {}
37 changes: 37 additions & 0 deletions examples/tekton/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Tekont

## Install Tekton Dashboard, Pipelines & Triggers

```shell
$ devkube install tekton
```

### Open Dashboard

```shell
$ kubectl port-forward -n tekton-pipelines service/tekton-dashboard 9097:9097
```

open [http://localhost:9097](http://localhost:9097) in browser

### Sample Pipeline

```shell
$ kubectl apply -f pipeline/
```

```shell
$ kubectl apply -f pipeline-run/
```

### Sample Pipeline Trigger

```shell
$ kubectl apply -f pipeline-trigger/
```

```shell
$ kubectl port-forward service/el-hello-listener 8080

$ curl -v -H 'content-Type: application/json' -d '{"username": "Tekton"}' http://localhost:8080
```
11 changes: 11 additions & 0 deletions examples/tekton/pipeline-run/pipeline-run.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
name: hello-goodbye-run
spec:
pipelineRef:
name: hello-goodbye
params:
- name: username
value: DevKube
12 changes: 12 additions & 0 deletions examples/tekton/pipeline-trigger/event-listener.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
name: hello-listener
spec:
serviceAccountName: hello-robot
triggers:
- name: hello-trigger
bindings:
- ref: hello-binding
template:
ref: hello-template
29 changes: 29 additions & 0 deletions examples/tekton/pipeline-trigger/robot.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: hello-robot
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: hello-robot-binding
subjects:
- kind: ServiceAccount
name: hello-robot
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: tekton-triggers-eventlistener-roles
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: hello-robot-clusterbinding
subjects:
- kind: ServiceAccount
name: hello-robot
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: tekton-triggers-eventlistener-clusterroles
8 changes: 8 additions & 0 deletions examples/tekton/pipeline-trigger/trigger-binding.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
name: hello-binding
spec:
params:
- name: username
value: $(body.username)
Loading

0 comments on commit 3b59970

Please sign in to comment.