in pkg/csi/driver.go [68:108]
func (d *Driver) Run() error {
opts := []grpc.ServerOption{
grpc.UnaryInterceptor(logGRPC),
}
u, err := url.Parse(d.endpoint)
if err != nil {
return fmt.Errorf("cannot parse endpoint %s: %w", d.endpoint, err)
}
var addr string
if u.Scheme == "unix" {
addr = u.Path
if err := os.Remove(addr); err != nil && !os.IsNotExist(err) {
return fmt.Errorf("failed to remove %s: %w", addr, err)
}
listenDir := filepath.Dir(addr)
if _, err := os.Stat(listenDir); err != nil {
if os.IsNotExist(err) {
return fmt.Errorf("expected Kubelet plugin watcher to create parent dir %s but did not find such a dir", listenDir)
} else {
return fmt.Errorf("failed to stat %s: %w", listenDir, err)
}
}
} else if u.Scheme == "tcp" {
addr = u.Host
} else {
return fmt.Errorf("%v endpoint scheme not supported", u.Scheme)
}
listener, err := net.Listen(u.Scheme, addr)
if err != nil {
return fmt.Errorf("failed to listen: %w", err)
}
server := grpc.NewServer(opts...)
csi.RegisterIdentityServer(server, d)
csi.RegisterNodeServer(server, d)
if err := server.Serve(listener); err != nil {
return fmt.Errorf("serving failed: %w", err)
}
return nil
}