| /* |
| Copyright 2018 The Kubernetes Authors. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| package conversion |
| |
| import ( |
| "errors" |
| "fmt" |
| |
| "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" |
| "k8s.io/apimachinery/pkg/runtime" |
| "k8s.io/apimachinery/pkg/runtime/schema" |
| ) |
| |
| // nopConverter is a converter that only sets the apiVersion fields, but does not real conversion. |
| type nopConverter struct { |
| validVersions map[schema.GroupVersion]bool |
| } |
| |
| var _ runtime.ObjectConvertor = &nopConverter{} |
| |
| func (nopConverter) ConvertFieldLabel(gvk schema.GroupVersionKind, label, value string) (string, string, error) { |
| return "", "", errors.New("unstructured cannot convert field labels") |
| } |
| |
| func (c *nopConverter) Convert(in, out, context interface{}) error { |
| unstructIn, ok := in.(*unstructured.Unstructured) |
| if !ok { |
| return fmt.Errorf("input type %T in not valid for unstructured conversion", in) |
| } |
| |
| unstructOut, ok := out.(*unstructured.Unstructured) |
| if !ok { |
| return fmt.Errorf("output type %T in not valid for unstructured conversion", out) |
| } |
| |
| outGVK := unstructOut.GroupVersionKind() |
| if !c.validVersions[outGVK.GroupVersion()] { |
| return fmt.Errorf("request to convert CR from an invalid group/version: %s", outGVK.String()) |
| } |
| inGVK := unstructIn.GroupVersionKind() |
| if !c.validVersions[inGVK.GroupVersion()] { |
| return fmt.Errorf("request to convert CR to an invalid group/version: %s", inGVK.String()) |
| } |
| |
| unstructOut.SetUnstructuredContent(unstructIn.UnstructuredContent()) |
| _, err := c.ConvertToVersion(unstructOut, outGVK.GroupVersion()) |
| if err != nil { |
| return err |
| } |
| return nil |
| } |
| |
| func (c *nopConverter) ConvertToVersion(in runtime.Object, target runtime.GroupVersioner) (runtime.Object, error) { |
| kind := in.GetObjectKind().GroupVersionKind() |
| gvk, ok := target.KindForGroupVersionKinds([]schema.GroupVersionKind{kind}) |
| if !ok { |
| // TODO: should this be a typed error? |
| return nil, fmt.Errorf("%v is unstructured and is not suitable for converting to %q", kind, target) |
| } |
| if !c.validVersions[gvk.GroupVersion()] { |
| return nil, fmt.Errorf("request to convert CR to an invalid group/version: %s", gvk.String()) |
| } |
| in.GetObjectKind().SetGroupVersionKind(gvk) |
| return in, nil |
| } |