Skip to content

Commit 631eb6c

Browse files
authored
Properly scan CronJob objects as workloads (#354)
* Fix typo that caused CronJobs to be skipped * Parsing a CronJob from its Info object * Test parsing CronJobs * Properly set go version in workflow --------- Signed-off-by: ZIV NEVO <[email protected]>
1 parent 3595700 commit 631eb6c

5 files changed

+1174
-19
lines changed

.github/workflows/test-output-validity.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
- name: Set up Go
2424
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491
2525
with:
26-
go-version: 'stable'
26+
go-version-file: ./go.mod
2727

2828
- name: Build
2929
run: make

pkg/analyzer/info_to_resource.go

+11-7
Original file line numberDiff line numberDiff line change
@@ -31,31 +31,35 @@ func k8sWorkloadObjectFromInfo(info *resource.Info) (*Resource, error) {
3131
var metaObj metaV1.Object
3232
resourceCtx.Resource.Kind = info.Object.GetObjectKind().GroupVersionKind().Kind
3333
switch resourceCtx.Resource.Kind {
34-
case "Pod":
34+
case pod:
3535
obj := parseResourceFromInfo[v1.Pod](info)
3636
podSpecV1 = &v1.PodTemplateSpec{Spec: obj.Spec, ObjectMeta: obj.ObjectMeta}
3737
metaObj = obj
38-
case "ReplicaSet":
38+
case replicaSet:
3939
obj := parseResourceFromInfo[appsv1.ReplicaSet](info)
4040
podSpecV1 = &obj.Spec.Template
4141
metaObj = obj
42-
case "ReplicationController":
42+
case replicationController:
4343
obj := parseResourceFromInfo[v1.ReplicationController](info)
4444
podSpecV1 = obj.Spec.Template
4545
metaObj = obj
46-
case "Deployment":
46+
case deployment:
4747
obj := parseResourceFromInfo[appsv1.Deployment](info)
4848
podSpecV1 = &obj.Spec.Template
4949
metaObj = obj
50-
case "DaemonSet":
50+
case daemonSet:
5151
obj := parseResourceFromInfo[appsv1.DaemonSet](info)
5252
podSpecV1 = &obj.Spec.Template
5353
metaObj = obj
54-
case "StatefulSet":
54+
case statefulSet:
5555
obj := parseResourceFromInfo[appsv1.StatefulSet](info)
5656
podSpecV1 = &obj.Spec.Template
5757
metaObj = obj
58-
case "Job":
58+
case cronJob:
59+
obj := parseResourceFromInfo[batchv1.CronJob](info)
60+
podSpecV1 = &obj.Spec.JobTemplate.Spec.Template
61+
metaObj = obj
62+
case job:
5963
obj := parseResourceFromInfo[batchv1.Job](info)
6064
podSpecV1 = &obj.Spec.Template
6165
metaObj = obj

pkg/analyzer/info_to_resource_test.go

+26-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package analyzer
22

33
import (
4+
"fmt"
45
"os"
56
"path/filepath"
67
"strings"
@@ -36,7 +37,7 @@ func TestNetworkAddressValue(t *testing.T) {
3637
}
3738

3839
func TestScanningSvc(t *testing.T) {
39-
resourceInfo, err := loadResourceAsInfo([]string{"k8s_guestbook", "frontend-service.yaml"})
40+
resourceInfo, err := loadResourceAsInfo([]string{"k8s_guestbook", "frontend-service.yaml"}, 0)
4041
require.Nil(t, err)
4142
res, err := k8sServiceFromInfo(resourceInfo)
4243
require.Nil(t, err)
@@ -47,7 +48,7 @@ func TestScanningSvc(t *testing.T) {
4748
}
4849

4950
func TestScanningDeploymentWithArgs(t *testing.T) {
50-
resourceInfo, err := loadResourceAsInfo([]string{"sockshop", "manifests", "01-carts-dep.yaml"})
51+
resourceInfo, err := loadResourceAsInfo([]string{"sockshop", "manifests", "01-carts-dep.yaml"}, 0)
5152
require.Nil(t, err)
5253
res, err := k8sWorkloadObjectFromInfo(resourceInfo)
5354
require.Nil(t, err)
@@ -59,7 +60,7 @@ func TestScanningDeploymentWithArgs(t *testing.T) {
5960
}
6061

6162
func TestScanningDeploymentWithEnvs(t *testing.T) {
62-
resourceInfo, err := loadResourceAsInfo([]string{"k8s_guestbook", "frontend-deployment.yaml"})
63+
resourceInfo, err := loadResourceAsInfo([]string{"k8s_guestbook", "frontend-deployment.yaml"}, 0)
6364
require.Nil(t, err)
6465
res, err := k8sWorkloadObjectFromInfo(resourceInfo)
6566
require.Nil(t, err)
@@ -69,7 +70,7 @@ func TestScanningDeploymentWithEnvs(t *testing.T) {
6970
}
7071

7172
func TestScanningDeploymentWithConfigMapRef(t *testing.T) {
72-
resourceInfo, err := loadResourceAsInfo([]string{"acs-security-demos", "frontend", "webapp", "deployment.yaml"})
73+
resourceInfo, err := loadResourceAsInfo([]string{"acs-security-demos", "frontend", "webapp", "deployment.yaml"}, 0)
7374
require.Nil(t, err)
7475
res, err := k8sWorkloadObjectFromInfo(resourceInfo)
7576
require.Nil(t, err)
@@ -80,7 +81,7 @@ func TestScanningDeploymentWithConfigMapRef(t *testing.T) {
8081
}
8182

8283
func TestScanningReplicaSet(t *testing.T) {
83-
resourceInfo, err := loadResourceAsInfo([]string{"k8s_guestbook", "redis-leader-deployment.yaml"})
84+
resourceInfo, err := loadResourceAsInfo([]string{"k8s_guestbook", "redis-leader-deployment.yaml"}, 0)
8485
require.Nil(t, err)
8586
res, err := k8sWorkloadObjectFromInfo(resourceInfo)
8687
require.Nil(t, err)
@@ -90,7 +91,7 @@ func TestScanningReplicaSet(t *testing.T) {
9091
}
9192

9293
func TestScanningConfigMap(t *testing.T) {
93-
resourceInfo, err := loadResourceAsInfo([]string{"qotd", "qotd_usecase.yaml"})
94+
resourceInfo, err := loadResourceAsInfo([]string{"qotd", "qotd_usecase.yaml"}, 0)
9495
require.Nil(t, err)
9596
res, err := k8sConfigmapFromInfo(resourceInfo)
9697
require.Nil(t, err)
@@ -99,7 +100,7 @@ func TestScanningConfigMap(t *testing.T) {
99100
}
100101

101102
func TestScanningIngress(t *testing.T) {
102-
resourceInfo, err := loadResourceAsInfo([]string{"bookinfo", "bookinfo-ingress.yaml"})
103+
resourceInfo, err := loadResourceAsInfo([]string{"bookinfo", "bookinfo-ingress.yaml"}, 0)
103104
require.Nil(t, err)
104105
toExpose := servicesToExpose{}
105106
err = k8sIngressFromInfo(resourceInfo, toExpose)
@@ -108,15 +109,26 @@ func TestScanningIngress(t *testing.T) {
108109
}
109110

110111
func TestScanningRoute(t *testing.T) {
111-
resourceInfo, err := loadResourceAsInfo([]string{"acs-security-demos", "frontend", "webapp", "route.yaml"})
112+
resourceInfo, err := loadResourceAsInfo([]string{"acs-security-demos", "frontend", "webapp", "route.yaml"}, 0)
112113
require.Nil(t, err)
113114
toExpose := servicesToExpose{}
114115
err = ocRouteFromInfo(resourceInfo, toExpose)
115116
require.Nil(t, err)
116117
require.Len(t, toExpose, 1)
117118
}
118119

119-
func loadResourceAsInfo(resourceDirs []string) (*resource.Info, error) {
120+
func TestScanningCronJob(t *testing.T) {
121+
resourceInfo, err := loadResourceAsInfo([]string{"openshift", "openshift-operator-lifecycle-manager-resources.yaml"}, 7)
122+
require.Nil(t, err)
123+
res, err := k8sWorkloadObjectFromInfo(resourceInfo)
124+
require.Nil(t, err)
125+
require.Equal(t, "collect-profiles", res.Resource.Name)
126+
require.Equal(t, cronJob, res.Resource.Kind)
127+
require.Len(t, res.Resource.NetworkAddrs, 1)
128+
require.Len(t, res.Resource.Labels, 0)
129+
}
130+
131+
func loadResourceAsInfo(resourceDirs []string, infoIndex int) (*resource.Info, error) {
120132
currentDir, _ := os.Getwd()
121133
resourceRelPath := filepath.Join(resourceDirs...)
122134
resourcePath := filepath.Join(currentDir, "..", "..", "tests", resourceRelPath)
@@ -126,5 +138,9 @@ func loadResourceAsInfo(resourceDirs []string) (*resource.Info, error) {
126138
return nil, errs[0]
127139
}
128140

129-
return infos[0], nil
141+
if len(infos) <= infoIndex {
142+
return nil, fmt.Errorf("Info number %d was required, but only %d Infos were read", infoIndex, len(infos))
143+
}
144+
145+
return infos[infoIndex], nil
130146
}

pkg/analyzer/resource_accumulator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const (
2424
statefulSet string = "StatefulSet"
2525
daemonSet string = "DaemonSet"
2626
job string = "Job"
27-
cronJob string = "CronTab"
27+
cronJob string = "CronJob"
2828
service string = "Service"
2929
configmap string = "ConfigMap"
3030
route string = "Route"

0 commit comments

Comments
 (0)