| /* |
| Copyright 2017 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 openapi |
| |
| import ( |
| "errors" |
| |
| openapi_v2 "github.com/googleapis/gnostic/OpenAPIv2" |
| yaml "gopkg.in/yaml.v2" |
| "k8s.io/apimachinery/pkg/runtime/schema" |
| ) |
| |
| func hasGVKExtension(extensions []*openapi_v2.NamedAny, gvk schema.GroupVersionKind) bool { |
| for _, extension := range extensions { |
| if extension.GetValue().GetYaml() == "" || |
| extension.GetName() != "x-kubernetes-group-version-kind" { |
| continue |
| } |
| var value map[string]string |
| err := yaml.Unmarshal([]byte(extension.GetValue().GetYaml()), &value) |
| if err != nil { |
| continue |
| } |
| |
| if value["group"] == gvk.Group && value["kind"] == gvk.Kind && value["version"] == gvk.Version { |
| return true |
| } |
| return false |
| } |
| return false |
| } |
| |
| // SupportsDryRun is a method that let's us look in the OpenAPI if the |
| // specific group-version-kind supports the dryRun query parameter for |
| // the PATCH end-point. |
| func SupportsDryRun(doc *openapi_v2.Document, gvk schema.GroupVersionKind) (bool, error) { |
| for _, path := range doc.GetPaths().GetPath() { |
| // Is this describing the gvk we're looking for? |
| if !hasGVKExtension(path.GetValue().GetPatch().GetVendorExtension(), gvk) { |
| continue |
| } |
| for _, param := range path.GetValue().GetPatch().GetParameters() { |
| if param.GetParameter().GetNonBodyParameter().GetQueryParameterSubSchema().GetName() == "dryRun" { |
| return true, nil |
| } |
| } |
| return false, nil |
| } |
| |
| return false, errors.New("couldn't find GVK in openapi") |
| } |