in operator/scripts/generate-image-configmap/main.go [58:184]
func run(ctx context.Context) error {
log := klog.FromContext(ctx)
cc := &corev1beta1.ConfigConnector{
Spec: corev1beta1.ConfigConnectorSpec{
Mode: k8s.NamespacedMode,
GoogleServiceAccount: "someGSA",
},
}
operatorSrcRoot := paths.GetOperatorSrcRootOrLogFatal()
r := cnrmmanifest.NewLocalRepository(path.Join(operatorSrcRoot, "channels"))
channel, err := r.LoadChannel(ctx, k8s.StableChannel)
if err != nil {
return fmt.Errorf("error loading %v channel: %w", k8s.StableChannel, err)
}
version, err := channel.Latest(ctx, cc.ComponentName())
if err != nil {
return fmt.Errorf("error resolving the version to deploy: %w", err)
}
if version == nil {
return fmt.Errorf("could not find the latest version in channel %v", k8s.StableChannel)
}
log.Info("got latest version from channel", "version", version.Version)
manifestStrs, err := r.LoadManifest(ctx, cc.ComponentName(), version.Version, cc)
if err != nil {
return fmt.Errorf("error loading manifest for package %v of version %v: %w", version.Package, version.Version, err)
}
objects := make([]*manifest.Object, 0)
for _, str := range manifestStrs {
m, err := manifest.ParseObjects(ctx, str)
if err != nil {
return fmt.Errorf("parsing manifest: %w", err)
}
objects = append(objects, m.Items...)
}
namespacedStrs, err := r.LoadNamespacedComponents(ctx, cc.ComponentName(), version.Version)
if err != nil {
return fmt.Errorf("error loading namespaced components for package %v of version %v: %w", version.Package, version.Version, err)
}
for _, str := range namespacedStrs {
m, err := manifest.ParseObjects(ctx, str)
if err != nil {
return fmt.Errorf("parsing manifest: %w", err)
}
objects = append(objects, m.Items...)
}
cm := corev1.ConfigMap{
TypeMeta: metav1.TypeMeta{
Kind: "ConfigMap",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "config-images",
Namespace: k8s.OperatorSystemNamespace,
Labels: map[string]string{
"addonmanager.kubernetes.io/mode": "Reconcile",
"cnrm.cloud.google.com/operator-system": "true",
},
Annotations: map[string]string{
"components.gke.io/image-map": "Images deployed by operator",
},
},
Data: make(map[string]string, 0),
}
for _, obj := range objects {
log.Info("found object", "kind", obj.Kind, "name", obj.GetName())
// controller image
if obj.Kind == "StatefulSet" && strings.Contains(obj.GetName(), "cnrm-controller-manager") {
image, err := extractImageFromStatefulSet(obj.UnstructuredObject(), "manager")
if err != nil {
return fmt.Errorf("error resolving manager image: %w", err)
}
cm.Data["cnrm.controller"] = image
}
// deletion defender image
if obj.Kind == "StatefulSet" && obj.GetName() == "cnrm-deletiondefender" {
image, err := extractImageFromStatefulSet(obj.UnstructuredObject(), "deletiondefender")
if err != nil {
return fmt.Errorf("error resolving manager image: %w", err)
}
cm.Data["cnrm.deletiondefender"] = image
}
// unmanaged detector image
if obj.Kind == "StatefulSet" && obj.GetName() == "cnrm-unmanaged-detector" {
image, err := extractImageFromStatefulSet(obj.UnstructuredObject(), "unmanageddetector")
if err != nil {
return fmt.Errorf("error resolving manager image: %w", err)
}
cm.Data["cnrm.unmanageddetector"] = image
}
// webhook image
if obj.Kind == "Deployment" && obj.GetName() == "cnrm-webhook-manager" {
image, err := extractImageFromDeployment(obj.UnstructuredObject(), "webhook")
if err != nil {
return fmt.Errorf("error resolving webhook image: %w", err)
}
cm.Data["cnrm.webhook"] = image
}
// recorder image
if obj.Kind == "Deployment" && obj.GetName() == "cnrm-resource-stats-recorder" {
image, err := extractImageFromDeployment(obj.UnstructuredObject(), "recorder")
if err != nil {
return fmt.Errorf("error resolving recorder image: %w", err)
}
cm.Data["cnrm.recorder"] = image
}
// prom-to-sd sidecar image
if obj.Kind == "Deployment" && obj.GetName() == "cnrm-resource-stats-recorder" {
image, err := extractImageFromDeployment(obj.UnstructuredObject(), "prom-to-sd")
if err != nil {
return fmt.Errorf("error resolving prom-to-sd sidecar image: %w", err)
}
cm.Data["prom-to-sd"] = image
}
}
outputFilepath := path.Join(operatorSrcRoot, outputDir, outputFilename)
if err := outputConfigMapToFile(&cm, outputFilepath); err != nil {
return fmt.Errorf("error writing ConfigMap %v to file: %w", cm, err)
}
log.Info("successfully generated the image configmap", "path", outputFilepath)
return nil
}