@@ -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
351363func (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
384397func (ctrl * Controller ) clusterImagePolicyAdded (_ interface {}) {
@@ -410,6 +423,7 @@ func (ctrl *Controller) sigstoreAPIEnabled() bool {
410423}
411424
412425func (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
687701func (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}
0 commit comments