code: func (util *portworxVolumeUtil) getPortworxDriver(volumeHost volume.VolumeHost) (volumeapi.VolumeDriver, error) {
  	// check if existing saved client is valid
  	if isValid, _ := isClientValid(util.portworxClient); isValid {
  		return volumeclient.VolumeDriver(util.portworxClient), nil
  	}
  
  	// create new client
  	var err error
  	util.portworxClient, err = createDriverClient(volumeHost.GetHostName(), osdMgmtDefaultPort) // for backward compatibility
  	if err != nil || util.portworxClient == nil {
  		// Create client from portworx k8s service.
  		svc, err := getPortworxService(volumeHost)
  		if err != nil {
  			return nil, err
  		}
  
  		// The port here is always the default one since  it's the service port
  		util.portworxClient, err = createDriverClient(svc.Spec.ClusterIP, osdMgmtDefaultPort)
  		if err != nil || util.portworxClient == nil {
  			klog.Errorf("Failed to connect to portworx service. Err: %v", err)
  			return nil, err
  		}
  
  		klog.Infof("Using portworx cluster service at: %v:%d as api endpoint",
  			svc.Spec.ClusterIP, osdMgmtDefaultPort)
  	} else {
  		klog.Infof("Using portworx service at: %v:%d as api endpoint",
  			volumeHost.GetHostName(), osdMgmtDefaultPort)
  	}
  
  	return volumeclient.VolumeDriver(util.portworxClient), nil
  }
docs: // getPortworxDriver returns a Portworx volume driver which can be used for cluster wide operations.
  //   Operations like create and delete volume don't need to be restricted to local volume host since
  //   any node in the Portworx cluster can co-ordinate the create/delete request and forward the operations to
  //   the Portworx node that will own/owns the data.