Skip to content

Commit d809870

Browse files
committed
todo
1 parent 63fc2ef commit d809870

23 files changed

Lines changed: 950 additions & 27 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,4 +457,4 @@ replace (
457457

458458
replace github.com/openshift/api => github.com/QiWang19/api v0.0.0-20251204232509-5086a5249b02
459459

460-
replace github.com/openshift/client-go => github.com/QiWang19/client-go v0.0.0-20251206033140-b1d9ec91d591
460+
replace github.com/openshift/client-go => github.com/QiWang19/client-go v0.0.0-20251206041215-b807c9cdcceb

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBi
5252
github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE=
5353
github.com/QiWang19/api v0.0.0-20251204232509-5086a5249b02 h1:AatkJOk7B+A66PUpR02ZvtEafkaL8Mzn9vC6wqJrOgo=
5454
github.com/QiWang19/api v0.0.0-20251204232509-5086a5249b02/go.mod h1:d5uzF0YN2nQQFA0jIEWzzOZ+edmo6wzlGLvx5Fhz4uY=
55-
github.com/QiWang19/client-go v0.0.0-20251206033140-b1d9ec91d591 h1:nq5D1MflQVwqNcDNW3Z+3bo1mDdQLfABzBoYAbSX+X0=
56-
github.com/QiWang19/client-go v0.0.0-20251206033140-b1d9ec91d591/go.mod h1:iylwyks15hQrMFoa76LqqB5O53iIECos27GarEef8n8=
55+
github.com/QiWang19/client-go v0.0.0-20251206041215-b807c9cdcceb h1:Wjt5SbxzEsHN1KSmE4kmBZjqoOQnSM+7JyhSXBH89jc=
56+
github.com/QiWang19/client-go v0.0.0-20251206041215-b807c9cdcceb/go.mod h1:iylwyks15hQrMFoa76LqqB5O53iIECos27GarEef8n8=
5757
github.com/ajeddeloh/go-json v0.0.0-20170920214419-6a2fe990e083/go.mod h1:otnto4/Icqn88WCcM4bhIJNSgsh9VLBuspyyCfvof9c=
5858
github.com/ajeddeloh/go-json v0.0.0-20200220154158-5ae607161559 h1:4SPQljF/GJ8Q+QlCWMWxRBepub4DresnOm4eI2ebFGc=
5959
github.com/ajeddeloh/go-json v0.0.0-20200220154158-5ae607161559/go.mod h1:otnto4/Icqn88WCcM4bhIJNSgsh9VLBuspyyCfvof9c=

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

Lines changed: 104 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
signature "github.com/containers/image/v5/signature"
1414
ign3types "github.com/coreos/ignition/v2/config/v3_5/types"
1515
apicfgv1 "github.com/openshift/api/config/v1"
16+
apicfgv1alpha1 "github.com/openshift/api/config/v1alpha1"
1617
features "github.com/openshift/api/features"
1718
apioperatorsv1alpha1 "github.com/openshift/api/operator/v1alpha1"
1819
configclientset "github.com/openshift/client-go/config/clientset/versioned"
@@ -110,17 +111,19 @@ type Controller struct {
110111
itmsLister cligolistersv1.ImageTagMirrorSetLister
111112
itmsListerSynced cache.InformerSynced
112113

113-
criocpLister cligolistersv1alpha1.CRIOCredentialProviderConfigLister
114-
criocpListerSynced cache.InformerSynced
115-
addedCRIOCPObservers bool
114+
criocpLister cligolistersv1alpha1.CRIOCredentialProviderConfigLister
115+
criocpListerSynced cache.InformerSynced
116+
addedCRIOCPObservers bool
117+
criocpInformerFactoryAdded bool
116118

117119
configInformerFactory configinformers.SharedInformerFactory
118120
clusterImagePolicyLister cligolistersv1.ClusterImagePolicyLister
119121
clusterImagePolicyListerSynced cache.InformerSynced
120122

121-
imagePolicyLister cligolistersv1.ImagePolicyLister
122-
imagePolicyListerSynced cache.InformerSynced
123-
addedPolicyObservers bool
123+
imagePolicyLister cligolistersv1.ImagePolicyLister
124+
imagePolicyListerSynced cache.InformerSynced
125+
addedPolicyObservers bool
126+
policyInformerFactoryAdded bool
124127

125128
mcpLister mcfglistersv1.MachineConfigPoolLister
126129
mcpListerSynced cache.InformerSynced
@@ -247,15 +250,23 @@ func (ctrl *Controller) Run(workers int, stopCh <-chan struct{}) {
247250
if ctrl.sigstoreAPIEnabled() {
248251
ctrl.addImagePolicyObservers()
249252
klog.Info("addded image policy observers with sigstore featuregate enabled")
250-
ctrl.configInformerFactory.Start(stopCh)
251-
listerCaches = append(listerCaches, ctrl.clusterImagePolicyListerSynced, ctrl.imagePolicyListerSynced)
252-
ctrl.addedPolicyObservers = true
253253
}
254254

255+
klog.Info("Waiting for featuregate criocredentialproviderconfig to be enabled/disabled")
256+
255257
if ctrl.criocpEnabled() {
256258
ctrl.addCRIOCPObservers()
257259
klog.Info("added CRIOCredentialProviderConfig observers with CRIOCredentialProviderConfig featuregate enabled")
258-
ctrl.configInformerFactory.Start(stopCh)
260+
}
261+
262+
ctrl.configInformerFactory.Start(stopCh)
263+
264+
if ctrl.policyInformerFactoryAdded {
265+
listerCaches = append(listerCaches, ctrl.clusterImagePolicyListerSynced, ctrl.imagePolicyListerSynced)
266+
ctrl.addedPolicyObservers = true
267+
}
268+
269+
if ctrl.criocpInformerFactoryAdded {
259270
listerCaches = append(listerCaches, ctrl.criocpListerSynced)
260271
ctrl.addedCRIOCPObservers = true
261272
}
@@ -346,6 +357,7 @@ func (ctrl *Controller) addCRIOCPObservers() {
346357
})
347358
ctrl.criocpLister = ctrl.configInformerFactory.Config().V1alpha1().CRIOCredentialProviderConfigs().Lister()
348359
ctrl.criocpListerSynced = ctrl.configInformerFactory.Config().V1alpha1().CRIOCredentialProviderConfigs().Informer().HasSynced
360+
ctrl.criocpInformerFactoryAdded = true
349361
}
350362

351363
func (ctrl *Controller) criocpConfAdded(_ interface{}) {
@@ -379,6 +391,7 @@ func (ctrl *Controller) addImagePolicyObservers() {
379391
})
380392
ctrl.imagePolicyLister = ctrl.configInformerFactory.Config().V1().ImagePolicies().Lister()
381393
ctrl.imagePolicyListerSynced = ctrl.configInformerFactory.Config().V1().ImagePolicies().Informer().HasSynced
394+
ctrl.policyInformerFactoryAdded = true
382395
}
383396

384397
func (ctrl *Controller) clusterImagePolicyAdded(_ interface{}) {
@@ -410,6 +423,7 @@ func (ctrl *Controller) sigstoreAPIEnabled() bool {
410423
}
411424

412425
func (ctrl *Controller) criocpEnabled() bool {
426+
klog.Infof("CRIOCredentialProviderConfig feature gate enabled: %v", ctrl.fgHandler.Enabled(features.FeatureGateCRIOCredentialProviderConfig))
413427
return ctrl.fgHandler.Enabled(features.FeatureGateCRIOCredentialProviderConfig)
414428
}
415429

@@ -637,15 +651,15 @@ func generateOriginalContainerRuntimeConfigs(templateDir string, cc *mcfgv1.Cont
637651
return gmcStorageConfig, gmcRegistriesConfig, gmcPolicyJSON, nil
638652
}
639653

640-
func generateOriginalCredentialProviderConfig(templateDir string, cc *mcfgv1.ControllerConfig, role string) (*ign3types.File, error) {
654+
func generateOriginalCredentialProviderConfig(templateDir string, cc *mcfgv1.ControllerConfig, role string) (*ign3types.File, string, error) {
641655

642656
// Render the default templates
643657
rc := &mtmpl.RenderConfig{
644658
ControllerConfigSpec: &cc.Spec,
645659
}
646660
generatedConfigs, err := mtmpl.GenerateMachineConfigsForRole(rc, role, templateDir)
647661
if err != nil {
648-
return nil, fmt.Errorf("generateMachineConfigsforRole failed with error %w", err)
662+
return nil, "", fmt.Errorf("generateMachineConfigsforRole failed with error %w", err)
649663
}
650664
// Find generated provider.yaml
651665
var (
@@ -665,7 +679,7 @@ func generateOriginalCredentialProviderConfig(templateDir string, cc *mcfgv1.Con
665679
case apicfgv1.AzurePlatformType:
666680
credProviderConfigPath = fmt.Sprintf(credProviderConfigPathFormat, "acr")
667681
default:
668-
return nil, fmt.Errorf("unsupported platform type: %s", cc.Spec.Infra.Status.PlatformStatus.Type)
682+
return nil, "", fmt.Errorf("unsupported platform type: %s", cc.Spec.Infra.Status.PlatformStatus.Type)
669683
}
670684
klog.Infof("credential provider config path set to: %s", credProviderConfigPath)
671685

@@ -674,14 +688,14 @@ func generateOriginalCredentialProviderConfig(templateDir string, cc *mcfgv1.Con
674688
config, errCredProvider = findCredProviderConfig(gmc, credProviderConfigPath)
675689
if errCredProvider != nil {
676690
klog.Infof("could not find credential provider config in generated config %s: %v", gmc.Name, errCredProvider)
677-
return nil, fmt.Errorf("could not generate original credential provider configs: %w", errCredProvider)
691+
return nil, "", fmt.Errorf("could not generate original credential provider configs: %w", errCredProvider)
678692
}
679693

680694
gmcCredProviderConfig = config
681695

682696
}
683697

684-
return gmcCredProviderConfig, nil
698+
return gmcCredProviderConfig, credProviderConfigPath, nil
685699
}
686700

687701
func (ctrl *Controller) syncStatusOnly(cfg *mcfgv1.ContainerRuntimeConfig, err error, args ...interface{}) error {
@@ -1076,6 +1090,7 @@ func (ctrl *Controller) syncImageConfig(key string) error {
10761090
clusterScopePolicies map[string]signature.PolicyRequirements
10771091
imagePolicies []*apicfgv1.ImagePolicy
10781092
scopeNamespacePolicies map[string]map[string]signature.PolicyRequirements
1093+
crioCredentialProviderConfig *apicfgv1alpha1.CRIOCredentialProviderConfig
10791094
)
10801095

10811096
if ctrl.sigstoreAPIEnabled() && ctrl.addedPolicyObservers {
@@ -1095,6 +1110,15 @@ func (ctrl *Controller) syncImageConfig(key string) error {
10951110
}
10961111
}
10971112

1113+
if ctrl.addedCRIOCPObservers {
1114+
crioCredentialProviderConfig, err = ctrl.criocpLister.Get("cluster")
1115+
if err != nil && errors.IsNotFound(err) {
1116+
crioCredentialProviderConfig = &apicfgv1alpha1.CRIOCredentialProviderConfig{}
1117+
} else if err != nil {
1118+
return nil
1119+
}
1120+
}
1121+
10981122
if clusterVersionCfg != nil {
10991123
// The possibility of releaseImage being "" is very unlikely, will only happen if clusterVersionCfg is nil. If this happens
11001124
// then there is something very wrong with the cluster and in that situation it would be best to fail here till clusterVersionCfg
@@ -1137,6 +1161,12 @@ func (ctrl *Controller) syncImageConfig(key string) error {
11371161
if err != nil {
11381162
return err
11391163
}
1164+
1165+
managedKeyCredentialProvider, err := getManagedKeyCRIOCredentialProvider(pool)
1166+
if err != nil {
1167+
return err
1168+
}
1169+
11401170
if err := retry.RetryOnConflict(updateBackoff, func() error {
11411171
registriesIgn, err := registriesConfigIgnition(ctrl.templatesDir, controllerConfig, role, releaseImage,
11421172
imgcfg.Spec.RegistrySources.InsecureRegistries, registriesBlocked, policyBlocked, allowedRegs,
@@ -1150,7 +1180,19 @@ func (ctrl *Controller) syncImageConfig(key string) error {
11501180
return fmt.Errorf("could not sync registries Ignition config: %w", err)
11511181
}
11521182

1153-
crioCredentialProviderConfigIgnition(ctrl.templatesDir, controllerConfig, role, releaseImage)
1183+
if crioCredentialProviderConfig != nil {
1184+
1185+
credentialProviderConfigIgn, err := crioCredentialProviderConfigIgnition(ctrl.templatesDir, controllerConfig, role, crioCredentialProviderConfig)
1186+
if err != nil {
1187+
klog.Infof("could not generate CRIO Credential Provider Ignition config for role %s: %v", role, err)
1188+
return fmt.Errorf("could not generate CRIO Credential Provider Ignition config: %w", err)
1189+
}
1190+
applied, err = ctrl.syncIgnitionConfig(managedKeyCredentialProvider, credentialProviderConfigIgn, pool, ownerReferenceCredentialProviderConfig(crioCredentialProviderConfig))
1191+
if err != nil {
1192+
klog.Infof("could not sync CRIO Credential Provider Ignition config for role %s: %v", role, err)
1193+
return fmt.Errorf("could not sync CRIO Credential Provider Ignition config: %w", err)
1194+
}
1195+
}
11541196

11551197
return err
11561198
}); err != nil {
@@ -1548,15 +1590,55 @@ func (ctrl *Controller) getPoolsForContainerRuntimeConfig(config *mcfgv1.Contain
15481590
return pools, nil
15491591
}
15501592

1551-
func crioCredentialProviderConfigIgnition(templateDir string, controllerConfig *mcfgv1.ControllerConfig, role, releaseImage string) error {
1552-
credProviderConfigIgn, err := generateOriginalCredentialProviderConfig(templateDir, controllerConfig, role)
1593+
func crioCredentialProviderConfigIgnition(templateDir string, controllerConfig *mcfgv1.ControllerConfig, role string, crioCredentialProviderConfig *apicfgv1alpha1.CRIOCredentialProviderConfig) (*ign3types.Config, error) {
1594+
1595+
var credProviderConfigYaml []byte
1596+
1597+
originalCredProviderConfigIgn, credProviderConfigPath, err := generateOriginalCredentialProviderConfig(templateDir, controllerConfig, role)
15531598
if err != nil {
1554-
return fmt.Errorf("could not generate original CRIO credential provider config for role %s: %w", role, err)
1599+
return nil, fmt.Errorf("could not generate original CRIO credential provider config for role %s: %w", role, err)
15551600
}
1556-
contents, err := ctrlcommon.DecodeIgnitionFileContents(credProviderConfigIgn.Contents.Source, credProviderConfigIgn.Contents.Compression)
1601+
contents, err := ctrlcommon.DecodeIgnitionFileContents(originalCredProviderConfigIgn.Contents.Source, originalCredProviderConfigIgn.Contents.Compression)
15571602
if err != nil {
1558-
return fmt.Errorf("could not decode CRIO credential provider config for role %s: %w", role, err)
1603+
return nil, fmt.Errorf("could not decode CRIO credential provider config for role %s: %w", role, err)
15591604
}
15601605
klog.Infof("Decoded CRIO credential provider config contents successfully for role %s: %s", role, string(contents))
1561-
return nil
1606+
1607+
matchImages := make(map[string]bool)
1608+
1609+
credProviderConfigObject, err := credProviderConfigObject(contents)
1610+
if err != nil {
1611+
return nil, err
1612+
}
1613+
existingMatchImages := make(map[string]bool)
1614+
for _, provider := range credProviderConfigObject.Providers {
1615+
for _, image := range provider.MatchImages {
1616+
existingMatchImages[image] = true
1617+
}
1618+
}
1619+
1620+
var ignored []string
1621+
for _, img := range crioCredentialProviderConfig.Spec.MatchImages {
1622+
imgStr := string(img)
1623+
if _, exists := existingMatchImages[imgStr]; exists {
1624+
ignored = append(ignored, imgStr)
1625+
continue
1626+
}
1627+
matchImages[imgStr] = true
1628+
}
1629+
if len(ignored) > 0 {
1630+
// syncStatusOnly could be added here to update the status of the CRIOCredentialProviderConfig
1631+
klog.V(2).Infof("CRIOCredentialProviderConfig %s in namespace %s has ignored matchImages that already exist in the config: %v", crioCredentialProviderConfig.Name, crioCredentialProviderConfig.Namespace, ignored)
1632+
}
1633+
1634+
if len(matchImages) != 0 {
1635+
credProviderConfigYaml, err = updateCredentialProviderConfig(credProviderConfigObject, matchImages)
1636+
if err != nil {
1637+
return nil, err
1638+
}
1639+
}
1640+
credProviderConfigIgn := createNewIgnition([]generatedConfigFile{
1641+
{filePath: credProviderConfigPath, data: credProviderConfigYaml},
1642+
})
1643+
return &credProviderConfigIgn, nil
15621644
}

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

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"sort"
1414
"strconv"
1515
"strings"
16+
"time"
1617

1718
"github.com/BurntSushi/toml"
1819
"github.com/containers/image/v5/docker/reference"
@@ -24,6 +25,7 @@ import (
2425
"github.com/ghodss/yaml"
2526
"github.com/opencontainers/go-digest"
2627
apicfgv1 "github.com/openshift/api/config/v1"
28+
apicfgv1alpha1 "github.com/openshift/api/config/v1alpha1"
2729
apioperatorsv1alpha1 "github.com/openshift/api/operator/v1alpha1"
2830
"github.com/openshift/runtime-utils/pkg/registries"
2931
runtimeutils "github.com/openshift/runtime-utils/pkg/registries"
@@ -37,6 +39,8 @@ import (
3739
"github.com/openshift/machine-config-operator/pkg/apihelpers"
3840
ctrlcommon "github.com/openshift/machine-config-operator/pkg/controller/common"
3941
"github.com/openshift/machine-config-operator/pkg/daemon/constants"
42+
kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config"
43+
"k8s.io/utils/ptr"
4044
)
4145

4246
const (
@@ -55,6 +59,8 @@ const (
5559
CRIODropInFilePathDefaultRuntime = "/etc/crio/crio.conf.d/01-ctrcfg-defaultRuntime"
5660
imagepolicyType = "sigstoreSigned"
5761
sigstoreRegistriesConfigFilePath = "/etc/containers/registries.d/sigstore-registries.yaml"
62+
crioCredentialProviderName = "crio-credential-provider"
63+
credentialProviderAPIVersion = "credentialprovider.kubelet.k8s.io/v1"
5864
)
5965

6066
var (
@@ -351,6 +357,12 @@ func notLatestContainerRuntimeConfigInPool(ctrcfgList []mcfgv1.ContainerRuntimeC
351357
return false
352358
}
353359

360+
func getManagedKeyCRIOCredentialProvider(pool *mcfgv1.MachineConfigPool) (string, error) {
361+
return ctrlcommon.GetManagedKey(pool, nil, "97", "credentialproviderconfig", "")
362+
363+
// return ctrlcommon.GetManagedKey(pool, client, "97", "credentialproviderconfig", fmt.Sprintf("97-%s-%s-criocredentialprovider", pool.Name, pool.ObjectMeta.UID))
364+
}
365+
354366
// Deprecated: use getManagedKeyReg
355367
func getManagedKeyRegDeprecated(pool *mcfgv1.MachineConfigPool) string {
356368
return fmt.Sprintf("99-%s-%s-registries", pool.Name, pool.ObjectMeta.UID)
@@ -867,6 +879,15 @@ func ownerReferenceImageConfig(imageConfig *apicfgv1.Image) metav1.OwnerReferenc
867879
}
868880
}
869881

882+
func ownerReferenceCredentialProviderConfig(credentialProviderConfig *apicfgv1alpha1.CRIOCredentialProviderConfig) metav1.OwnerReference {
883+
return metav1.OwnerReference{
884+
APIVersion: apicfgv1alpha1.SchemeGroupVersion.String(),
885+
Kind: "CRIOCredentialProviderConfig",
886+
Name: credentialProviderConfig.Name,
887+
UID: credentialProviderConfig.UID,
888+
}
889+
}
890+
870891
func policyItemFromSpec(policy apicfgv1.Policy) (signature.PolicyRequirement, error) {
871892
var (
872893
sigstorePolicyRequirement signature.PolicyRequirement
@@ -1226,3 +1247,69 @@ func imagePolicyConfigFileList(namespaceJSONs map[string][]byte) []generatedConf
12261247
}
12271248
return namespacedPolicyConfigFileList
12281249
}
1250+
1251+
func credProviderConfigObject(contents []byte) (*kubeletconfig.CredentialProviderConfig, error) {
1252+
credProviderConfigObject := &kubeletconfig.CredentialProviderConfig{}
1253+
err := yaml.Unmarshal(contents, credProviderConfigObject)
1254+
if err != nil {
1255+
return nil, fmt.Errorf("error unmarshalling credential provider config: %w", err)
1256+
}
1257+
return credProviderConfigObject, nil
1258+
}
1259+
1260+
type credentialProviderConfigVersioned struct {
1261+
APIVersion string `yaml:"apiVersion"`
1262+
Kind string `yaml:"kind"`
1263+
Providers []kubeletconfig.CredentialProvider `yaml:"providers"`
1264+
}
1265+
1266+
func updateCredentialProviderConfig(credProviderConfigObject *kubeletconfig.CredentialProviderConfig, matchImages map[string]bool) ([]byte, error) {
1267+
1268+
// matchImages is not expected to be empty here as the caller should skip calling this function if there are no images
1269+
images := []string{}
1270+
for image := range matchImages {
1271+
images = append(images, image)
1272+
}
1273+
1274+
crioCredProviderExist := false
1275+
crioCredProviderIdx := -1
1276+
for i, provider := range credProviderConfigObject.Providers {
1277+
1278+
if provider.Name != crioCredentialProviderName {
1279+
continue
1280+
}
1281+
1282+
crioCredProviderExist = true
1283+
crioCredProviderIdx = i
1284+
break
1285+
}
1286+
1287+
if crioCredProviderExist && crioCredProviderIdx != -1 {
1288+
credProviderConfigObject.Providers[crioCredProviderIdx].MatchImages = images
1289+
} else {
1290+
newProvider := kubeletconfig.CredentialProvider{
1291+
Name: crioCredentialProviderName,
1292+
MatchImages: images,
1293+
DefaultCacheDuration: &metav1.Duration{Duration: time.Second},
1294+
APIVersion: credentialProviderAPIVersion,
1295+
TokenAttributes: &kubeletconfig.ServiceAccountTokenAttributes{
1296+
ServiceAccountTokenAudience: "https://kubernetes.default.svc",
1297+
RequireServiceAccount: ptr.To(false),
1298+
CacheType: kubeletconfig.TokenServiceAccountTokenCacheType,
1299+
},
1300+
}
1301+
credProviderConfigObject.Providers = append(credProviderConfigObject.Providers, newProvider)
1302+
}
1303+
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)
1311+
if err != nil {
1312+
return nil, fmt.Errorf("error marshalling credential provider config: %v", err)
1313+
}
1314+
return credProviderConfigsYaml, nil
1315+
}

0 commit comments

Comments
 (0)