Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ require (
github.com/containers/image v3.0.2+incompatible
github.com/containers/image/v5 v5.5.1
github.com/containers/storage v1.20.2
github.com/coreos/fcct v0.5.0
github.com/coreos/fcct v0.7.0
github.com/coreos/go-semver v0.3.0
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f // indirect
github.com/coreos/ign-converter v0.0.0-20200629171308-e40a44f244c5
Expand Down Expand Up @@ -53,6 +53,7 @@ require (
github.com/vincent-petithory/dataurl v0.0.0-20160330182126-9a301d65acbb
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
golang.org/x/time v0.0.0-20191024005414-555d28b269f0
gopkg.in/yaml.v2 v2.3.0
k8s.io/api v0.19.2
k8s.io/apiextensions-apiserver v0.19.0
k8s.io/apimachinery v0.19.2
Expand Down
5 changes: 2 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,8 @@ github.com/containers/storage v1.20.2 h1:tw/uKRPDnmVrluIzer3dawTFG/bTJLP8IEUyHFh
github.com/containers/storage v1.20.2/go.mod h1:oOB9Ie8OVPojvoaKWEGSEtHbXUAs+tSyr7RO7ZGteMc=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/fcct v0.5.0 h1:f/z+MCoR2vULes+MyoPEApQ6iluy/JbXoRi6dahPItQ=
github.com/coreos/fcct v0.5.0/go.mod h1:cbE+j77YSQwFB2fozWVB3qsI2Pi3YiVEbDz/b6Yywdo=
github.com/coreos/fcct v0.7.0 h1:g2RmLSxURkD9xqO3ZUIumeCsHCxUe9+oLbbTuai2FeI=
github.com/coreos/fcct v0.7.0/go.mod h1:boOA3u8OgiHWoiSOC9ikl4u8/3GuO7uQco/9bdwMeFQ=
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
Expand All @@ -172,7 +172,6 @@ github.com/coreos/ign-converter v0.0.0-20200629171308-e40a44f244c5 h1:rBga8xIJ7M
github.com/coreos/ign-converter v0.0.0-20200629171308-e40a44f244c5/go.mod h1:LNu0WTt8iVH/WJH15R/SjZw7AdyY2qAyf9ILZTCBvho=
github.com/coreos/ignition v0.35.0 h1:UFodoYq1mOPrbEjtxIsZbThcDyQwAI1owczRDqWmKkQ=
github.com/coreos/ignition v0.35.0/go.mod h1:WJQapxzEn9DE0ryxsGvm8QnBajm/XsS/PkrDqSpz+bA=
github.com/coreos/ignition/v2 v2.1.1/go.mod h1:RqmqU64zxarUJa3l4cHtbhcSwfQLpUhv0WVziZwoXvE=
github.com/coreos/ignition/v2 v2.3.0 h1:TK+STbzVe6KZp4tQ2IaNSRMiWX4/diNngep1F7tP7Zk=
github.com/coreos/ignition/v2 v2.3.0/go.mod h1:85dmM/CERMZXNrJsXqtNLIxR/dn8G9qlL1CmEjCugp0=
github.com/coreos/ignition/v2 v2.7.0 h1:JCKxJllVtnk1lQY1uisxrtFSHG5L2NI1LRzc8wBEk84=
Expand Down
51 changes: 37 additions & 14 deletions pkg/controller/common/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ import (
"sort"

"github.com/clarketm/json"
fcctbase "github.com/coreos/fcct/base/v0_1"
fcctBase "github.com/coreos/fcct/base"
fcctBase0_2 "github.com/coreos/fcct/base/v0_2"
fcctCfgCommon "github.com/coreos/fcct/config/common"
fcctCfg1_1 "github.com/coreos/fcct/config/v1_1"
"github.com/coreos/ign-converter/translate/v23tov30"
"github.com/coreos/ign-converter/translate/v31tov22"
ign2error "github.com/coreos/ignition/config/shared/errors"
Expand All @@ -33,6 +36,10 @@ import (
mcfgclientset "github.com/openshift/machine-config-operator/pkg/generated/clientset/versioned"
)

var fcctTranslateOptions fcctBase.TranslateOptions = fcctBase.TranslateOptions{
NoResourceAutoCompression: true,
}

// MergeMachineConfigs combines multiple machineconfig objects into one object.
// It sorts all the configs in increasing order of their name.
// It uses the Ignition config from first object as base and appends all the rest.
Expand Down Expand Up @@ -284,9 +291,27 @@ func ValidateMachineConfig(cfg mcfgv1.MachineConfigSpec) error {
return nil
}

// IgnParseWrapper parses rawIgn for both V2 and V3 ignition configs and returns
func isJSON(data []byte) bool {
var js json.RawMessage
return json.Unmarshal(data, &js) == nil
}

// IgnParseWrapper parses rawIgn for CoreOS (FCCT) configs as well as V2 and V3 ignition configs and returns
// a V2 or V3 Config or an error. This wrapper is necessary since V2 and V3 use different parsers.
func IgnParseWrapper(rawIgn []byte) (interface{}, error) {
if isJSON := isJSON(rawIgn); !isJSON {
// try transpiling FCCT to Ign spec v3.1
rawFcctIgnCfgV3_1, rptFcct, errFcct := fcctCfg1_1.TranslateBytes(rawIgn, fcctCfgCommon.TranslateOptions{BaseOptions: fcctTranslateOptions})
if errFcct != nil || rptFcct.IsFatal() {
return ign3types.Config{}, errors.Errorf("transpiling FCCT config failed with error: %v\nReport: %v", errFcct, rptFcct)
}
fcctIgnCfgV3_1, rptFcctIgnV3_1, errFcctIgnV3_1 := ign3.Parse(rawFcctIgnCfgV3_1)
if errFcctIgnV3_1 != nil || rptFcctIgnV3_1.IsFatal() {
return ign3types.Config{}, errors.Errorf("parsing Ignition config spec v3.1 transpiled from FCCT failed with error: %v\nReport: %v", errFcctIgnV3_1, rptFcctIgnV3_1)
}
return fcctIgnCfgV3_1, nil
}

ignCfgV3_1, rptV3_1, errV3_1 := ign3.Parse(rawIgn)
if errV3_1 == nil && !rptV3_1.IsFatal() {
return ignCfgV3_1, nil
Expand Down Expand Up @@ -439,37 +464,35 @@ func TranspileCoreOSConfigToIgn(files, units []string) (*ign3types.Config, error
outConfig := ign3types.Config{}
// Convert data to Ignition resources
for _, d := range files {
f := new(fcctbase.File)
f := new(fcctBase0_2.File)
if err := yaml.Unmarshal([]byte(d), f); err != nil {
return nil, fmt.Errorf("failed to unmarshal file into struct: %v", err)
}
f.Overwrite = &overwrite

// Add the file to the config
var ctCfg fcctbase.Config
var ctCfg fcctBase0_2.Config
ctCfg.Storage.Files = append(ctCfg.Storage.Files, *f)
ign3_0config, tSet, err := ctCfg.ToIgn3_0()
if err != nil {
return nil, fmt.Errorf("failed to transpile config to Ignition config %s\nTranslation set: %v", err, tSet)
ign3_1config, tSet, report := ctCfg.ToIgn3_1(fcctTranslateOptions)
if report.IsFatal() {
return nil, fmt.Errorf("failed to transpile config to Ignition config.\nReport: %v\nTranslation set: %v", report, tSet)
}
ign3_1config := translate3.Translate(ign3_0config)
outConfig = ign3.Merge(outConfig, ign3_1config)
}

for _, d := range units {
u := new(fcctbase.Unit)
u := new(fcctBase0_2.Unit)
if err := yaml.Unmarshal([]byte(d), u); err != nil {
return nil, fmt.Errorf("failed to unmarshal systemd unit into struct: %v", err)
}

// Add the unit to the config
var ctCfg fcctbase.Config
var ctCfg fcctBase0_2.Config
ctCfg.Systemd.Units = append(ctCfg.Systemd.Units, *u)
ign3_0config, tSet, err := ctCfg.ToIgn3_0()
if err != nil {
return nil, fmt.Errorf("failed to transpile config to Ignition config %s\nTranslation set: %v", err, tSet)
ign3_1config, tSet, report := ctCfg.ToIgn3_1(fcctTranslateOptions)
if report.IsFatal() {
return nil, fmt.Errorf("failed to transpile config to Ignition config.\nReport: %v\nTranslation set: %v", report, tSet)
}
ign3_1config := translate3.Translate(ign3_0config)
outConfig = ign3.Merge(outConfig, ign3_1config)
}

Expand Down
16 changes: 16 additions & 0 deletions pkg/controller/common/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"testing"

"github.com/clarketm/json"
fcctBase0_2 "github.com/coreos/fcct/base/v0_2"
fcctCfg1_1 "github.com/coreos/fcct/config/v1_1"
ign2types "github.com/coreos/ignition/config/v2_2/types"
ign3types "github.com/coreos/ignition/v2/config/v3_1/types"
"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -144,6 +146,20 @@ func TestParseAndConvert(t *testing.T) {
convertedIgn, err = ParseAndConvertConfig(rawIgn)
require.NotNil(t, err)
assert.Equal(t, ign3types.Config{}, convertedIgn)

// Make a FCCT comp config
testFcctConfig := fcctCfg1_1.Config{}
testFcctConfig.Version = "1.1.0"
tempFcctUser := fcctBase0_2.PasswdUser{Name: "core", SSHAuthorizedKeys: []fcctBase0_2.SSHAuthorizedKey{"5678", "abc"}}
testFcctConfig.Passwd.Users = []fcctBase0_2.PasswdUser{tempFcctUser}

// turn FCCT config into a raw []byte
rawFcct := helpers.YamlMarshalOrDie(testFcctConfig)
// check that it was parsed successfully
convertedFcct, err := ParseAndConvertConfig(rawFcct)
require.Nil(t, err)
testIgn3Config.Ignition.Version = "3.1.0"
assert.Equal(t, testIgn3Config, convertedFcct)
}

func TestMergeMachineConfigs(t *testing.T) {
Expand Down
10 changes: 10 additions & 0 deletions test/helpers/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/clarketm/json"
ign3types "github.com/coreos/ignition/v2/config/v3_1/types"
"gopkg.in/yaml.v2"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
Expand Down Expand Up @@ -128,3 +129,12 @@ func MarshalOrDie(input interface{}) []byte {
}
return bytes
}

// YamlMarshalOrDie returns a marshalled interface or panics
func YamlMarshalOrDie(input interface{}) []byte {
bytes, err := yaml.Marshal(input)
if err != nil {
panic(err)
}
return bytes
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

Loading