Skip to content

Commit

Permalink
Add a ramdisk-logs sidecar
Browse files Browse the repository at this point in the history
This implements the runlogwatch.sh approach of metal3[1] to write any
deployment logs to the console, making them accessable to the end user
via the same mechanism as other openstack service logs.

Jira: OSPRH-1947

[1] https://github.com/metal3-io/ironic-image/blob/main/scripts/runlogwatch.sh
  • Loading branch information
steveb committed Aug 26, 2024
1 parent e53574c commit 6665236
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 2 deletions.
23 changes: 23 additions & 0 deletions pkg/ironicconductor/statefulset.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,16 @@ func StatefulSet(
httpbootEnvVars["KOLLA_CONFIG_STRATEGY"] = env.SetValue("COPY_ALWAYS")
httpbootEnvVars["CONFIG_HASH"] = env.SetValue(configHash)

ramdiskLogsEnvVars := map[string]env.Setter{}
ramdiskLogsEnvVars["KOLLA_CONFIG_STRATEGY"] = env.SetValue("COPY_ALWAYS")
ramdiskLogsEnvVars["CONFIG_HASH"] = env.SetValue(configHash)
ramdiskLogsEnvVars["LOG_DIR"] = env.SetValue("/var/log/ironic/deploy")

volumes := GetVolumes(instance)
conductorVolumeMounts := GetVolumeMounts("ironic-conductor")
httpbootVolumeMounts := GetVolumeMounts("httpboot")
dnsmasqVolumeMounts := GetVolumeMounts("dnsmasq")
ramdiskLogsVolumeMounts := GetVolumeMounts("ramdisk-logs")
initVolumeMounts := GetInitVolumeMounts()

// Add the CA bundle
Expand All @@ -163,6 +169,7 @@ func StatefulSet(
conductorVolumeMounts = append(conductorVolumeMounts, instance.Spec.TLS.CreateVolumeMounts(nil)...)
httpbootVolumeMounts = append(httpbootVolumeMounts, instance.Spec.TLS.CreateVolumeMounts(nil)...)
dnsmasqVolumeMounts = append(dnsmasqVolumeMounts, instance.Spec.TLS.CreateVolumeMounts(nil)...)
ramdiskLogsVolumeMounts = append(ramdiskLogsVolumeMounts, instance.Spec.TLS.CreateVolumeMounts(nil)...)
initVolumeMounts = append(initVolumeMounts, instance.Spec.TLS.CreateVolumeMounts(nil)...)
}

Expand Down Expand Up @@ -201,10 +208,26 @@ func StatefulSet(
LivenessProbe: httpbootLivenessProbe,
// StartupProbe: startupProbe,
}
ramdiskLogsContainer := corev1.Container{
Name: "ramdisk-logs",
Command: []string{
"/bin/bash",
},
Image: instance.Spec.ContainerImage,
Env: env.MergeEnvs([]corev1.EnvVar{}, ramdiskLogsEnvVars),
VolumeMounts: ramdiskLogsVolumeMounts,
SecurityContext: &corev1.SecurityContext{
RunAsUser: &runAsUser,
Capabilities: &corev1.Capabilities{
Drop: []corev1.Capability{"ALL"},
},
},
}

containers := []corev1.Container{
conductorContainer,
httpbootContainer,
ramdiskLogsContainer,
}

if instance.Spec.ProvisionNetwork != "" {
Expand Down
18 changes: 18 additions & 0 deletions templates/ironicconductor/bin/runlogwatch.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/usr/bin/bash

# Ramdisk logs path
LOG_DIR=${LOG_DIR:-/var/log/ironic/deploy}

while :; do
if ! ls "${LOG_DIR}"/*.tar.gz 1> /dev/null 2>&1; then
continue
fi

for fn in "${LOG_DIR}"/*.tar.gz; do
echo "************ Contents of $fn ramdisk log file bundle **************"
tar -xOzvvf "$fn" | sed -e "s/^/$(basename "$fn"): /"
rm -f "$fn"
done

sleep 5
done
10 changes: 10 additions & 0 deletions templates/ironicconductor/config/ramdisk-logs-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"command": "/usr/local/bin/container-scripts/runlogwatch.sh",
"permissions": [
{
"path": "/var/log/ironic",
"owner": "ironic:ironic",
"recurse": true
}
]
}
4 changes: 2 additions & 2 deletions tests/functional/ironicconductor_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ var _ = Describe("IronicConductor controller", func() {
// Check the resulting deployment fields
Expect(int(*depl.Spec.Replicas)).To(Equal(1))
Expect(depl.Spec.Template.Spec.Volumes).To(HaveLen(6))
Expect(depl.Spec.Template.Spec.Containers).To(HaveLen(2))
Expect(depl.Spec.Template.Spec.Containers).To(HaveLen(3))

// cert deployment volumes
th.AssertVolumeExists(ironicNames.CaBundleSecretName.Name, depl.Spec.Template.Spec.Volumes)
Expand Down Expand Up @@ -309,7 +309,7 @@ var _ = Describe("IronicConductor controller", func() {
// Check the resulting deployment fields
Expect(int(*depl.Spec.Replicas)).To(Equal(1))
Expect(depl.Spec.Template.Spec.Volumes).To(HaveLen(6))
Expect(depl.Spec.Template.Spec.Containers).To(HaveLen(2))
Expect(depl.Spec.Template.Spec.Containers).To(HaveLen(3))

// Grab the current config hash
originalHash := GetEnvVarValue(
Expand Down

0 comments on commit 6665236

Please sign in to comment.