code: func (gce *Cloud) ListRoutes(clusterName string) ([]*cloudprovider.Route, error) {
  	var routes []*cloudprovider.Route
  	pageToken := ""
  	page := 0
  	for ; page == 0 || (pageToken != "" && page < maxPages); page++ {
  		listCall := gce.service.Routes.List(gce.projectID)
  
  		prefix := truncateClusterName(clusterName)
  		listCall = listCall.Filter("name eq " + prefix + "-.*")
  		if pageToken != "" {
  			listCall = listCall.PageToken(pageToken)
  		}
  		res, err := listCall.Do()
  		if err != nil {
  			glog.Errorf("Error getting routes from GCE: %v", err)
  			return nil, err
  		}
  		pageToken = res.NextPageToken
  		for _, r := range res.Items {
  			if r.Network != gce.networkURL {
  				continue
  			}
  			// Not managed if route description != "k8s-node-route"
  			if r.Description != k8sNodeRouteTag {
  				continue
  			}
  			// Not managed if route name doesn't start with <clusterName>
  			if !strings.HasPrefix(r.Name, prefix) {
  				continue
  			}
  
  			target := path.Base(r.NextHopInstance)
  			// TODO: Should we lastComponent(target) this?
  			targetNodeName := types.NodeName(target) // NodeName == Instance Name on GCE
  			routes = append(routes, &cloudprovider.Route{Name: r.Name, TargetNode: targetNodeName, DestinationCIDR: r.DestRange})
  		}
  	}
  	if page >= maxPages {
  		glog.Errorf("ListRoutes exceeded maxPages=%d for Routes.List; truncating.", maxPages)
  	}
  	return routes, nil
  }
docs: // ListRoutes lists routes