code: func (g *Graph) AddPV(pv *corev1.PersistentVolume) {
  	g.lock.Lock()
  	defer g.lock.Unlock()
  
  	// clear existing edges
  	g.deleteVertex_locked(pvVertexType, "", pv.Name)
  
  	// if we have a pvc, establish new edges
  	if pv.Spec.ClaimRef != nil {
  		pvVertex := g.getOrCreateVertex_locked(pvVertexType, "", pv.Name)
  
  		// since we don't know the other end of the pvc -> pod -> node chain (or it may not even exist yet), we can't decorate these edges with kubernetes node info
  		g.graph.SetEdge(simple.Edge{F: pvVertex, T: g.getOrCreateVertex_locked(pvcVertexType, pv.Spec.ClaimRef.Namespace, pv.Spec.ClaimRef.Name)})
  		pvutil.VisitPVSecretNames(pv, func(namespace, secret string, kubeletVisible bool) bool {
  			// This grants access to the named secret in the same namespace as the bound PVC
  			if kubeletVisible {
  				g.graph.SetEdge(simple.Edge{F: g.getOrCreateVertex_locked(secretVertexType, namespace, secret), T: pvVertex})
  			}
  			return true
  		})
  	}
  }
docs: // AddPV sets up edges for the following relationships:
  //
  //   secret -> pv
  //
  //   pv -> pvc