internal/manifests/dcgmexporter/container.go (66 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package dcgmexporter
import (
"fmt"
"sort"
"github.com/go-logr/logr"
corev1 "k8s.io/api/core/v1"
"github.com/aws/amazon-cloudwatch-agent-operator/apis/v1alpha1"
"github.com/aws/amazon-cloudwatch-agent-operator/internal/config"
)
const (
configmapMountPath = "/etc/dcgm-exporter"
metricsConfigEnvVar = "DCGM_EXPORTER_COLLECTORS"
)
// Container builds a container for the given dcgm exporter.
func Container(cfg config.Config, logger logr.Logger, exporter v1alpha1.DcgmExporter) corev1.Container {
image := exporter.Spec.Image
if len(image) == 0 {
image = cfg.DcgmExporterImage()
}
ports := make([]corev1.ContainerPort, 0, len(exporter.Spec.Ports))
for _, p := range exporter.Spec.Ports {
ports = append(ports, corev1.ContainerPort{
Name: p.Name,
ContainerPort: p.Port,
Protocol: p.Protocol,
})
}
argsMap := exporter.Spec.Args
if argsMap == nil {
argsMap = map[string]string{}
}
if len(exporter.Spec.TlsConfig) > 0 {
argsMap["web-config-file"] = fmt.Sprintf("%s/%s", configmapMountPath, DcgmWebConfigYaml)
}
// defines the output (sorted) array for final output
var args []string
// ensure that the v1alpha1.DcgmExporterSpec.Args are ordered when moved to container.Args,
// where iterating over a map does not guarantee, so that reconcile will not be fooled by different
// ordering in args.
var sortedArgs []string
for k, v := range argsMap {
sortedArgs = append(sortedArgs, fmt.Sprintf("--%s=%s", k, v))
}
sort.Strings(sortedArgs)
args = append(args, sortedArgs...)
var volumeMounts []corev1.VolumeMount
volumeMounts = append(volumeMounts, corev1.VolumeMount{
Name: DcgmConfigMapVolumeName,
MountPath: configmapMountPath,
})
if len(exporter.Spec.VolumeMounts) > 0 {
volumeMounts = append(volumeMounts, exporter.Spec.VolumeMounts...)
}
var envVars = exporter.Spec.Env
if exporter.Spec.Env == nil {
envVars = []corev1.EnvVar{}
}
envVars = append(envVars, corev1.EnvVar{
Name: metricsConfigEnvVar,
Value: fmt.Sprintf("%s/%s", configmapMountPath, DcgmMetricsIncludedCsv),
})
return corev1.Container{
Name: ComponentDcgmExporter,
Image: image,
Args: args,
Resources: exporter.Spec.Resources,
Env: envVars,
Ports: ports,
VolumeMounts: volumeMounts,
}
}