mirror of
https://github.com/weaveworks/scope.git
synced 2026-05-23 17:42:53 +00:00
84 lines
1.7 KiB
Go
84 lines
1.7 KiB
Go
package cri
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"net/url"
|
|
"time"
|
|
|
|
"google.golang.org/grpc"
|
|
|
|
client "github.com/weaveworks/scope/cri/runtime"
|
|
)
|
|
|
|
const (
|
|
unixProtocol = "unix"
|
|
tcpProtocol = "tcp"
|
|
)
|
|
|
|
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) {
|
|
addr, err := parseEndpointWithFallbackProtocol(endpoint, unixProtocol)
|
|
if err != nil {
|
|
return "", nil, err
|
|
}
|
|
|
|
return addr, dial, nil
|
|
}
|
|
|
|
func parseEndpointWithFallbackProtocol(endpoint string, fallbackProtocol string) (addr string, err error) {
|
|
var protocol string
|
|
|
|
protocol, addr, err = parseEndpoint(endpoint)
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if protocol == "" {
|
|
fallbackEndpoint := fallbackProtocol + "://" + endpoint
|
|
_, addr, err = parseEndpoint(fallbackEndpoint)
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
}
|
|
return addr, err
|
|
}
|
|
|
|
func parseEndpoint(endpoint string) (string, string, error) {
|
|
u, err := url.Parse(endpoint)
|
|
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
switch u.Scheme {
|
|
case tcpProtocol:
|
|
return tcpProtocol, u.Host, fmt.Errorf("endpoint was not unix socket %v", u.Scheme)
|
|
case unixProtocol:
|
|
return unixProtocol, u.Path, nil
|
|
case "":
|
|
return "", "", nil
|
|
default:
|
|
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
|
|
}
|