Skip to content

Commit

Permalink
adding verification to operators around params (#1033)
Browse files Browse the repository at this point in the history
  • Loading branch information
kensipe committed Nov 6, 2019
1 parent 5eddebd commit fbeb3ff
Show file tree
Hide file tree
Showing 14 changed files with 468 additions and 10 deletions.
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ require (
github.com/dustinkirkland/golang-petname v0.0.0-20170921220637-d3c2ba80e75e
github.com/go-test/deep v1.0.1
github.com/gogo/protobuf v1.3.1 // indirect
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
github.com/golangci/golangci-lint v1.21.0
github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf
github.com/gophercloud/gophercloud v0.2.0 // indirect
Expand All @@ -37,10 +38,9 @@ require (
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.4.0
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3
golang.org/x/net v0.0.0-20190923162816-aa69164e4478
golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339 // indirect
golang.org/x/tools v0.0.0-20191025023517-2077df36852e
golang.org/x/tools v0.0.0-20191025023517-2077df36852e // indirect
gopkg.in/yaml.v2 v2.2.4
gotest.tools v2.2.0+incompatible
k8s.io/api v0.0.0-20191016110408-35e52d86657a
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV
github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4=
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
Expand Down
49 changes: 45 additions & 4 deletions pkg/kudoctl/cmd/operator_verify.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package cmd

import (
"fmt"
"io"

"github.com/kudobuilder/kudo/pkg/kudoctl/cmd/verify"
"github.com/kudobuilder/kudo/pkg/kudoctl/packages"

"github.com/gosuri/uitable"
"github.com/spf13/afero"
"github.com/spf13/cobra"
)
Expand All @@ -20,19 +25,55 @@ func newOperatorVerifyCmd(fs afero.Fs, out io.Writer) *cobra.Command {
Short: "verify operator parameters",
Example: " kubectl kudo operator verify",
RunE: func(cmd *cobra.Command, args []string) error {
//list.home = Settings.Home
return list.run(fs)
if err := validateOperatorArg(args); err != nil {
return err
}
return list.run(fs, args[0])
},
}

return cmd
}

func (c *operatorVerifyCmd) run(fs afero.Fs) error {
func (c *operatorVerifyCmd) run(fs afero.Fs, path string) error {

pf, err := packages.FromFolder(fs, path)
if err != nil {
return err
}
warnings, errors := verify.Parameters(pf.Params)

if warnings != nil {
printWarnings(c.out, warnings)
}
if errors != nil {
printErrors(c.out, errors)
return fmt.Errorf("operator verification errors: %v", len(errors))
}
if warnings == nil && errors == nil {
fmt.Fprintf(c.out, "operator is valid\n")
}

//TODO (kensipe): add linting
// 1. error on dups
// 2. warning on params not used
// 3. error on param in template not defined
return nil
}

func printErrors(out io.Writer, errors verify.ParamErrors) {
table := uitable.New()
table.AddRow("Errors")
for _, warning := range errors {
table.AddRow(warning)
}
fmt.Fprintln(out, table)
}

func printWarnings(out io.Writer, warnings verify.ParamWarnings) {
table := uitable.New()
table.AddRow("Warnings")
for _, warning := range warnings {
table.AddRow(warning)
}
fmt.Fprintln(out, table)
}
35 changes: 35 additions & 0 deletions pkg/kudoctl/cmd/operator_verify_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package cmd

import (
"bytes"
"io/ioutil"
"path/filepath"
"testing"

"github.com/stretchr/testify/assert"
)

func TestOperatorVerify(t *testing.T) {
file := "invalid-params"
out := &bytes.Buffer{}
cmd := newOperatorVerifyCmd(fs, out)
// if err := cmd.RunE(cmd, []string{"testdata/invalid-zk"}); err != nil {
if err := cmd.RunE(cmd, []string{"./testdata/invalidzk"}); err != nil {
assert.Error(t, err)
}

gp := filepath.Join("testdata", file+".golden")

if *updateGolden {
t.Log("update golden file")
if err := ioutil.WriteFile(gp, out.Bytes(), 0644); err != nil {
t.Fatalf("failed to update golden file: %s", err)
}
}
g, err := ioutil.ReadFile(gp)
if err != nil {
t.Fatalf("failed reading .golden: %s", err)
}

assert.Equal(t, out.String(), string(g), "yaml does not match .golden file %s", gp)
}
3 changes: 3 additions & 0 deletions pkg/kudoctl/cmd/testdata/invalid-params.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Errors
parameter "Cpus" has a duplicate
parameter "comma," has a the invalid char ','
51 changes: 51 additions & 0 deletions pkg/kudoctl/cmd/testdata/invalidzk/operator.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
apiVersion: kudo.dev/v1beta1
name: "zookeeper"
version: "0.1.0"
appVersion: "3.4.10"
kudoVersion: 0.2.0
kubernetesVersion: 1.15.0
maintainers:
- name: Alena Varkockova
email: avarkockova@mesosphere.com
- name: Tom Runyon
email: runyontr@gmail.com
- name: Ken Sipe
email: kensipe@gmail.com
url: https://zookeeper.apache.org/
tasks:
- name: infra
kind: Apply
spec:
resources:
- services.yaml
- pdb.yaml
- name: app
kind: Apply
spec:
resources:
- statefulset.yaml
- name: validation
kind: Apply
spec:
resources:
- validation.yaml
plans:
deploy:
strategy: serial
phases:
- name: zookeeper
strategy: parallel
steps:
- name: everything
tasks:
- infra
- app
validation:
strategy: serial
phases:
- name: connection
strategy: parallel
steps:
- name: connection
tasks:
- validation
14 changes: 14 additions & 0 deletions pkg/kudoctl/cmd/testdata/invalidzk/params.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: kudo.dev/v1beta1
parameters:
- name: memory
description: Amount of memory to provide to Zookeeper pods
default: "1Gi"
- name: cpus
description: Amount of cpu to provide to Zookeeper pods
default: "0.25"
- name: Cpus
description: Amount of cpu to provide to Zookeeper pods
default: "0.25"
- name: comma,
description: Amount of cpu to provide to Zookeeper pods
default: "0.25"
14 changes: 14 additions & 0 deletions pkg/kudoctl/cmd/testdata/invalidzk/templates/pdb.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: {{ .Name }}-pdb
namespace: {{ .Namespace }}
labels:
app: zookeeper
zookeeper: {{ .Name }}
spec:
selector:
matchLabels:
app: zookeeper
zookeeper: {{ .Name }}
maxUnavailable: 1
34 changes: 34 additions & 0 deletions pkg/kudoctl/cmd/testdata/invalidzk/templates/services.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
apiVersion: v1
kind: Service
metadata:
name: hs
namespace: {{ .Namespace }}
labels:
app: zookeeper
zookeeper: {{ .Name }}
spec:
ports:
- port: 2888
name: server
- port: 3888
name: leader-election
clusterIP: None
selector:
app: zookeeper
zookeeper: {{ .Name }}
---
apiVersion: v1
kind: Service
metadata:
name: cs
namespace: {{ .Namespace }}
labels:
app: zookeeper
zookeeper: {{ .Name }}
spec:
ports:
- port: 2181
name: client
selector:
app: zookeeper
zookeeper: {{ .Name }}
87 changes: 87 additions & 0 deletions pkg/kudoctl/cmd/testdata/invalidzk/templates/statefulset.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: {{ .Name }}
namespace: {{ .Namespace }}
spec:
selector:
matchLabels:
app: zookeeper
zookeeper: {{ .Name }}
serviceName: {{ .Name }}-hs
replicas: 3
updateStrategy:
type: RollingUpdate
podManagementPolicy: Parallel
template:
metadata:
labels:
app: zookeeper
zookeeper: {{ .Name }}
spec:
containers:
- name: kubernetes-zookeeper
imagePullPolicy: Always
image: "k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10"
resources:
requests:
memory: "{{ .Params.memory }}"
cpu: "{{ .Params.cpus }}"
ports:
- containerPort: 2181
name: client
- containerPort: 2888
name: server
- containerPort: 3888
name: leader-election
command:
- sh
- -c
- "start-zookeeper \
--servers=3 \
--data_dir=/var/lib/zookeeper/data \
--data_log_dir=/var/lib/zookeeper/data/log \
--conf_dir=/opt/zookeeper/conf \
--client_port=2181 \
--election_port=3888 \
--server_port=2888 \
--tick_time=2000 \
--init_limit=10 \
--sync_limit=5 \
--heap=512M \
--max_client_cnxns=60 \
--snap_retain_count=3 \
--purge_interval=12 \
--max_session_timeout=40000 \
--min_session_timeout=4000 \
--log_level=INFO"
readinessProbe:
exec:
command:
- sh
- -c
- "zookeeper-ready 2181"
initialDelaySeconds: 10
timeoutSeconds: 5
livenessProbe:
exec:
command:
- sh
- -c
- "zookeeper-ready 2181"
initialDelaySeconds: 10
timeoutSeconds: 5
volumeMounts:
- name: datadir
mountPath: /var/lib/zookeeper
securityContext:
runAsUser: 1000
fsGroup: 1000
volumeClaimTemplates:
- metadata:
name: datadir
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 2Gi
27 changes: 27 additions & 0 deletions pkg/kudoctl/cmd/testdata/invalidzk/templates/validation.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
apiVersion: batch/v1
kind: Job
metadata:
name: zookeeper-validation
spec:
template:
metadata:
name: "validation"
spec:
restartPolicy: Never
containers:
- name: kubernetes-zookeeper
imagePullPolicy: Always
image: "k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10"
env:
- name: CONN
value: zk-zk-0.zk-hs:2181,zk-zk-1.zk-hs:2181,zk-zk-2.zk-hs:2181
resources:
requests:
memory: "{{ .Params.memory }}"
cpu: "{{ .Params.cpus }}"
command:
- sh
- -c
- "/opt/zookeeper/bin/zkCLI.sh \
--server $CONN \
ls /"
Loading

0 comments on commit fbeb3ff

Please sign in to comment.