func()

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
}