Skip to content

Commit

Permalink
fea(score) add daemonset, jobs, cronjobs, and more statefulset types
Browse files Browse the repository at this point in the history
  • Loading branch information
zegl committed Sep 23, 2018
1 parent 21d3e31 commit 469f8a7
Show file tree
Hide file tree
Showing 16 changed files with 319 additions and 59 deletions.
58 changes: 58 additions & 0 deletions score/deamonset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package score

import (
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
appsv1beta2 "k8s.io/api/apps/v1beta2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type appsv1DaemonSet struct {
appsv1.DaemonSet
}

func (d appsv1DaemonSet) GetTypeMeta() metav1.TypeMeta {
return d.TypeMeta
}

func (d appsv1DaemonSet) GetObjectMeta() metav1.ObjectMeta {
return d.ObjectMeta
}

func (d appsv1DaemonSet) GetPodTemplateSpec() corev1.PodTemplateSpec {
return d.Spec.Template
}

type appsv1beta2DaemonSet struct {
appsv1beta2.DaemonSet
}

func (d appsv1beta2DaemonSet) GetTypeMeta() metav1.TypeMeta {
return d.TypeMeta
}

func (d appsv1beta2DaemonSet) GetObjectMeta() metav1.ObjectMeta {
return d.ObjectMeta
}

func (d appsv1beta2DaemonSet) GetPodTemplateSpec() corev1.PodTemplateSpec {
return d.Spec.Template
}

type extensionsv1beta1DaemonSet struct {
extensionsv1beta1.DaemonSet
}

func (d extensionsv1beta1DaemonSet) GetTypeMeta() metav1.TypeMeta {
return d.TypeMeta
}

func (d extensionsv1beta1DaemonSet) GetObjectMeta() metav1.ObjectMeta {
return d.ObjectMeta
}

func (d extensionsv1beta1DaemonSet) GetPodTemplateSpec() corev1.PodTemplateSpec {
return d.Spec.Template
}

6 changes: 0 additions & 6 deletions score/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,6 @@ import (
appsv1beta2 "k8s.io/api/apps/v1beta2"
)

type Deployment interface {
GetTypeMeta() metav1.TypeMeta
GetObjectMeta() metav1.ObjectMeta
GetPodTemplateSpec() corev1.PodTemplateSpec
}

type appsv1Deployment struct {
appsv1.Deployment
}
Expand Down
40 changes: 40 additions & 0 deletions score/jobs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package score

import (
batchv1 "k8s.io/api/batch/v1"
batchv1beta1 "k8s.io/api/batch/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
corev1 "k8s.io/api/core/v1"
)

type batchv1Job struct {
batchv1.Job
}

func (d batchv1Job) GetTypeMeta() metav1.TypeMeta {
return d.TypeMeta
}

func (d batchv1Job) GetObjectMeta() metav1.ObjectMeta {
return d.ObjectMeta
}

func (d batchv1Job) GetPodTemplateSpec() corev1.PodTemplateSpec {
return d.Spec.Template
}

type batchv1beta1CronJob struct {
batchv1beta1.CronJob
}

func (d batchv1beta1CronJob) GetTypeMeta() metav1.TypeMeta {
return d.TypeMeta
}

func (d batchv1beta1CronJob) GetObjectMeta() metav1.ObjectMeta {
return d.ObjectMeta
}

func (d batchv1beta1CronJob) GetPodTemplateSpec() corev1.PodTemplateSpec {
return d.Spec.JobTemplate.Spec.Template
}
114 changes: 69 additions & 45 deletions score/score.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import (
appsv1beta2 "k8s.io/api/apps/v1beta2"
networkingv1 "k8s.io/api/networking/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
batchv1 "k8s.io/api/batch/v1"
batchv1beta1 "k8s.io/api/batch/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
)
Expand All @@ -34,6 +36,14 @@ func addToScheme(scheme *runtime.Scheme) {
extensionsv1beta1.AddToScheme(scheme)
appsv1beta1.AddToScheme(scheme)
appsv1beta2.AddToScheme(scheme)
batchv1.AddToScheme(scheme)
batchv1beta1.AddToScheme(scheme)
}

type PodSpecer interface {
GetTypeMeta() metav1.TypeMeta
GetObjectMeta() metav1.ObjectMeta
GetPodTemplateSpec() corev1.PodTemplateSpec
}

func Score(files []io.Reader) (*scorecard.Scorecard, error) {
Expand All @@ -49,8 +59,7 @@ func Score(files []io.Reader) (*scorecard.Scorecard, error) {

var typeMetas []bothMeta
var pods []corev1.Pod
var genericDeployments []Deployment
var genericStatefulsets []StatefulSet
var podspecers []PodSpecer
var networkPolies []networkingv1.NetworkPolicy

for _, file := range files {
Expand Down Expand Up @@ -80,59 +89,82 @@ func Score(files []io.Reader) (*scorecard.Scorecard, error) {
pods = append(pods, pod)
typeMetas = append(typeMetas, bothMeta{pod.TypeMeta, pod.ObjectMeta})

case "Job":
fallthrough
case "CronJob":
fallthrough
case "Deployment":
fallthrough
case "DaemonSet":
fallthrough
case "StatefulSet":
var podspecer PodSpecer

var genericDeployment Deployment
kindAndVersion := detect.Kind + "-" + detect.ApiVersion

switch detect.ApiVersion {
case "apps/v1":
switch kindAndVersion {
case "Deployment-apps/v1":
var deployment appsv1.Deployment
decode(fileContents, &deployment)
genericDeployment = appsv1Deployment{deployment}
case "apps/v1beta1":
podspecer = appsv1Deployment{deployment}
case "Deployment-apps/v1beta1":
var deployment appsv1beta1.Deployment
decode(fileContents, &deployment)
genericDeployment = appsv1beta1Deployment{deployment}
case "apps/v1beta2":
podspecer = appsv1beta1Deployment{deployment}
case "Deployment-apps/v1beta2":
var deployment appsv1beta2.Deployment
decode(fileContents, &deployment)
genericDeployment = appsv1beta2Deployment{deployment}
case "extensions/v1beta1":
podspecer = appsv1beta2Deployment{deployment}
case "Deployment-extensions/v1beta1":
var deployment extensionsv1beta1.Deployment
decode(fileContents, &deployment)
genericDeployment = extensionsv1beta1Deployment{deployment}
default:
log.Printf("Unknown type version of Deployment: %s", detect.ApiVersion)
}
podspecer = extensionsv1beta1Deployment{deployment}

genericDeployments = append(genericDeployments, genericDeployment)
typeMetas = append(typeMetas, bothMeta{
genericDeployment.GetTypeMeta(),
genericDeployment.GetObjectMeta(),
})

case "StatefulSet":
var genericStatefulset StatefulSet

switch detect.ApiVersion {
case "apps/v1":
case "StatefulSet-apps/v1":
var statefulSet appsv1.StatefulSet
decode(fileContents, &statefulSet)
genericStatefulset = appsv1StatefulSet{statefulSet}
case "apps/v1beta1":
podspecer = appsv1StatefulSet{statefulSet}
case "StatefulSet-apps/v1beta1":
var statefulSet appsv1beta1.StatefulSet
decode(fileContents, &statefulSet)
genericStatefulset = appsv1beta1StatefulSet{statefulSet}
case "apps/v1beta2":
podspecer = appsv1beta1StatefulSet{statefulSet}
case "StatefulSet-apps/v1beta2":
var statefulSet appsv1beta2.StatefulSet
decode(fileContents, &statefulSet)
genericStatefulset = appsv1beta2StatefulSet{statefulSet}
podspecer = appsv1beta2StatefulSet{statefulSet}

case "DaemonSet-apps/v1":
var daemonset appsv1.DaemonSet
decode(fileContents, &daemonset)
podspecer = appsv1DaemonSet{daemonset}
case "DaemonSet-apps/v1beta2":
var daemonset appsv1beta2.DaemonSet
decode(fileContents, &daemonset)
podspecer = appsv1beta2DaemonSet{daemonset}
case "DaemonSet-extensions/v1beta1":
var daemonset extensionsv1beta1.DaemonSet
decode(fileContents, &daemonset)
podspecer = extensionsv1beta1DaemonSet{daemonset}

case "Job-batch/v1":
var job batchv1.Job
decode(fileContents, &job)
podspecer = batchv1Job{job}

case "CronJob-batch/v1beta1":
var cronjob batchv1beta1.CronJob
decode(fileContents, &cronjob)
podspecer = batchv1beta1CronJob{cronjob}

default:
log.Printf("Unknown type %s %s", detect.ApiVersion, detect.Kind)
continue
}

genericStatefulsets = append(genericStatefulsets, genericStatefulset)
podspecers = append(podspecers, podspecer)
typeMetas = append(typeMetas, bothMeta{
genericStatefulset.GetTypeMeta(),
genericStatefulset.GetObjectMeta(),
podspecer.GetTypeMeta(),
podspecer.GetObjectMeta(),
})

case "NetworkPolicy":
Expand Down Expand Up @@ -180,18 +212,10 @@ func Score(files []io.Reader) (*scorecard.Scorecard, error) {
}
}

for _, deployment := range genericDeployments {
for _, podTest := range podTests {
score := podTest(deployment.GetPodTemplateSpec())
score.AddMeta(deployment.GetTypeMeta(), deployment.GetObjectMeta())
scoreCard.Add(score)
}
}

for _, statefulset := range genericStatefulsets {
for _, podspecer := range podspecers {
for _, podTest := range podTests {
score := podTest(statefulset.GetPodTemplateSpec())
score.AddMeta(statefulset.GetTypeMeta(), statefulset.GetObjectMeta())
score := podTest(podspecer.GetPodTemplateSpec())
score.AddMeta(podspecer.GetTypeMeta(), podspecer.GetObjectMeta())
scoreCard.Add(score)
}
}
Expand Down
38 changes: 37 additions & 1 deletion score/score_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,14 @@ func TestStatefulSetResources(t *testing.T) {
testExpectedScore(t, "statefulset-test-resources.yaml", "Container Resources", 5)
}

func TestStatefulSetAppsv1beta1(t *testing.T) {
testExpectedScore(t, "statefulset-appsv1beta1.yaml", "Unstable version", 5)
}

func TestStatefulSetAppsv1beta2(t *testing.T) {
testExpectedScore(t, "statefulset-appsv1beta2.yaml", "Unstable version", 5)
}

func TestPodContainerTagLatest(t *testing.T) {
testExpectedScore(t, "pod-image-tag-latest.yaml", "Container Image Tag", 0)
}
Expand Down Expand Up @@ -107,6 +115,34 @@ func TestPodProbesIdenticalExec(t *testing.T) {
testExpectedScore(t, "pod-probes-identical-exec.yaml", "Pod Probes", 7)
}

func TestDeploymentUnstableExtensionsv1beta1(t *testing.T) {
func TestDeploymentExtensionsv1beta1(t *testing.T) {
testExpectedScore(t, "deployment-extensions-v1beta1.yaml", "Unstable version", 5)
}

func TestDeploymentAppsv1beta1(t *testing.T) {
testExpectedScore(t, "deployment-appsv1beta1.yaml", "Unstable version", 5)
}

func TestDeploymentAppsv1beta2(t *testing.T) {
testExpectedScore(t, "deployment-appsv1beta2.yaml", "Unstable version", 5)
}

func TestDaemonSetAppsv1(t *testing.T) {
testExpectedScore(t, "daemonset-appsv1.yaml", "Unstable version", 10)
}

func TestDaemonSetAppsv1beta2(t *testing.T) {
testExpectedScore(t, "daemonset-appsv1beta2.yaml", "Unstable version", 5)
}

func TestDaemonSetExtensionsv1beta1(t *testing.T) {
testExpectedScore(t, "daemonset-extensionsv1beta1.yaml", "Unstable version", 5)
}

func TestCronJobBatchv1beta1(t *testing.T) {
testExpectedScore(t, "cronjob-batchv1beta1.yaml", "Unstable version", 10)
}

func TestJobBatchv1(t *testing.T) {
testExpectedScore(t, "job-batchv1.yaml", "Unstable version", 10)
}
2 changes: 2 additions & 0 deletions score/stableVersion.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ func scoreMetaStableAvailable(meta metav1.TypeMeta) (score scorecard.TestScore)
withStable := map[string]map[string]string {
"extensions/v1beta1": {
"Deployment": "apps/v1",
"DaemonSet": "apps/v1",
},
"apps/v1beta1": {
"Deployment": "apps/v1",
Expand All @@ -17,6 +18,7 @@ func scoreMetaStableAvailable(meta metav1.TypeMeta) (score scorecard.TestScore)
"apps/v1beta2": {
"Deployment": "apps/v1",
"StatefulSet": "apps/v1",
"DaemonSet": "apps/v1",
},
}

Expand Down
7 changes: 0 additions & 7 deletions score/statefulset.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package score


import (
appsv1 "k8s.io/api/apps/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand All @@ -9,12 +8,6 @@ import (
appsv1beta2 "k8s.io/api/apps/v1beta2"
)

type StatefulSet interface {
GetTypeMeta() metav1.TypeMeta
GetObjectMeta() metav1.ObjectMeta
GetPodTemplateSpec() corev1.PodTemplateSpec
}

type appsv1StatefulSet struct {
appsv1.StatefulSet
}
Expand Down
13 changes: 13 additions & 0 deletions score/testdata/cronjob-batchv1beta1.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-test
spec:
schedule: "1 3 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: foo
image: bar:latest
10 changes: 10 additions & 0 deletions score/testdata/daemonset-appsv1.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-test
spec:
template:
spec:
containers:
- name: foo
image: foo:latest

0 comments on commit 469f8a7

Please sign in to comment.