跳到主要内容

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
}
  1. 如果*config为"-",则从标准输入(STDIN)读取数据。ioutil.ReadAll(os.Stdin)用于从标准输入读取所有数据,读取到的数据存储在data变量中。如果读取过程中发生错误,则使用glog.Fatalf打印错误信息并终止程序。
  2. 如果*config以"http://"或"https://"开头,那么将其视为一个URL,并通过HTTP请求来获取数据。使用http.Get(*config)发送GET请求,获取响应后检查HTTP状态码,只有当状态码为200时才读取响应主体内容,否则打印错误信息并终止程序。如果读取主体内容过程中发生错误,同样使用glog.Fatalf打印错误信息并终止程序。
  3. 如果上述两种情况都不满足,那么将*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")