@@ -10,14 +10,20 @@ import (
1010 "text/template"
1111
1212 "github.com/clarketm/json"
13+ fcctbase "github.com/coreos/fcct/base/v0_1"
14+ "github.com/coreos/go-semver/semver"
15+ ign3 "github.com/coreos/ignition/v2/config/v3_5"
1316 ign3types "github.com/coreos/ignition/v2/config/v3_5/types"
17+ "github.com/ghodss/yaml"
18+ corev1 "k8s.io/api/core/v1"
19+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
20+
1421 mcfgv1 "github.com/openshift/api/machineconfiguration/v1"
1522 mcfgv1alpha1 "github.com/openshift/api/machineconfiguration/v1alpha1"
23+ "github.com/openshift/machine-config-operator/pkg/controller/common"
1624 ctrlcommon "github.com/openshift/machine-config-operator/pkg/controller/common"
1725 templatectrl "github.com/openshift/machine-config-operator/pkg/controller/template"
1826 "github.com/openshift/machine-config-operator/pkg/version"
19- corev1 "k8s.io/api/core/v1"
20- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2127)
2228
2329var (
@@ -143,35 +149,58 @@ func (r *Renderer) generateIgnitionFromTemplates(rc *renderContext) (*ign3types.
143149 if err != nil {
144150 return nil , err
145151 }
146- dirs := []string {
147- "/etc/iri-registry" ,
148- "/etc/iri-registry/certs" ,
149- "/var/lib/iri-registry" ,
152+ dirs , err := r .renderTemplateFolder (rc , filepath .Join (r .role , "directories" ))
153+ if err != nil {
154+ return nil , err
150155 }
151156
152157 // Generate the iri ignition
153- ignCfg , err := ctrlcommon . TranspileCoreOSConfigToIgn ( files , units )
158+ ignCfg , err := r . transpileIgnition ( dirs , files , units )
154159 if err != nil {
155160 return nil , fmt .Errorf ("error transpiling CoreOS config to Ignition config: %w" , err )
156161 }
157- r .transpileIgitionDirs (ignCfg , dirs )
162+ return ignCfg , nil
163+ }
164+
165+ func (r * Renderer ) transpileIgnition (dirs , files , units []string ) (* ign3types.Config , error ) {
166+ ignCfg , err := ctrlcommon .TranspileCoreOSConfigToIgn (files , units )
167+ if err != nil {
168+ return nil , err
169+ }
158170
171+ ignCfgDirs , err := r .transpileCoreOSConfigDirsToIgn (dirs )
172+ if err != nil {
173+ return nil , err
174+ }
175+
176+ * ignCfg = ign3 .Merge (* ignCfg , * ignCfgDirs )
159177 return ignCfg , nil
160178}
161179
162180// transpileIgitionDirs generates the ignition for creating the specified directories.
163- func (r * Renderer ) transpileIgitionDirs (ignCfg * ign3types.Config , directories []string ) {
164- for _ , d := range directories {
165- mode := 0644
166- ignCfg .Storage .Directories = append (ignCfg .Storage .Directories , ign3types.Directory {
167- Node : ign3types.Node {
168- Path : d ,
169- },
170- DirectoryEmbedded1 : ign3types.DirectoryEmbedded1 {
171- Mode : & mode ,
172- },
173- })
181+ func (r * Renderer ) transpileCoreOSConfigDirsToIgn (directories []string ) (* ign3types.Config , error ) {
182+ outConfig := ign3types.Config {}
183+ for _ , contents := range directories {
184+ d := new (fcctbase.Directory )
185+ if err := yaml .Unmarshal ([]byte (contents ), d ); err != nil {
186+ return nil , fmt .Errorf ("failed to unmarshal %q into struct: %w" , contents , err )
187+ }
188+
189+ // Add the directory to the config
190+ var ctCfg fcctbase.Config
191+ ctCfg .Storage .Directories = append (ctCfg .Storage .Directories , * d )
192+ ign30Config , tSet , err := ctCfg .ToIgn3_0 ()
193+ if err != nil {
194+ return nil , fmt .Errorf ("failed to transpile config to Ignition config %w\n Translation set: %v" , err , tSet )
195+ }
196+ ign3Config , err := common .IgnitionConverterSingleton ().Convert (ign30Config , * semver .New (ign30Config .Ignition .Version ), ign3types .MaxVersion )
197+ if err != nil {
198+ return nil , fmt .Errorf ("failed to convert config from 3.0 to %v. %w" , ign3types .MaxVersion , err )
199+ }
200+ outConfig = ign3 .Merge (outConfig , ign3Config .(ign3types.Config ))
174201 }
202+
203+ return & outConfig , nil
175204}
176205
177206// renderTemplateFolder renders all the templates found in the specified folder.
0 commit comments