code: func (f *PluginFilter) Check(n *NodeInfo) bool {
  	if n.Description == nil || n.Description.Engine == nil {
  		// If the node is not running Engine, plugins are not
  		// supported.
  		return true
  	}
  
  	// Get list of plugins on the node
  	nodePlugins := n.Description.Engine.Plugins
  
  	// Check if all volume plugins required by task are installed on node
  	container := f.t.Spec.GetContainer()
  	if container != nil {
  		for _, mount := range container.Mounts {
  			if referencesVolumePlugin(mount) {
  				if _, exists := f.pluginExistsOnNode("Volume", mount.VolumeOptions.DriverConfig.Name, nodePlugins); !exists {
  					return false
  				}
  			}
  		}
  	}
  
  	// Check if all network plugins required by task are installed on node
  	for _, tn := range f.t.Networks {
  		if tn.Network != nil && tn.Network.DriverState != nil && tn.Network.DriverState.Name != "" {
  			if _, exists := f.pluginExistsOnNode("Network", tn.Network.DriverState.Name, nodePlugins); !exists {
  				return false
  			}
  		}
  	}
  
  	// It's possible that the LogDriver object does not carry a name, just some
  	// configuration options. In that case, the plugin filter shouldn't fail to
  	// schedule the task
  	if f.t.Spec.LogDriver != nil && f.t.Spec.LogDriver.Name != "none" && f.t.Spec.LogDriver.Name != "" {
  		// If there are no log driver types in the list at all, most likely this is
  		// an older daemon that did not report this information. In this case don't filter
  		if typeFound, exists := f.pluginExistsOnNode("Log", f.t.Spec.LogDriver.Name, nodePlugins); !exists && typeFound {
  			return false
  		}
  	}
  	return true
  }
docs: // Check returns true if the task can be scheduled into the given node.
  // TODO(amitshukla): investigate storing Plugins as a map so it can be easily probed