Skip to content

Commit fe6488b

Browse files
committed
use custom struct with omitempty tags
1 parent 17518c9 commit fe6488b

3 files changed

Lines changed: 60 additions & 43 deletions

File tree

pkg/controller/container-runtime-config/container_runtime_config_controller.go

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,7 @@ func generateOriginalCredentialProviderConfig(templateDir string, cc *mcfgv1.Con
690690
for _, gmc := range generatedConfigs {
691691
config, errCredProvider = findCredProviderConfig(gmc, credProviderConfigPath)
692692
if errCredProvider == nil {
693+
klog.Infof("find credential provider config in generated config %s: %v", gmc.Name, errCredProvider)
693694
gmcCredProviderConfig = config
694695
break
695696
}
@@ -1216,8 +1217,10 @@ func (ctrl *Controller) syncCRIOCredentialProviderConfig(key string) error {
12161217
klog.V(4).Infof("Finished syncing CRIOCredentialProvider config %q (%v)", key, time.Since(startTime))
12171218
}()
12181219

1219-
var crioCredentialProviderConfig *apicfgv1alpha1.CRIOCredentialProviderConfig
1220-
var err error
1220+
var (
1221+
crioCredentialProviderConfig *apicfgv1alpha1.CRIOCredentialProviderConfig
1222+
err error
1223+
)
12211224

12221225
if ctrl.crioCPObserversAdded {
12231226
crioCredentialProviderConfig, err = ctrl.criocpLister.Get("cluster")
@@ -1227,6 +1230,9 @@ func (ctrl *Controller) syncCRIOCredentialProviderConfig(key string) error {
12271230
} else if err != nil {
12281231
return err
12291232
}
1233+
} else {
1234+
klog.V(2).Infof("CRIOCredentialProviderConfig observer not added, skipping sync")
1235+
return nil
12301236
}
12311237

12321238
// Get ControllerConfig
@@ -1246,48 +1252,40 @@ func (ctrl *Controller) syncCRIOCredentialProviderConfig(key string) error {
12461252
}
12471253

12481254
for _, pool := range mcpPools {
1249-
role := pool.Name
12501255
applied := true
12511256

1257+
role := pool.Name
12521258
managedKeyCredentialProvider, err := getManagedKeyCRIOCredentialProvider(pool)
12531259
if err != nil {
12541260
return err
12551261
}
12561262

12571263
if err := retry.RetryOnConflict(updateBackoff, func() error {
1258-
12591264
if crioCredentialProviderConfig != nil {
12601265

12611266
credentialProviderConfigIgn, err := crioCredentialProviderConfigIgnition(ctrl.templatesDir, controllerConfig, role, crioCredentialProviderConfig)
12621267
if err != nil {
12631268
klog.Infof("could not generate CRIO Credential Provider Ignition config for role %s: %v", role, err)
12641269
return fmt.Errorf("could not generate CRIO Credential Provider Ignition config: %w", err)
12651270
}
1266-
applied, err = ctrl.syncIgnitionConfig(managedKeyCredentialProvider, credentialProviderConfigIgn, pool, ownerReferenceCredentialProviderConfig(crioCredentialProviderConfig))
1271+
ownerRef := ownerReferenceCredentialProviderConfig(crioCredentialProviderConfig)
1272+
klog.Infof("OwnerRef for CRIO Credential Provider Config: %v", ownerRef)
1273+
applied, err = ctrl.syncIgnitionConfig(managedKeyCredentialProvider, credentialProviderConfigIgn, pool, ownerRef)
12671274
if err != nil {
12681275
klog.Infof("could not sync CRIO Credential Provider Ignition config for role %s: %v", role, err)
12691276
return fmt.Errorf("could not sync CRIO Credential Provider Ignition config: %w", err)
12701277
}
12711278
}
1279+
12721280
return err
12731281
}); err != nil {
12741282
return fmt.Errorf("could not Create/Update MachineConfig: %w", err)
12751283
}
12761284

12771285
if applied {
1278-
klog.Infof("Applied CRIOCredentialProviderConfig on MachineConfigPool %v", pool.Name)
1279-
ctrlcommon.UpdateStateMetric(ctrlcommon.MCCSubControllerState, "machine-config-controller-container-runtime-config", "Sync CRIOCredentialProviderConfig", pool.Name)
1280-
}
1281-
1282-
// credProviderConfigIgn, err := generateOriginalCredentialProviderConfig(ctrl.templatesDir, controllerConfig, role)
1283-
// if err != nil {
1284-
// return fmt.Errorf("could not generate original CRIO credential provider config for role %s: %w", role, err)
1285-
// }
1286-
// contents, err := ctrlcommon.DecodeIgnitionFileContents(credProviderConfigIgn.Contents.Source, credProviderConfigIgn.Contents.Compression)
1287-
// if err != nil {
1288-
// return fmt.Errorf("could not decode CRIO credential provider config for role %s: %w", role, err)
1289-
// }
1290-
// klog.Infof("Decoded CRIO credential provider config contents successfully for role %s: %s", role, string(contents))
1286+
klog.Infof("Applied CRIOCredentialProviderConfig cluster on MachineConfigPool %v", pool.Name)
1287+
ctrlcommon.UpdateStateMetric(ctrlcommon.MCCSubControllerState, "machine-config-controller-container-runtime-config", "Sync CRIO Credential Provider Config", pool.Name)
1288+
}
12911289
}
12921290

12931291
return nil

pkg/controller/container-runtime-config/helpers.go

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,22 +1248,44 @@ func imagePolicyConfigFileList(namespaceJSONs map[string][]byte) []generatedConf
12481248
return namespacedPolicyConfigFileList
12491249
}
12501250

1251-
func credProviderConfigObject(contents []byte) (*kubeletconfig.CredentialProviderConfig, error) {
1252-
credProviderConfigObject := &kubeletconfig.CredentialProviderConfig{}
1251+
func credProviderConfigObject(contents []byte) (*credentialProviderConfigWithVersion, error) {
1252+
// Unmarshal into custom struct first to handle YAML with omitempty fields
1253+
credProviderConfigObject := &credentialProviderConfigWithVersion{}
12531254
err := yaml.Unmarshal(contents, credProviderConfigObject)
12541255
if err != nil {
12551256
return nil, fmt.Errorf("error unmarshalling credential provider config: %w", err)
12561257
}
1258+
12571259
return credProviderConfigObject, nil
12581260
}
12591261

1260-
type credentialProviderConfigVersioned struct {
1261-
APIVersion string `yaml:"apiVersion"`
1262-
Kind string `yaml:"kind"`
1263-
Providers []kubeletconfig.CredentialProvider `yaml:"providers"`
1262+
// credentialProviderWithTag is a custom struct with omitempty tags to avoid null values in YAML
1263+
type credentialProviderWithTag struct {
1264+
Name string `json:"name"`
1265+
MatchImages []string `json:"matchImages"`
1266+
DefaultCacheDuration *metav1.Duration `json:"defaultCacheDuration,omitempty"`
1267+
APIVersion string `json:"apiVersion"`
1268+
Args []string `json:"args,omitempty"`
1269+
Env []kubeletconfig.ExecEnvVar `json:"env,omitempty"`
1270+
TokenAttributes *serviceAccountTokenAttributesVersioned `json:"tokenAttributes,omitempty"`
1271+
}
1272+
1273+
// serviceAccountTokenAttributesVersioned is a custom struct with omitempty tags to avoid null values in YAML
1274+
type serviceAccountTokenAttributesVersioned struct {
1275+
ServiceAccountTokenAudience string `json:"serviceAccountTokenAudience"`
1276+
CacheType kubeletconfig.ServiceAccountTokenCacheType `json:"cacheType"`
1277+
RequireServiceAccount *bool `json:"requireServiceAccount"`
1278+
RequiredServiceAccountAnnotationKeys []string `json:"requiredServiceAccountAnnotationKeys,omitempty"`
1279+
OptionalServiceAccountAnnotationKeys []string `json:"optionalServiceAccountAnnotationKeys,omitempty"`
1280+
}
1281+
1282+
type credentialProviderConfigWithVersion struct {
1283+
APIVersion string `json:"apiVersion"`
1284+
Kind string `json:"kind"`
1285+
Providers []*credentialProviderWithTag `json:"providers"`
12641286
}
12651287

1266-
func updateCredentialProviderConfig(credProviderConfigObject *kubeletconfig.CredentialProviderConfig, matchImages map[string]bool) ([]byte, error) {
1288+
func updateCredentialProviderConfig(credProviderConfigObject *credentialProviderConfigWithVersion, matchImages map[string]bool) ([]byte, error) {
12671289

12681290
// matchImages is not expected to be empty here as the caller should skip calling this function if there are no images
12691291
images := []string{}
@@ -1287,12 +1309,12 @@ func updateCredentialProviderConfig(credProviderConfigObject *kubeletconfig.Cred
12871309
if crioCredProviderExist && crioCredProviderIdx != -1 {
12881310
credProviderConfigObject.Providers[crioCredProviderIdx].MatchImages = images
12891311
} else {
1290-
newProvider := kubeletconfig.CredentialProvider{
1312+
newProvider := &credentialProviderWithTag{
12911313
Name: crioCredentialProviderName,
12921314
MatchImages: images,
12931315
DefaultCacheDuration: &metav1.Duration{Duration: time.Second},
12941316
APIVersion: credentialProviderAPIVersion,
1295-
TokenAttributes: &kubeletconfig.ServiceAccountTokenAttributes{
1317+
TokenAttributes: &serviceAccountTokenAttributesVersioned{
12961318
ServiceAccountTokenAudience: "https://kubernetes.default.svc",
12971319
RequireServiceAccount: ptr.To(false),
12981320
CacheType: kubeletconfig.TokenServiceAccountTokenCacheType,
@@ -1301,15 +1323,10 @@ func updateCredentialProviderConfig(credProviderConfigObject *kubeletconfig.Cred
13011323
credProviderConfigObject.Providers = append(credProviderConfigObject.Providers, newProvider)
13021324
}
13031325

1304-
credProviderConfigVersionedObj := credentialProviderConfigVersioned{
1305-
APIVersion: "kubelet.config.k8s.io/v1",
1306-
Kind: "CredentialProviderConfig",
1307-
Providers: credProviderConfigObject.Providers,
1308-
}
1309-
1310-
credProviderConfigsYaml, err := yaml.Marshal(credProviderConfigVersionedObj)
1326+
credProviderConfigsYaml, err := yaml.Marshal(credProviderConfigObject)
13111327
if err != nil {
13121328
return nil, fmt.Errorf("error marshalling credential provider config: %v", err)
13131329
}
1330+
13141331
return credProviderConfigsYaml, nil
13151332
}

pkg/controller/container-runtime-config/helpers_test.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/json"
77
"errors"
88
"fmt"
9+
"log"
910
"os"
1011
"reflect"
1112
"testing"
@@ -27,7 +28,6 @@ import (
2728
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2829
"k8s.io/apimachinery/pkg/util/diff"
2930
"k8s.io/apimachinery/pkg/util/yaml"
30-
kubeletapiconfig "k8s.io/kubernetes/pkg/kubelet/apis/config"
3131
"k8s.io/utils/ptr"
3232
)
3333

@@ -2353,16 +2353,16 @@ providers:
23532353
matchImages []string
23542354
templateConfig []byte
23552355
expectError bool
2356-
expectedConfig *credentialProviderConfigVersioned
2356+
expectedConfig *credentialProviderConfigWithVersion
23572357
}{
23582358
{
23592359
name: "add crio-credential-provider when not present",
23602360
matchImages: []string{"myhost.com", "quay.io"},
23612361
templateConfig: templateCredProviderConfig,
2362-
expectedConfig: &credentialProviderConfigVersioned{
2362+
expectedConfig: &credentialProviderConfigWithVersion{
23632363
APIVersion: "kubelet.config.k8s.io/v1",
23642364
Kind: "CredentialProviderConfig",
2365-
Providers: []kubeletapiconfig.CredentialProvider{
2365+
Providers: []*credentialProviderWithTag{
23662366
{
23672367
Name: "gcr-credential-provider",
23682368
APIVersion: "credentialprovider.kubelet.k8s.io/v1",
@@ -2375,7 +2375,7 @@ providers:
23752375
MatchImages: []string{"myhost.com", "quay.io"},
23762376
APIVersion: "credentialprovider.kubelet.k8s.io/v1",
23772377
DefaultCacheDuration: &metav1.Duration{Duration: time.Second},
2378-
TokenAttributes: &kubeletapiconfig.ServiceAccountTokenAttributes{
2378+
TokenAttributes: &serviceAccountTokenAttributesVersioned{
23792379
ServiceAccountTokenAudience: "https://kubernetes.default.svc",
23802380
CacheType: "Token",
23812381
RequireServiceAccount: ptr.To(false),
@@ -2388,10 +2388,10 @@ providers:
23882388
name: "crio-credential-provider already present",
23892389
matchImages: []string{"myhost.com"},
23902390
templateConfig: templateCredProviderConfigWithCRIOProvider,
2391-
expectedConfig: &credentialProviderConfigVersioned{
2391+
expectedConfig: &credentialProviderConfigWithVersion{
23922392
APIVersion: "kubelet.config.k8s.io/v1",
23932393
Kind: "CredentialProviderConfig",
2394-
Providers: []kubeletapiconfig.CredentialProvider{
2394+
Providers: []*credentialProviderWithTag{
23952395
{
23962396
Name: "gcr-credential-provider",
23972397
APIVersion: "credentialprovider.kubelet.k8s.io/v1",
@@ -2404,7 +2404,7 @@ providers:
24042404
MatchImages: []string{"myhost.com"},
24052405
APIVersion: "credentialprovider.kubelet.k8s.io/v1",
24062406
DefaultCacheDuration: &metav1.Duration{Duration: time.Second},
2407-
TokenAttributes: &kubeletapiconfig.ServiceAccountTokenAttributes{
2407+
TokenAttributes: &serviceAccountTokenAttributesVersioned{
24082408
ServiceAccountTokenAudience: "https://kubernetes.default.svc",
24092409
CacheType: "Token",
24102410
RequireServiceAccount: ptr.To(false),
@@ -2431,7 +2431,9 @@ providers:
24312431
}
24322432
require.NoError(t, err)
24332433

2434-
var gotConfig credentialProviderConfigVersioned
2434+
log.Println("updated bytes: ", string(updatedConfigBytes))
2435+
2436+
var gotConfig credentialProviderConfigWithVersion
24352437
err = yaml.Unmarshal(updatedConfigBytes, &gotConfig)
24362438
require.NoError(t, err)
24372439
assert.Equal(t, tt.expectedConfig, &gotConfig)

0 commit comments

Comments
 (0)