code: func (g *Cloud) GetNodeTags(nodeNames []string) ([]string, error) {
  	// If nodeTags were specified through configuration, use them
  	if len(g.nodeTags) > 0 {
  		return g.nodeTags, nil
  	}
  
  	g.computeNodeTagLock.Lock()
  	defer g.computeNodeTagLock.Unlock()
  
  	// Early return if hosts have not changed
  	hosts := sets.NewString(nodeNames...)
  	if hosts.Equal(g.lastKnownNodeNames) {
  		return g.lastComputedNodeTags, nil
  	}
  
  	// Get GCE instance data by hostname
  	instances, err := g.getInstancesByNames(nodeNames)
  	if err != nil {
  		return nil, err
  	}
  
  	// Determine list of host tags
  	tags, err := g.computeHostTags(instances)
  	if err != nil {
  		return nil, err
  	}
  
  	// Save the list of tags
  	g.lastKnownNodeNames = hosts
  	g.lastComputedNodeTags = tags
  	return tags, nil
  }
docs: // GetNodeTags will first try returning the list of tags specified in GCE cloud Configuration.
  // If they weren't provided, it'll compute the host tags with the given hostnames. If the list
  // of hostnames has not changed, a cached set of nodetags are returned.