-
Notifications
You must be signed in to change notification settings - Fork 113
/
invoke_decode_yaml.go
72 lines (62 loc) · 2.21 KB
/
invoke_decode_yaml.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2016-2019, Pulumi Corporation.
//
// 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 provider
import (
"io"
"strings"
"github.com/pulumi/pulumi-kubernetes/provider/v4/pkg/clients"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/yaml"
)
// decodeYaml parses a YAML string, and then returns a slice of untyped structs that can be marshalled into
// Pulumi RPC calls. If a default namespace is specified, set that on the relevant decoded objects.
func decodeYaml(text, defaultNamespace string, clientSet *clients.DynamicClientSet) ([]any, error) {
var resources []unstructured.Unstructured
dec := yaml.NewYAMLOrJSONDecoder(io.NopCloser(strings.NewReader(text)), 128)
for {
var value map[string]any
if err := dec.Decode(&value); err != nil {
if err == io.EOF {
break
}
return nil, err
}
resource := unstructured.Unstructured{Object: value}
// Sometimes manifests include empty resources, so skip these.
if len(resource.GetKind()) == 0 || len(resource.GetAPIVersion()) == 0 {
continue
}
if len(defaultNamespace) > 0 {
namespaced, err := clients.IsNamespacedKind(resource.GroupVersionKind(), clientSet)
if err != nil {
if clients.IsNoNamespaceInfoErr(err) {
// Assume resource is namespaced.
namespaced = true
} else {
return nil, err
}
}
// Set namespace if resource Kind is namespaced and namespace is not already set.
if namespaced && len(resource.GetNamespace()) == 0 {
resource.SetNamespace(defaultNamespace)
}
}
resources = append(resources, resource)
}
result := make([]any, 0, len(resources))
for _, resource := range resources {
result = append(result, resource.Object)
}
return result, nil
}