1
16
17 package manifest
18
19 import (
20 "context"
21 "fmt"
22 "io"
23 "net/http"
24 "time"
25
26 appsv1 "k8s.io/api/apps/v1"
27 v1 "k8s.io/api/core/v1"
28 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29 "k8s.io/apimachinery/pkg/runtime"
30 utilyaml "k8s.io/apimachinery/pkg/util/yaml"
31 "k8s.io/client-go/kubernetes/scheme"
32 commonutils "k8s.io/kubernetes/test/e2e/common"
33 "k8s.io/kubernetes/test/e2e/framework"
34 e2etestfiles "k8s.io/kubernetes/test/e2e/framework/testfiles"
35 )
36
37
38 func PodFromManifest(filename string) (*v1.Pod, error) {
39 var pod v1.Pod
40 data, err := e2etestfiles.Read(filename)
41 if err != nil {
42 return nil, err
43 }
44
45 json, err := utilyaml.ToJSON(data)
46 if err != nil {
47 return nil, err
48 }
49 if err := runtime.DecodeInto(scheme.Codecs.UniversalDecoder(), json, &pod); err != nil {
50 return nil, err
51 }
52 return &pod, nil
53 }
54
55
56 func SvcFromManifest(fileName string) (*v1.Service, error) {
57 var svc v1.Service
58 data, err := e2etestfiles.Read(fileName)
59 if err != nil {
60 return nil, err
61 }
62
63 json, err := utilyaml.ToJSON(data)
64 if err != nil {
65 return nil, err
66 }
67 if err := runtime.DecodeInto(scheme.Codecs.UniversalDecoder(), json, &svc); err != nil {
68 return nil, err
69 }
70 return &svc, nil
71 }
72
73
74 func StatefulSetFromManifest(fileName, ns string) (*appsv1.StatefulSet, error) {
75 var ss appsv1.StatefulSet
76 data, err := e2etestfiles.Read(fileName)
77 if err != nil {
78 return nil, err
79 }
80 statefulsetYaml := commonutils.SubstituteImageName(string(data))
81 json, err := utilyaml.ToJSON([]byte(statefulsetYaml))
82 if err != nil {
83 return nil, err
84 }
85 if err := runtime.DecodeInto(scheme.Codecs.UniversalDecoder(), json, &ss); err != nil {
86 return nil, err
87 }
88 ss.Namespace = ns
89 if ss.Spec.Selector == nil {
90 ss.Spec.Selector = &metav1.LabelSelector{
91 MatchLabels: ss.Spec.Template.Labels,
92 }
93 }
94 return &ss, nil
95 }
96
97
98 func DaemonSetFromURL(ctx context.Context, url string) (*appsv1.DaemonSet, error) {
99 framework.Logf("Parsing ds from %v", url)
100
101 var response *http.Response
102 var err error
103
104 for i := 1; i <= 5; i++ {
105 request, reqErr := http.NewRequestWithContext(ctx, "GET", url, nil)
106 if reqErr != nil {
107 err = reqErr
108 continue
109 }
110 response, err = http.DefaultClient.Do(request)
111 if err == nil && response.StatusCode == 200 {
112 break
113 }
114 time.Sleep(time.Duration(i) * time.Second)
115 }
116
117 if err != nil {
118 return nil, fmt.Errorf("Failed to get url: %w", err)
119 }
120 if response.StatusCode != 200 {
121 return nil, fmt.Errorf("invalid http response status: %v", response.StatusCode)
122 }
123 defer response.Body.Close()
124
125 data, err := io.ReadAll(response.Body)
126 if err != nil {
127 return nil, fmt.Errorf("Failed to read html response body: %w", err)
128 }
129 return DaemonSetFromData(data)
130 }
131
132
133 func DaemonSetFromData(data []byte) (*appsv1.DaemonSet, error) {
134 var ds appsv1.DaemonSet
135 dataJSON, err := utilyaml.ToJSON(data)
136 if err != nil {
137 return nil, fmt.Errorf("Failed to parse data to json: %w", err)
138 }
139
140 err = runtime.DecodeInto(scheme.Codecs.UniversalDecoder(), dataJSON, &ds)
141 if err != nil {
142 return nil, fmt.Errorf("Failed to decode DaemonSet spec: %w", err)
143 }
144 return &ds, nil
145 }
146
View as plain text