59.kubecfg
readConfigData
// readConfigData reads the bytes from the specified filesytem or network location associated with the *config flag
func readConfigData() []byte {
// read from STDIN
if *config == "-" {
data, err := ioutil.ReadAll(os.Stdin)
if err != nil {
glog.Fatalf("Unable to read from STDIN: %v\n", err)
}
return data
}
// we look for http:// or https:// to determine if valid URL, otherwise do normal file IO
if strings.Index(*config, "http://") == 0 || strings.Index(*config, "https://") == 0 {
resp, err := http.Get(*config)
if err != nil {
glog.Fatalf("Unable to access URL %v: %v\n", *config, err)
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
glog.Fatalf("Unable to read URL, server reported %d %s", resp.StatusCode, resp.Status)
}
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
glog.Fatalf("Unable to read URL %v: %v\n", *config, err)
}
return data
}
data, err := ioutil.ReadFile(*config)
if err != nil {
glog.Fatalf("Unable to read %v: %v\n", *config, err)
}
return data
}
- 如果
*config
为"-",则从标准输入(STDIN)读取数据。ioutil.ReadAll(os.Stdin)
用于从标准输入读取所有数据,读取到的数据存储在data
变量中。如果读取过程中发生错误,则使用glog.Fatalf
打印错误信息并终止程序。 - 如果
*config
以"http://"或"https://"开头,那么将其视为一个URL,并通过HTTP请求来获取数据。使用http.Get(*config)
发送GET请求,获取响应后检查HTTP状态码,只有当状态码为200时才读取响应主体内容,否则打印错误信息并终止程序。如果读取主体内容过程中发生错误,同样使用glog.Fatalf
打印错误信息并终止程序。 - 如果上述两种情况都不满足,那么将
*config
视为一个文件路径,然后尝试从该文件读取数据。使用ioutil.ReadFile(*config)
来读取文件内容,读取到的数据存储在data
变量中。如果读取过程中发生错误,同样使用glog.Fatalf
打印错误信息并终止程序。
向 apiserver 发送请求
r := c.Verb(verb).Path(path)
if len(*selector) > 0 {
r.ParseSelectorParam("labels", *selector)
}
if setBody {
if len(version) > 0 {
data := readConfig(storage, c.RESTClient.Codec)
obj, err := latest.Codec.Decode(data)
if err != nil {
glog.Fatalf("error setting resource version: %v", err)
}
jsonBase, err := runtime.FindTypeMeta(obj)
if err != nil {
glog.Fatalf("error setting resource version: %v", err)
}
jsonBase.SetResourceVersion(version)
data, err = c.RESTClient.Codec.Encode(obj)
if err != nil {
glog.Fatalf("error setting resource version: %v", err)
}
r.Body(data)
} else {
r.Body(readConfig(storage, c.RESTClient.Codec))
}
}
result := r.Do()
obj, err := result.Get()
if err != nil {
glog.Fatalf("Got request error: %v\n", err)
return false
}
if err = printer.PrintObj(obj, os.Stdout); err != nil {
body, _ := result.Raw()
glog.Fatalf("Failed to print: %v\nRaw received object:\n%#v\n\nBody received: %v", err, obj, string(body))
}
fmt.Print("\n")