Skip to content

Commit

Permalink
Merge pull request #16665 from juanvallejo/jvallejo/export-unstructur…
Browse files Browse the repository at this point in the history
…ed-resources

Automatic merge from submit-queue.

UPSTREAM: 53464: use unstructured builder - oc export

Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1496755

Use unstructured builder to obtain resources before exporting.
This allows us to support service-catalog resources.

**Before**
```
$ oc export serviceinstance/my-service-instance
the provided version "servicecatalog.k8s.io/v1alpha1" has no relevant versions: group servicecatalog.k8s.io has not been registered
no matches for servicecatalog.k8s.io/, Kind=ServiceInstance
```

**After**
```
$ oc export serviceinstance/my-service-instance
apiVersion: servicecatalog.k8s.io/v1alpha1
kind: ServiceInstance
metadata:
  creationTimestamp: ""
  deletionTimestamp: null
  finalizers:
  - kubernetes-incubator/service-catalog
  generation: 1
  name: my-service-instance
  namespace: ""
...
```

cc @openshift/cli-review
  • Loading branch information
openshift-merge-robot authored Oct 26, 2017
2 parents 598a4ac + dd1c7af commit 400b303
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 2 deletions.
45 changes: 43 additions & 2 deletions pkg/oc/cli/cmd/export.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,17 @@ func RunExport(f *clientcmd.Factory, exporter Exporter, in io.Reader, out io.Wri
return err
}

mapper, typer := f.Object()
b := f.NewBuilder(true).
builder, err := f.NewUnstructuredBuilder(true)
if err != nil {
return err
}

mapper, typer, err := f.UnstructuredObject()
if err != nil {
return err
}

b := builder.
NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces).
FilenameParam(explicit, &resource.FilenameOptions{Recursive: false, Filenames: filenames}).
SelectorParam(selector).
Expand All @@ -132,12 +141,44 @@ func RunExport(f *clientcmd.Factory, exporter Exporter, in io.Reader, out io.Wri
newInfos := []*resource.Info{}
errs := []error{}
for _, info := range infos {
converted := false

// convert unstructured object to runtime.Object
data, err := runtime.Encode(kapi.Codecs.LegacyCodec(), info.Object)
if err != nil {
errs = append(errs, err)
continue
}
decoded, err := runtime.Decode(f.Decoder(true), data)
if err == nil {
// ignore error, if any, in order to allow resources
// not known by the client to still be exported
info.Object = decoded
converted = true
}

if err := exporter.Export(info.Object, exact); err != nil {
if err == ErrExportOmit {
continue
}
errs = append(errs, err)
}

// if an unstructured resource was successfully converted by the universal decoder,
// re-convert that object once again into its external version.
// If object cannot be converted to an external version, ignore error and proceed with
// internal version.
if converted {
if data, err = runtime.Encode(kapi.Codecs.LegacyCodec(outputVersion), info.Object); err == nil {
external, err := runtime.Decode(f.Decoder(false), data)
if err != nil {
errs = append(errs, fmt.Errorf("error: failed to convert resource to external version: %v", err))
continue
}
info.Object = external
}
}

newInfos = append(newInfos, info)
}
if len(errs) > 0 {
Expand Down

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

0 comments on commit 400b303

Please sign in to comment.