Skip to content

Commit

Permalink
use kubectl commands
Browse files Browse the repository at this point in the history
  • Loading branch information
damoon committed Jan 10, 2022
1 parent 7d3397f commit 6630583
Show file tree
Hide file tree
Showing 13 changed files with 307 additions and 765 deletions.
34 changes: 1 addition & 33 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,10 @@ module github.com/damoon/d8s

go 1.17

require (
github.com/urfave/cli/v2 v2.3.0
k8s.io/api v0.21.1
k8s.io/apimachinery v0.21.1
k8s.io/client-go v0.21.1
)
require github.com/urfave/cli/v2 v2.3.0

require (
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-logr/logr v0.4.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.4.3 // indirect
github.com/google/go-cmp v0.5.2 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/googleapis/gnostic v0.4.1 // indirect
github.com/imdario/mergo v0.3.5 // indirect
github.com/json-iterator/go v1.1.10 // indirect
github.com/moby/spdystream v0.2.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/russross/blackfriday/v2 v2.0.1 // indirect
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 // indirect
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073 // indirect
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
golang.org/x/text v0.3.4 // indirect
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect
google.golang.org/appengine v1.6.5 // indirect
google.golang.org/protobuf v1.25.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
k8s.io/klog/v2 v2.8.0 // indirect
k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.1.0 // indirect
sigs.k8s.io/yaml v1.2.0 // indirect
)
427 changes: 0 additions & 427 deletions go.sum

Large diffs are not rendered by default.

66 changes: 37 additions & 29 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,6 @@ import (
)

var (
verbose = &cli.BoolFlag{
Name: "verbose",
Aliases: []string{"v"},
Usage: "Print verbose logs.",
EnvVars: []string{"D8S_VERBOSE"},
}
allowContext = &cli.StringFlag{
Name: "allow-context",
Usage: "Allowed Kubernetes context name.",
Expand All @@ -24,35 +18,49 @@ var (
)

func main() {
up := func(c *cli.Context) error {
ctx := c.Context
allowContext := c.String(allowContext.Name)
args := c.Args()
if !args.Present() {
return fmt.Errorf("command missing")
}
command := args.Slice()

return d8s.Up(ctx, allowContext, command)
}
down := func(c *cli.Context) error {
ctx := c.Context
allowContext := c.String(allowContext.Name)

return d8s.Down(ctx, allowContext)
}
version := func(c *cli.Context) error {
return d8s.Version()
}

app := &cli.App{
Name: "D8s (dates).",
Usage: "The client for dinner.",
Usage: "A wrapper for docker in docker doing port-forward.",
Flags: []cli.Flag{
allowContext,
},
Action: up,
Commands: []*cli.Command{
{
Name: "up",
Usage: "Connect to docker in docker and set DOCKER_HOST for started process.",
Flags: []cli.Flag{
verbose,
allowContext,
},
Action: func(c *cli.Context) error {
allowContext := c.String(allowContext.Name)
verbose := c.Bool(verbose.Name)
args := c.Args()
if !args.Present() {
return fmt.Errorf("command missing")
}
command := args.Slice()

return d8s.Up(allowContext, verbose, command)
},
Name: "up",
Usage: "Connect to docker in docker and set DOCKER_HOST for started process.",
Action: up,
},
{
Name: "down",
Usage: "Deletes docker in docker deployment.",
Action: down,
},
{
Name: "version",
Usage: "Show the version",
Action: func(c *cli.Context) error {
return d8s.Version()
},
Name: "version",
Usage: "Show the version",
Action: version,
},
},
}
Expand Down
47 changes: 47 additions & 0 deletions pkg/down.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package d8s

import (
"context"
_ "embed"
"fmt"
"os"
"os/exec"
"strings"
)

func Down(ctx context.Context, allowContext string) error {
// verify kubernetes context in use
allowed, err := contextAllowed(allowContext)
if err != nil {
return fmt.Errorf("verify kubernetes context: %v", err)
}
if !allowed {
return fmt.Errorf("kubernetes context not allowed")
}

err = deleteDind()
if err != nil {
return fmt.Errorf("delete dind: %v", err)
}

return nil
}

func deleteDind() error {
cmd := exec.Command(
"kubectl",
"delete",
"-f-",
)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Stdin = strings.NewReader(manifest)
cmd.Env = os.Environ()

err := cmd.Run()
if err != nil {
return err
}

return nil
}
11 changes: 9 additions & 2 deletions pkg/k8s-context.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
package d8s

import (
_ "embed"
"fmt"
"os"
"os/exec"
"strings"
)

var (
//go:embed kubernetes.yaml
manifest string
)

func contextAllowed(envVar string) (bool, error) {
Expand All @@ -20,7 +27,7 @@ func contextAllowed(envVar string) (bool, error) {
return true, nil
}

return false, nil
return false, fmt.Errorf("context %s does not appear to be a development environment", contextName)
}

func kubectlContext() (string, error) {
Expand All @@ -36,7 +43,7 @@ func kubectlContext() (string, error) {
return "", fmt.Errorf("execute %v: %v", cmd.String(), err)
}

return string(context), nil
return strings.TrimSpace(string(context)), nil
}

// see https://github.com/tilt-dev/tilt/blob/fe386b5cc967383972bf73f8cbe6514c604100f8/internal/k8s/env.go#L38
Expand Down
88 changes: 88 additions & 0 deletions pkg/kubernetes.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
apiVersion: v1
kind: Service
metadata:
name: dind
spec:
ports:
- name: dind
port: 2375
selector:
app: dind
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dind
spec:
selector:
matchLabels:
app: dind
strategy:
type: Recreate
replicas: 1
template:
metadata:
labels:
app: dind
spec:
shareProcessNamespace: true
containers:
- name: nurse
image: ghcr.io/turbine-kreuzberg/dind-nurse:latest
imagePullPolicy: Always
args:
- server
ports:
- name: nurse
containerPort: 2375
readinessProbe:
httpGet:
path: /_nurse_healthy
port: 2375
volumeMounts:
- name: data
mountPath: /var/lib/docker
- name: dind
image: docker:20.10.12-dind@sha256:1f50d3a86f7035805843779f803e81e8f4ce96b62ed68fc70cdcf4922f43470b
command:
- sh
- -c
args:
- |
while true; do
dockerd-entrypoint.sh dockerd --host=tcp://0.0.0.0:12375 --tls=false --mtu=1300 &> /dev/null
date;
echo restarted to avoid OOM during builds;
done
env:
- name: DOCKER_TLS_CERTDIR
value: ""
- name: DOCKER_BUILDKIT
value: "1"
securityContext:
privileged: true
ports:
- name: dind
containerPort: 12375
readinessProbe:
httpGet:
path: /_ping
port: 12375
volumeMounts:
- name: data
mountPath: /var/lib/docker
volumes:
- name: data
persistentVolumeClaim:
claimName: dind
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dind
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
Loading

0 comments on commit 6630583

Please sign in to comment.