[sk8s] Record the k8s image name of each pod.

The associated YAML CL is https://skia-review.googlesource.com/c/k8s-config/+/288817.

Change-Id: I85bfa501dbf09b100491b0bb4521c7a1ec3f5574
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/289622
Reviewed-by: Kevin Lubick <kjlubick@google.com>
Commit-Queue: Joe Gregorio <jcgregorio@google.com>
diff --git a/machine/go/machine/machine.go b/machine/go/machine/machine.go
index ca988bc..894f6d1 100644
--- a/machine/go/machine/machine.go
+++ b/machine/go/machine/machine.go
@@ -48,13 +48,18 @@
 	Annotation Annotation
 	Dimensions SwarmingDimensions
 	PodName    string
+
+	// KubernetesImage is the kubernetes image name.
+	KubernetesImage string
+
 	// ScheduledForDeletion will be a non-empty string and equal to PodName if
 	// the pod should be deleted.
 	ScheduledForDeletion string
-	LastUpdated          time.Time
-	Battery              int                // Charge as an integer percent, e.g. 50% = 50.
-	Temperature          map[string]float64 // In Celsius.
-	RunningSwarmingTask  bool
+
+	LastUpdated         time.Time
+	Battery             int                // Charge as an integer percent, e.g. 50% = 50.
+	Temperature         map[string]float64 // In Celsius.
+	RunningSwarmingTask bool
 }
 
 // NewDescription returns a new Description instance.
@@ -104,6 +109,9 @@
 
 	// PodName is the kubernetes pod name.
 	PodName string `json:"pod_name"`
+
+	// KubernetesImage is the container image being run.
+	KubernetesImage string `json:"image"`
 }
 
 // Event is the information a machine should send via Source when
diff --git a/machine/go/machine/machine_test.go b/machine/go/machine/machine_test.go
index c9a8b8c..9290640 100644
--- a/machine/go/machine/machine_test.go
+++ b/machine/go/machine/machine_test.go
@@ -24,6 +24,7 @@
 			"foo": []string{"bar"},
 		},
 		PodName:              "rpi-swarming-1235-987",
+		KubernetesImage:      "gcr.io/skia-public/rpi-swarming-client:2020-05-09T19_28_20Z-jcgregorio-4fef3ca-clean",
 		ScheduledForDeletion: "rpi-swarming-1235-987",
 		LastUpdated:          testTime,
 		Battery:              91,
diff --git a/machine/go/machine/processor/impl.go b/machine/go/machine/processor/impl.go
index 952a182..e19c0e8 100644
--- a/machine/go/machine/processor/impl.go
+++ b/machine/go/machine/processor/impl.go
@@ -155,6 +155,7 @@
 	ret.RunningSwarmingTask = event.RunningSwarmingTask
 	ret.PodName = event.Host.PodName
 	ret.LastUpdated = time.Now()
+	ret.KubernetesImage = event.Host.KubernetesImage
 	for k, values := range dimensions {
 		ret.Dimensions[k] = values
 	}
diff --git a/machine/go/machine/processor/impl_test.go b/machine/go/machine/processor/impl_test.go
index a5c6a97..c8b18dd 100644
--- a/machine/go/machine/processor/impl_test.go
+++ b/machine/go/machine/processor/impl_test.go
@@ -148,8 +148,9 @@
 			GetProp: props,
 		},
 		Host: machine.Host{
-			Name:    "skia-rpi2-0001",
-			PodName: "rpi-swarming-12345-987",
+			Name:            "skia-rpi2-0001",
+			PodName:         "rpi-swarming-12345-987",
+			KubernetesImage: "gcr.io/skia-public/rpi-swarming-client:2020-05-09T19_28_20Z-jcgregorio-4fef3ca-clean",
 		},
 	}
 
@@ -172,6 +173,7 @@
 	assert.Equal(t, expected, next.Dimensions)
 	assert.Equal(t, machine.ModeAvailable, next.Mode)
 	assert.Equal(t, event.Host.PodName, next.PodName)
+	assert.Equal(t, event.Host.KubernetesImage, next.KubernetesImage)
 }
 
 func TestProcess_DetectInsideDocker(t *testing.T) {
diff --git a/sk8s/go/bot_config/machine/machine.go b/sk8s/go/bot_config/machine/machine.go
index 4e9b112..baa6024 100644
--- a/sk8s/go/bot_config/machine/machine.go
+++ b/sk8s/go/bot_config/machine/machine.go
@@ -41,6 +41,9 @@
 	// Hostname is the hostname(), which is the pod name under k8s.
 	Hostname string
 
+	// KubernetesImage is the container image being run.
+	KubernetesImage string
+
 	// Metrics
 	interrogateTimer           metrics2.Float64SummaryMetric
 	interrogateAndSendFailures metrics2.Counter
@@ -69,6 +72,7 @@
 	}
 
 	machineID := os.Getenv(swarming.SwarmingBotIDEnvVar)
+	kubernetesImage := os.Getenv(swarming.KubernetesImageEnvVar)
 	hostname, err := os.Hostname()
 	if err != nil {
 		return nil, skerr.Wrapf(err, "Could not determine hostname.")
@@ -81,6 +85,7 @@
 		adb:                        adb.New(),
 		MachineID:                  machineID,
 		Hostname:                   hostname,
+		KubernetesImage:            kubernetesImage,
 		interrogateTimer:           metrics2.GetFloat64SummaryMetric("bot_config_machine_interrogate_timer", map[string]string{"machine": machineID}),
 		interrogateAndSendFailures: metrics2.GetCounter("bot_config_machine_interrogate_and_send_errors", map[string]string{"machine": machineID}),
 		storeWatchArrivalCounter:   metrics2.GetCounter("bot_config_machine_store_watch_arrival", map[string]string{"machine": machineID}),
@@ -94,6 +99,7 @@
 	ret := machine.NewEvent()
 	ret.Host.Name = m.MachineID
 	ret.Host.PodName = m.Hostname
+	ret.Host.KubernetesImage = m.KubernetesImage
 
 	if props, err := m.adb.RawProperties(ctx); err != nil {
 		sklog.Infof("Failed to read android properties: %s", err)
diff --git a/sk8s/go/bot_config/machine/machine_test.go b/sk8s/go/bot_config/machine/machine_test.go
index 6b8e19d..41a70c2 100644
--- a/sk8s/go/bot_config/machine/machine_test.go
+++ b/sk8s/go/bot_config/machine/machine_test.go
@@ -81,6 +81,17 @@
 		require.NoError(t, err)
 	}()
 
+	const imageName = "gcr.io/skia-public/rpi-swarming-client:2020-05-09T19_28_20Z-jcgregorio-4fef3ca-clean"
+
+	// Set the IMAGE_NAME env variable.
+	oldImageVar := os.Getenv(swarming.KubernetesImageEnvVar)
+	err = os.Setenv(swarming.KubernetesImageEnvVar, imageName)
+	require.NoError(t, err)
+	defer func() {
+		err = os.Setenv(swarming.KubernetesImageEnvVar, oldImageVar)
+		require.NoError(t, err)
+	}()
+
 	// Create a Machine instance.
 	m, err := New(ctx, true, instanceConfig)
 	require.NoError(t, err)
@@ -130,8 +141,9 @@
 				DumpsysThermalService: adbShellDumpSysBattery,
 			},
 			Host: machine.Host{
-				Name:    "my-test-bot-001",
-				PodName: hostname,
+				Name:            "my-test-bot-001",
+				PodName:         hostname,
+				KubernetesImage: imageName,
 			},
 		},
 		event)
diff --git a/sk8s/go/bot_config/swarming/swarming.go b/sk8s/go/bot_config/swarming/swarming.go
index ed4e4db..3ca38c1 100644
--- a/sk8s/go/bot_config/swarming/swarming.go
+++ b/sk8s/go/bot_config/swarming/swarming.go
@@ -45,6 +45,13 @@
 	// SwarmingBotIDEnvVar is the swarming bot id environment variable name. See
 	// https://chromium.googlesource.com/infra/luci/luci-py.git/+/master/appengine/swarming/doc/Magic-Values.md#task-runtime-environment-variables
 	SwarmingBotIDEnvVar = "SWARMING_BOT_ID"
+
+	// KubernetesImageEnvVar is the environment variable that contains the
+	// daemonset image name.
+	//
+	// See https://skia.googlesource.com/k8s-config/+/refs/heads/master/skolo-rack4/rpi-swarming-daemonset.yaml
+	// where IMAGE_NAME is set.
+	KubernetesImageEnvVar = "IMAGE_NAME"
 )
 
 // New creates a new *Bot instance.