[k8s-checker] Add support for DaemonSets

Bug: skia:13597
Change-Id: Icd9fd98dfe530511db51c8c0219479e1dc7d3eb8
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/564860
Reviewed-by: Ravi Mistry <rmistry@google.com>
Commit-Queue: Eric Boren <borenet@google.com>
diff --git a/datahopper/go/cd_metrics/cd_metrics.go b/datahopper/go/cd_metrics/cd_metrics.go
index 7b00dfe..c041ca4 100644
--- a/datahopper/go/cd_metrics/cd_metrics.go
+++ b/datahopper/go/cd_metrics/cd_metrics.go
@@ -346,7 +346,7 @@
 				if err != nil {
 					return skerr.Wrapf(err, "failed to read %s at %s", file, commit.Hash)
 				}
-				deployments, statefulSets, cronJobs, err := k8s_config.ParseK8sConfigFile(contents)
+				deployments, statefulSets, cronJobs, daemonSets, err := k8s_config.ParseK8sConfigFile(contents)
 				if err != nil {
 					return skerr.Wrapf(err, "failed to parse %s", file)
 				}
@@ -364,6 +364,9 @@
 				for _, config := range cronJobs {
 					containers = append(containers, config.Spec.JobTemplate.Spec.Template.Spec.Containers...)
 				}
+				for _, config := range daemonSets {
+					containers = append(containers, config.Spec.Template.Spec.Containers...)
+				}
 
 				// Find the images used by each container.
 				for _, container := range containers {
diff --git a/k8s-checker/go/k8s-checker/main.go b/k8s-checker/go/k8s-checker/main.go
index c3ea850..15d501f 100644
--- a/k8s-checker/go/k8s-checker/main.go
+++ b/k8s-checker/go/k8s-checker/main.go
@@ -311,7 +311,7 @@
 		}
 
 		// There can be multiple YAML documents within a single YAML file.
-		deployments, statefulSets, cronJobs, err := k8s_config.ParseK8sConfigFile(yamlContents)
+		deployments, statefulSets, cronJobs, daemonSets, err := k8s_config.ParseK8sConfigFile(yamlContents)
 		if err != nil {
 			sklog.Fatalf("Error when parsing %s: %s", filepath.Join(cluster, f), err)
 		}
@@ -341,6 +341,11 @@
 			namespaces = append(namespaces, fixupNamespace(config.Namespace))
 			containers = append(containers, config.Spec.Template.Spec.Containers)
 		}
+		for _, config := range daemonSets {
+			apps = append(apps, config.Spec.Template.Labels[appLabel])
+			namespaces = append(namespaces, fixupNamespace(config.Namespace))
+			containers = append(containers, config.Spec.Template.Spec.Containers)
+		}
 		for idx, app := range apps {
 			checkedInAppsToContainers[app] = util.StringSet{}
 			for _, c := range containers[idx] {
diff --git a/k8s-checker/go/k8s_config/k8s_config.go b/k8s-checker/go/k8s_config/k8s_config.go
index 3eb3de6..49cf784 100644
--- a/k8s-checker/go/k8s_config/k8s_config.go
+++ b/k8s-checker/go/k8s_config/k8s_config.go
@@ -14,19 +14,21 @@
 	CronJobKind     = "CronJob"
 	DeploymentKind  = "Deployment"
 	StatefulSetKind = "StatefulSet"
+	DaemonSetKind   = "DaemonSet"
 )
 
 // ParseK8sConfigFile parses the given config file contents and returns the
 // configs it contains.
-func ParseK8sConfigFile(contents []byte) ([]*apps.Deployment, []*apps.StatefulSet, []*batch.CronJob, error) {
+func ParseK8sConfigFile(contents []byte) ([]*apps.Deployment, []*apps.StatefulSet, []*batch.CronJob, []*apps.DaemonSet, error) {
 	yamlDocs := strings.Split(string(contents), "---")
 	deployments := []*apps.Deployment{}
 	statefulSets := []*apps.StatefulSet{}
 	cronJobs := []*batch.CronJob{}
+	daemonSets := []*apps.DaemonSet{}
 	for _, yamlDoc := range yamlDocs {
 		deployment := new(apps.Deployment)
 		if err := yaml.Unmarshal([]byte(yamlDoc), deployment); err != nil {
-			return nil, nil, nil, skerr.Wrapf(err, "failed to parse config file")
+			return nil, nil, nil, nil, skerr.Wrapf(err, "failed to parse config file")
 		}
 		switch deployment.TypeMeta.Kind {
 		case DeploymentKind:
@@ -34,17 +36,23 @@
 		case StatefulSetKind:
 			statefulSet := new(apps.StatefulSet)
 			if err := yaml.Unmarshal([]byte(yamlDoc), statefulSet); err != nil {
-				return nil, nil, nil, skerr.Wrapf(err, "failed to parse config file")
+				return nil, nil, nil, nil, skerr.Wrapf(err, "failed to parse config file")
 			}
 			statefulSets = append(statefulSets, statefulSet)
 		case CronJobKind:
 			cronJob := new(batch.CronJob)
 			if err := yaml.Unmarshal([]byte(yamlDoc), cronJob); err != nil {
-				return nil, nil, nil, skerr.Wrapf(err, "failed to parse config file")
+				return nil, nil, nil, nil, skerr.Wrapf(err, "failed to parse config file")
 			}
 			cronJobs = append(cronJobs, cronJob)
+		case DaemonSetKind:
+			daemonSet := new(apps.DaemonSet)
+			if err := yaml.Unmarshal([]byte(yamlDoc), daemonSet); err != nil {
+				return nil, nil, nil, nil, skerr.Wrapf(err, "failed to parse config file")
+			}
+			daemonSets = append(daemonSets, daemonSet)
 		}
 
 	}
-	return deployments, statefulSets, cronJobs, nil
+	return deployments, statefulSets, cronJobs, daemonSets, nil
 }
diff --git a/k8s-checker/go/k8s_config/k8s_config_test.go b/k8s-checker/go/k8s_config/k8s_config_test.go
index 5e50608..855847a 100644
--- a/k8s-checker/go/k8s_config/k8s_config_test.go
+++ b/k8s-checker/go/k8s_config/k8s_config_test.go
@@ -171,11 +171,12 @@
 func TestParseK8sConfigFile_Success(t *testing.T) {
 	unittest.SmallTest(t)
 
-	deployments, statefulSets, cronJobs, err := ParseK8sConfigFile([]byte(k8sConfig))
+	deployments, statefulSets, cronJobs, daemonSets, err := ParseK8sConfigFile([]byte(k8sConfig))
 	require.NoError(t, err)
 	require.Len(t, deployments, 1)
 	require.Len(t, statefulSets, 1)
 	require.Len(t, cronJobs, 1)
+	require.Len(t, daemonSets, 0)
 	require.Equal(t, "gcr.io/skia-public/datahopper:2022-06-24T14_25_21Z-borenet-17bb7f4-clean", deployments[0].Spec.Template.Spec.Containers[0].Image)
 	require.Equal(t, "gcr.io/skia-public/autoroll-be:2022-06-21T13_56_34Z-borenet-33d442f-clean", statefulSets[0].Spec.Template.Spec.Containers[0].Image)
 	require.Equal(t, "gcr.io/skia-public/comp-ui-gitcron:2022-04-08T11_33_16Z-jcgregorio-72d31c9-clean", cronJobs[0].Spec.JobTemplate.Spec.Template.Spec.Containers[0].Image)
diff --git a/promk/go/genpromcrd/genpromcrd/genpromcrd.go b/promk/go/genpromcrd/genpromcrd/genpromcrd.go
index a939d2e..2bdda11 100644
--- a/promk/go/genpromcrd/genpromcrd/genpromcrd.go
+++ b/promk/go/genpromcrd/genpromcrd/genpromcrd.go
@@ -60,7 +60,7 @@
 		if err != nil {
 			return err
 		}
-		deployments, statefulSets, _, err := k8s_config.ParseK8sConfigFile(b)
+		deployments, statefulSets, _, _, err := k8s_config.ParseK8sConfigFile(b)
 		if err != nil {
 			return skerr.Wrapf(err, "failed to parse")
 		}