karmada/pkg/karmadactl/cmdinit/utils/format.go

150 lines
2.9 KiB
Go

package utils
import (
"bytes"
"fmt"
"io"
"net"
"net/http"
"os"
"path/filepath"
"strings"
"sigs.k8s.io/yaml"
)
const (
// Query the IP address of the current host accessing the Internet
getInternetIPUrl = "https://myexternalip.com/raw"
// A split symbol that receives multiple values from a command flag
separator = ","
labelSeparator = "="
// MaxRespBodyLength is the max length of http response body
MaxRespBodyLength = 1 << 20 // 1 MiB
)
// IsExist Determine whether the path exists
func IsExist(path string) bool {
_, err := os.Stat(path)
return err == nil
}
// StringToNetIP String To NetIP
func StringToNetIP(addr string) net.IP {
if ip := net.ParseIP(addr); ip != nil {
return ip
}
return net.ParseIP("127.0.0.1")
}
// FlagsIP Receive master external IP from command flags
func FlagsIP(ip string) []net.IP {
var ips []net.IP
arr := strings.Split(ip, separator)
for _, v := range arr {
ips = append(ips, StringToNetIP(v))
}
return ips
}
// FlagsDNS Receive master external DNS from command flags
func FlagsDNS(dns string) []string {
return strings.Split(dns, separator)
}
// InternetIP Current host Internet IP.
func InternetIP() (net.IP, error) {
resp, err := http.Get(getInternetIPUrl)
if err != nil {
return nil, err
}
defer resp.Body.Close()
content, err := io.ReadAll(io.LimitReader(resp.Body, MaxRespBodyLength))
if err != nil {
return nil, err
}
return StringToNetIP(string(content)), nil
}
// FileToBytes File Conversion Bytes
func FileToBytes(path, name string) ([]byte, error) {
filename := filepath.Join(path, name)
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
stats, err := file.Stat()
if err != nil {
return nil, err
}
data := make([]byte, stats.Size())
_, err = file.Read(data)
if err != nil {
return nil, err
}
return data, nil
}
// BytesToFile Bytes Conversion File
func BytesToFile(path, name string, data []byte) error {
filename := filepath.Join(path, name)
_, err := os.Stat(filename)
if err == nil {
return nil
}
// Create kubeconfig
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
_, err = f.Write(data)
if err != nil {
return err
}
return nil
}
// MapToString labels to string
func MapToString(labels map[string]string) string {
v := new(bytes.Buffer)
for key, value := range labels {
fmt.Fprintf(v, "%s=%s,", key, value)
}
return strings.TrimRight(v.String(), ",")
}
// StringToMap string to label
func StringToMap(labels string) map[string]string {
l := map[string]string{}
slice := strings.Split(labels, labelSeparator)
if len(slice) != 2 {
return nil
}
l[slice[0]] = slice[1]
return l
}
// StaticYamlToJSONByte Static yaml file conversion JSON Byte
func StaticYamlToJSONByte(staticYaml string) []byte {
jsonByte, err := yaml.YAMLToJSON([]byte(staticYaml))
if err != nil {
fmt.Println("Error convert string to json byte.")
os.Exit(1)
}
return jsonByte
}