Skip to content

Commit 0f96e06

Browse files
committed
move global translate function to avoid cycle imports
1 parent c4e9ab9 commit 0f96e06

File tree

4 files changed

+107
-104
lines changed

4 files changed

+107
-104
lines changed

config/common/translate.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package common
2+
3+
import (
4+
"fmt"
5+
"github.com/coreos/go-semver/semver"
6+
"github.com/coreos/vcontext/report"
7+
"gopkg.in/yaml.v3"
8+
)
9+
10+
var (
11+
registry = map[string]translator{}
12+
)
13+
14+
// Fields that must be included in the root struct of every spec version.
15+
type commonFields struct {
16+
Version string `yaml:"version"`
17+
Variant string `yaml:"variant"`
18+
}
19+
20+
// RegisterTranslator registers a translator for the specified variant and
21+
// version to be available for use by TranslateBytes. This is only needed
22+
// by users implementing their own translators outside the Butane package.
23+
func RegisterTranslator(variant, version string, trans translator) {
24+
key := fmt.Sprintf("%s+%s", variant, version)
25+
if _, ok := registry[key]; ok {
26+
panic("tried to reregister existing translator")
27+
}
28+
registry[key] = trans
29+
}
30+
31+
func getTranslator(variant string, version semver.Version) (translator, error) {
32+
t, ok := registry[fmt.Sprintf("%s+%s", variant, version.String())]
33+
if !ok {
34+
return nil, ErrUnknownVersion{
35+
Variant: variant,
36+
Version: version,
37+
}
38+
}
39+
return t, nil
40+
}
41+
42+
// translators take a raw config and translate it to a raw Ignition config. The report returned should include any
43+
// errors, warnings, etc. and may or may not be fatal. If report is fatal, or other errors are encountered while translating
44+
// translators should return an error.
45+
type translator func([]byte, TranslateBytesOptions) ([]byte, report.Report, error)
46+
47+
// TranslateBytes wraps all of the individual TranslateBytes functions in a switch that determines the correct one to call.
48+
// TranslateBytes returns an error if the report had fatal errors or if other errors occured during translation.
49+
func TranslateBytes(input []byte, options TranslateBytesOptions) ([]byte, report.Report, error) {
50+
// first determine version; this will ignore most fields
51+
ver := commonFields{}
52+
if err := yaml.Unmarshal(input, &ver); err != nil {
53+
return nil, report.Report{}, ErrUnmarshal{
54+
Detail: err.Error(),
55+
}
56+
}
57+
58+
if ver.Variant == "" {
59+
return nil, report.Report{}, ErrNoVariant
60+
}
61+
62+
tmp, err := semver.NewVersion(ver.Version)
63+
if err != nil {
64+
return nil, report.Report{}, ErrInvalidVersion
65+
}
66+
version := *tmp
67+
68+
translator, err := getTranslator(ver.Variant, version)
69+
if err != nil {
70+
return nil, report.Report{}, err
71+
}
72+
73+
return translator(input, options)
74+
}

config/config.go

Lines changed: 30 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
package config
1616

1717
import (
18-
"fmt"
19-
2018
"github.com/coreos/butane/config/common"
2119
fcos1_0 "github.com/coreos/butane/config/fcos/v1_0"
2220
fcos1_1 "github.com/coreos/butane/config/fcos/v1_1"
@@ -48,108 +46,40 @@ import (
4846
r4e1_1 "github.com/coreos/butane/config/r4e/v1_1"
4947
r4e1_2_exp "github.com/coreos/butane/config/r4e/v1_2_exp"
5048

51-
"github.com/coreos/go-semver/semver"
5249
"github.com/coreos/vcontext/report"
53-
"gopkg.in/yaml.v3"
54-
)
55-
56-
var (
57-
registry = map[string]translator{}
5850
)
5951

60-
// Fields that must be included in the root struct of every spec version.
61-
type commonFields struct {
62-
Version string `yaml:"version"`
63-
Variant string `yaml:"variant"`
64-
}
65-
6652
func init() {
67-
RegisterTranslator("fcos", "1.0.0", fcos1_0.ToIgn3_0Bytes)
68-
RegisterTranslator("fcos", "1.1.0", fcos1_1.ToIgn3_1Bytes)
69-
RegisterTranslator("fcos", "1.2.0", fcos1_2.ToIgn3_2Bytes)
70-
RegisterTranslator("fcos", "1.3.0", fcos1_3.ToIgn3_2Bytes)
71-
RegisterTranslator("fcos", "1.4.0", fcos1_4.ToIgn3_3Bytes)
72-
RegisterTranslator("fcos", "1.5.0", fcos1_5.ToIgn3_4Bytes)
73-
RegisterTranslator("fcos", "1.6.0", fcos1_6.ToIgn3_5Bytes)
74-
RegisterTranslator("fcos", "1.7.0-experimental", fcos1_7_exp.ToIgn3_6Bytes)
75-
RegisterTranslator("flatcar", "1.0.0", flatcar1_0.ToIgn3_3Bytes)
76-
RegisterTranslator("flatcar", "1.1.0", flatcar1_1.ToIgn3_4Bytes)
77-
RegisterTranslator("flatcar", "1.2.0-experimental", flatcar1_2_exp.ToIgn3_6Bytes)
78-
RegisterTranslator("openshift", "4.8.0", openshift4_8.ToConfigBytes)
79-
RegisterTranslator("openshift", "4.9.0", openshift4_9.ToConfigBytes)
80-
RegisterTranslator("openshift", "4.10.0", openshift4_10.ToConfigBytes)
81-
RegisterTranslator("openshift", "4.11.0", openshift4_11.ToConfigBytes)
82-
RegisterTranslator("openshift", "4.12.0", openshift4_12.ToConfigBytes)
83-
RegisterTranslator("openshift", "4.13.0", openshift4_13.ToConfigBytes)
84-
RegisterTranslator("openshift", "4.14.0", openshift4_14.ToConfigBytes)
85-
RegisterTranslator("openshift", "4.15.0", openshift4_15.ToConfigBytes)
86-
RegisterTranslator("openshift", "4.16.0", openshift4_16.ToConfigBytes)
87-
RegisterTranslator("openshift", "4.17.0", openshift4_17.ToConfigBytes)
88-
RegisterTranslator("openshift", "4.18.0", openshift4_18.ToConfigBytes)
89-
RegisterTranslator("openshift", "4.19.0", openshift4_19.ToConfigBytes)
90-
RegisterTranslator("openshift", "4.20.0-experimental", openshift4_20_exp.ToConfigBytes)
91-
RegisterTranslator("r4e", "1.0.0", r4e1_0.ToIgn3_3Bytes)
92-
RegisterTranslator("r4e", "1.1.0", r4e1_1.ToIgn3_4Bytes)
93-
RegisterTranslator("r4e", "1.2.0-experimental", r4e1_2_exp.ToIgn3_6Bytes)
94-
RegisterTranslator("fiot", "1.0.0", fiot1_0.ToIgn3_4Bytes)
95-
RegisterTranslator("fiot", "1.1.0-experimental", fiot1_1_exp.ToIgn3_6Bytes)
96-
RegisterTranslator("rhcos", "0.1.0", unsupportedRhcosVariant)
97-
}
98-
99-
// RegisterTranslator registers a translator for the specified variant and
100-
// version to be available for use by TranslateBytes. This is only needed
101-
// by users implementing their own translators outside the Butane package.
102-
func RegisterTranslator(variant, version string, trans translator) {
103-
key := fmt.Sprintf("%s+%s", variant, version)
104-
if _, ok := registry[key]; ok {
105-
panic("tried to reregister existing translator")
106-
}
107-
registry[key] = trans
108-
}
109-
110-
func getTranslator(variant string, version semver.Version) (translator, error) {
111-
t, ok := registry[fmt.Sprintf("%s+%s", variant, version.String())]
112-
if !ok {
113-
return nil, common.ErrUnknownVersion{
114-
Variant: variant,
115-
Version: version,
116-
}
117-
}
118-
return t, nil
119-
}
120-
121-
// translators take a raw config and translate it to a raw Ignition config. The report returned should include any
122-
// errors, warnings, etc. and may or may not be fatal. If report is fatal, or other errors are encountered while translating
123-
// translators should return an error.
124-
type translator func([]byte, common.TranslateBytesOptions) ([]byte, report.Report, error)
125-
126-
// TranslateBytes wraps all of the individual TranslateBytes functions in a switch that determines the correct one to call.
127-
// TranslateBytes returns an error if the report had fatal errors or if other errors occured during translation.
128-
func TranslateBytes(input []byte, options common.TranslateBytesOptions) ([]byte, report.Report, error) {
129-
// first determine version; this will ignore most fields
130-
ver := commonFields{}
131-
if err := yaml.Unmarshal(input, &ver); err != nil {
132-
return nil, report.Report{}, common.ErrUnmarshal{
133-
Detail: err.Error(),
134-
}
135-
}
136-
137-
if ver.Variant == "" {
138-
return nil, report.Report{}, common.ErrNoVariant
139-
}
140-
141-
tmp, err := semver.NewVersion(ver.Version)
142-
if err != nil {
143-
return nil, report.Report{}, common.ErrInvalidVersion
144-
}
145-
version := *tmp
146-
147-
translator, err := getTranslator(ver.Variant, version)
148-
if err != nil {
149-
return nil, report.Report{}, err
150-
}
151-
152-
return translator(input, options)
53+
common.RegisterTranslator("fcos", "1.0.0", fcos1_0.ToIgn3_0Bytes)
54+
common.RegisterTranslator("fcos", "1.1.0", fcos1_1.ToIgn3_1Bytes)
55+
common.RegisterTranslator("fcos", "1.2.0", fcos1_2.ToIgn3_2Bytes)
56+
common.RegisterTranslator("fcos", "1.3.0", fcos1_3.ToIgn3_2Bytes)
57+
common.RegisterTranslator("fcos", "1.4.0", fcos1_4.ToIgn3_3Bytes)
58+
common.RegisterTranslator("fcos", "1.5.0", fcos1_5.ToIgn3_4Bytes)
59+
common.RegisterTranslator("fcos", "1.6.0", fcos1_6.ToIgn3_5Bytes)
60+
common.RegisterTranslator("fcos", "1.7.0-experimental", fcos1_7_exp.ToIgn3_6Bytes)
61+
common.RegisterTranslator("flatcar", "1.0.0", flatcar1_0.ToIgn3_3Bytes)
62+
common.RegisterTranslator("flatcar", "1.1.0", flatcar1_1.ToIgn3_4Bytes)
63+
common.RegisterTranslator("flatcar", "1.2.0-experimental", flatcar1_2_exp.ToIgn3_6Bytes)
64+
common.RegisterTranslator("openshift", "4.8.0", openshift4_8.ToConfigBytes)
65+
common.RegisterTranslator("openshift", "4.9.0", openshift4_9.ToConfigBytes)
66+
common.RegisterTranslator("openshift", "4.10.0", openshift4_10.ToConfigBytes)
67+
common.RegisterTranslator("openshift", "4.11.0", openshift4_11.ToConfigBytes)
68+
common.RegisterTranslator("openshift", "4.12.0", openshift4_12.ToConfigBytes)
69+
common.RegisterTranslator("openshift", "4.13.0", openshift4_13.ToConfigBytes)
70+
common.RegisterTranslator("openshift", "4.14.0", openshift4_14.ToConfigBytes)
71+
common.RegisterTranslator("openshift", "4.15.0", openshift4_15.ToConfigBytes)
72+
common.RegisterTranslator("openshift", "4.16.0", openshift4_16.ToConfigBytes)
73+
common.RegisterTranslator("openshift", "4.17.0", openshift4_17.ToConfigBytes)
74+
common.RegisterTranslator("openshift", "4.18.0", openshift4_18.ToConfigBytes)
75+
common.RegisterTranslator("openshift", "4.19.0", openshift4_19.ToConfigBytes)
76+
common.RegisterTranslator("openshift", "4.20.0-experimental", openshift4_20_exp.ToConfigBytes)
77+
common.RegisterTranslator("r4e", "1.0.0", r4e1_0.ToIgn3_3Bytes)
78+
common.RegisterTranslator("r4e", "1.1.0", r4e1_1.ToIgn3_4Bytes)
79+
common.RegisterTranslator("r4e", "1.2.0-experimental", r4e1_2_exp.ToIgn3_6Bytes)
80+
common.RegisterTranslator("fiot", "1.0.0", fiot1_0.ToIgn3_4Bytes)
81+
common.RegisterTranslator("fiot", "1.1.0-experimental", fiot1_1_exp.ToIgn3_6Bytes)
82+
common.RegisterTranslator("rhcos", "0.1.0", unsupportedRhcosVariant)
15383
}
15484

15585
func unsupportedRhcosVariant(input []byte, options common.TranslateBytesOptions) ([]byte, report.Report, error) {

internal/doc/main.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
"github.com/coreos/ignition/v2/config/util"
3131
"gopkg.in/yaml.v3"
3232

33-
"github.com/coreos/butane/config"
3433
"github.com/coreos/butane/config/common"
3534
buUtil "github.com/coreos/butane/config/util"
3635

@@ -298,7 +297,7 @@ func getIgnitionVersion(variant string, version semver.Version) (semver.Version,
298297
}
299298

300299
// translate to Ignition config
301-
ign, _, err := config.TranslateBytes(bu, common.TranslateBytesOptions{
300+
ign, _, err := common.TranslateBytes(bu, common.TranslateBytesOptions{
302301
Raw: true,
303302
})
304303
if err != nil {

internal/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121

2222
"github.com/spf13/pflag"
2323

24-
"github.com/coreos/butane/config"
24+
_ "github.com/coreos/butane/config"
2525
"github.com/coreos/butane/config/common"
2626
"github.com/coreos/butane/internal/version"
2727
)
@@ -96,7 +96,7 @@ func main() {
9696
fail("failed to read %s: %v\n", infile.Name(), err)
9797
}
9898

99-
dataOut, r, err := config.TranslateBytes(dataIn, options)
99+
dataOut, r, err := common.TranslateBytes(dataIn, options)
100100
fmt.Fprintf(os.Stderr, "%s", r.String())
101101
if err != nil {
102102
fail("Error translating config: %v\n", err)

0 commit comments

Comments
 (0)