package cri import ( "fmt" "net" "net/url" "time" "google.golang.org/grpc" client "github.com/weaveworks/scope/cri/runtime" ) const unixProtocol = "unix" func dial(addr string, timeout time.Duration) (net.Conn, error) { return net.DialTimeout(unixProtocol, addr, timeout) } func getAddressAndDialer(endpoint string) (string, func(addr string, timeout time.Duration) (net.Conn, error), error) { protocol, addr, err := parseEndpointWithFallbackProtocol(endpoint, unixProtocol) if err != nil { return "", nil, err } if protocol != unixProtocol { return "", nil, fmt.Errorf("endpoint was not unix socket %v", protocol) } return addr, dial, nil } func parseEndpointWithFallbackProtocol(endpoint string, fallbackProtocol string) (protocol string, addr string, err error) { if protocol, addr, err = parseEndpoint(endpoint); err != nil && protocol == "" { fallbackEndpoint := fallbackProtocol + "://" + endpoint protocol, addr, err = parseEndpoint(fallbackEndpoint) if err != nil { return "", "", err } } return } func parseEndpoint(endpoint string) (string, string, error) { u, err := url.Parse(endpoint) if err != nil { return "", "", err } if u.Scheme == "tcp" { return "tcp", u.Host, nil } else if u.Scheme == "unix" { return "unix", u.Path, nil } else if u.Scheme == "" { return "", "", fmt.Errorf("Using %q as endpoint is deprecated, please consider using full url format", endpoint) } else { return u.Scheme, "", fmt.Errorf("protocol %q not supported", u.Scheme) } } // NewCRIClient creates client to CRI. func NewCRIClient(endpoint string) (client.RuntimeServiceClient, error) { addr, dailer, err := getAddressAndDialer(endpoint) if err != nil { return nil, err } conn, err := grpc.Dial(addr, grpc.WithInsecure(), grpc.WithDialer(dailer)) if err != nil { return nil, err } return client.NewRuntimeServiceClient(conn), nil }