Skip to content

Commit dd1c7af

Browse files
committed
convert unstructured objs before exporting
1 parent f48d397 commit dd1c7af

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

pkg/oc/cli/cmd/export.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,44 @@ func RunExport(f *clientcmd.Factory, exporter Exporter, in io.Reader, out io.Wri
141141
newInfos := []*resource.Info{}
142142
errs := []error{}
143143
for _, info := range infos {
144+
converted := false
145+
146+
// convert unstructured object to runtime.Object
147+
data, err := runtime.Encode(kapi.Codecs.LegacyCodec(), info.Object)
148+
if err != nil {
149+
errs = append(errs, err)
150+
continue
151+
}
152+
decoded, err := runtime.Decode(f.Decoder(true), data)
153+
if err == nil {
154+
// ignore error, if any, in order to allow resources
155+
// not known by the client to still be exported
156+
info.Object = decoded
157+
converted = true
158+
}
159+
144160
if err := exporter.Export(info.Object, exact); err != nil {
145161
if err == ErrExportOmit {
146162
continue
147163
}
148164
errs = append(errs, err)
149165
}
166+
167+
// if an unstructured resource was successfully converted by the universal decoder,
168+
// re-convert that object once again into its external version.
169+
// If object cannot be converted to an external version, ignore error and proceed with
170+
// internal version.
171+
if converted {
172+
if data, err = runtime.Encode(kapi.Codecs.LegacyCodec(outputVersion), info.Object); err == nil {
173+
external, err := runtime.Decode(f.Decoder(false), data)
174+
if err != nil {
175+
errs = append(errs, fmt.Errorf("error: failed to convert resource to external version: %v", err))
176+
continue
177+
}
178+
info.Object = external
179+
}
180+
}
181+
150182
newInfos = append(newInfos, info)
151183
}
152184
if len(errs) > 0 {

0 commit comments

Comments
 (0)