# == TagManager
#
# The TagManager provides a way of querying tags. Tags are keywords
# associated with a specific hostname or group. These are useful for grouping
# together hosts and defining common behavior for them.
#
# === Basics
#
# The tags are typically stored in a Project's config/tags.yml file.
#
# For example, consider this config/tags.yml file:
# desktops:
# - satori
# - sunyata
# - michiru
# notebooks:
# - rheya
# - avijja
#
# With the above file, if we're on the host called "satori", we can query the
# fields like this:
# tags # => ["satori", "desktops", "localhost", ...]
#
# tagged?("desktops") # => true
# tagged?("notebooks") # => false
# tagged?(:satori) # => true
# tagged?("satori") # => true
# tagged?("satori || desktops") # => true
# tagged?("(satori || desktops) && !notebooks") # => true
#
# === Traits
#
# Your system may also automatically add tags that describe your system's
# traits, such as the name of the operating system, distribution release,
# hardware architecture, hostnames, IP addresses, etc.
#
# For example, here is a full set of tags for a system:
#
# ai> pp tags.sort # Pretty print the tags in sorted order
# ["10.0.0.6", # IPv4 addresses
# "127.0.0.1", # ...
# "192.168.130.1", # ...
# "::1/128", # IPv6 addresses
# "fe80::250:56ff:fec0:8/64", # ...
# "fe80::250:8dff:fe95:8fe9/64", # ...
# "i686", # Hardware architecture
# "linux", # OS
# "linux_i686", # OS and architecture
# "localhost", # Variants of hostname
# "localhost.localdomain", # ...
# "michiru", # ...
# "michiru.koshevoy", # ...
# "michiru.koshevoy.net", # ...
# "myapp_servers", # User defined tags
# "rails_servers", # ...
# "ubuntu", # OS distribution name
# "ubuntu_6.06"] # OS distribution name and release version
#
# To execute code only on an Ubuntu system:
#
# if tagged?("ubuntu")
# # Code will only be run on Ubuntu systems
# end
#
# These additional tags are retrieved from the PlatformManager and
# AddressManager. If your platform does not provide drivers for these, you will
# not get these tags. If you're on an unsupported platform and do not want to
# write drivers, you can work around this by manually declaring the missing
# tags in config/tags.yml on a host-by-host basis.
#
# === Inclusion and negation
#
# You can include and negate tags declaratively by giving "@" and "!" prefixes
# to arguments.
#
# For example, consider this config/tags.yml file:
#
# apache_servers:
# - kurou
# - shirou
# apache_servers_except_kurou:
# - @apache_servers
# - !kurou
#
# This will produce the following results:
#
# ai> hosts_tagged_with("apache_servers")
# => ["kurou", "shirou"]
# ai> hosts_tagged_with("apache_servers_except_kurou")
# => ["shirou"]
class AutomateIt::TagManager < AutomateIt::Plugin::Manager
alias_methods :hosts_tagged_with, :tags, :tagged?, :tags_for
# Return a list of hosts that match the query. See #tagged? for information
# on query syntax.
def hosts_tagged_with(query) dispatch(query) end
# Return a list of tags for this host.
def tags() dispatch() end
# Is this host tagged with the +query+?
#
# Examples:
# tags # => ["localhost", "foo", "bar", ...]
#
# tagged?(:localhost) # => true
# tagged?("localhost") # => true
# tagged?("localhost && foo") # => true
# tagged?("localhost || foo") # => true
# tagged?("!foo") # => false
# tagged?("(localhost || foo) && bar") # => true
def tagged?(query, hostname=nil) dispatch(query, hostname) end
# Return a list of tags for the host.
def tags_for(hostname) dispatch(hostname) end
end
# == TagManager::BaseDriver
#
# Base class for all TagManager drivers.
class AutomateIt::TagManager::BaseDriver < AutomateIt::Plugin::Driver
end
# Drivers
require 'automateit/tag_manager/tag_parser'
require 'automateit/tag_manager/struct'
require 'automateit/tag_manager/yaml'