def __init__(self, core): Bcfg2.Server.Plugin.Plugin.__init__(self, core) Bcfg2.Server.Plugin.ClientRunHooks.__init__(self) Bcfg2.Server.Plugin.Connector.__init__(self) try: key_id = self.core.setup.cfp.get("awstags", "access_key_id") secret_key = self.core.setup.cfp.get("awstags", "secret_access_key") except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): err = sys.exc_info()[1] raise Bcfg2.Server.Plugin.PluginInitError( "AWSTags is not configured in bcfg2.conf: %s" % err) self.debug_log("%s: Connecting to EC2" % self.name) self._ec2 = connect_ec2(aws_access_key_id=key_id, aws_secret_access_key=secret_key) self._tagcache = Cache() try: self._keep_cache = self.core.setup.cfp.getboolean( "awstags", "cache") except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): self._keep_cache = True self.config = PatternFile(os.path.join(self.data, 'config.xml'), core=core)
def __init__(self, core): Bcfg2.Server.Plugin.Plugin.__init__(self, core) Bcfg2.Server.Plugin.ClientRunHooks.__init__(self) Bcfg2.Server.Plugin.Connector.__init__(self) try: key_id = self.core.setup.cfp.get("awstags", "access_key_id") secret_key = self.core.setup.cfp.get("awstags", "secret_access_key") except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): err = sys.exc_info()[1] raise Bcfg2.Server.Plugin.PluginInitError( "AWSTags is not configured in bcfg2.conf: %s" % err) self.debug_log("%s: Connecting to EC2" % self.name) self._ec2 = connect_ec2(aws_access_key_id=key_id, aws_secret_access_key=secret_key) self._tagcache = Cache() try: self._keep_cache = self.core.setup.cfp.getboolean("awstags", "cache") except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): self._keep_cache = True self.config = PatternFile(os.path.join(self.data, 'config.xml'), core=core)
class AWSTags(Bcfg2.Server.Plugin.Plugin, Bcfg2.Server.Plugin.ClientRunHooks, Bcfg2.Server.Plugin.Connector): """ Query tags from AWS via boto, optionally setting group membership """ __rmi__ = Bcfg2.Server.Plugin.Plugin.__rmi__ + ['expire_cache'] def __init__(self, core): Bcfg2.Server.Plugin.Plugin.__init__(self, core) Bcfg2.Server.Plugin.ClientRunHooks.__init__(self) Bcfg2.Server.Plugin.Connector.__init__(self) try: key_id = self.core.setup.cfp.get("awstags", "access_key_id") secret_key = self.core.setup.cfp.get("awstags", "secret_access_key") except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): err = sys.exc_info()[1] raise Bcfg2.Server.Plugin.PluginInitError( "AWSTags is not configured in bcfg2.conf: %s" % err) self.debug_log("%s: Connecting to EC2" % self.name) self._ec2 = connect_ec2(aws_access_key_id=key_id, aws_secret_access_key=secret_key) self._tagcache = Cache() try: self._keep_cache = self.core.setup.cfp.getboolean("awstags", "cache") except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): self._keep_cache = True self.config = PatternFile(os.path.join(self.data, 'config.xml'), core=core) def _load_instance(self, hostname): """ Load an instance from EC2 whose private DNS name matches the given hostname """ self.debug_log("AWSTags: Loading instance with private-dns-name=%s" % hostname) filters = {'private-dns-name': hostname} reservations = self._ec2.get_all_instances(filters=filters) if reservations: res = reservations[0] if res.instances: return res.instances[0] raise NoInstanceFound( "AWSTags: No instance found with private-dns-name=%s" % hostname) def _get_tags_from_ec2(self, hostname): """ Get tags for the given host from EC2. This does not use the local caching layer. """ self.debug_log("AWSTags: Getting tags for %s from AWS" % hostname) try: return self._load_instance(hostname).tags except NoInstanceFound: self.debug_log(sys.exc_info()[1]) return dict() def get_tags(self, metadata): """ Get tags for the given host. This caches the tags locally if 'cache' in the ``[awstags]`` section of ``bcfg2.conf`` is true. """ if not self._keep_cache: return self._get_tags_from_ec2(metadata) if metadata.hostname not in self._tagcache: self._tagcache[metadata.hostname] = \ self._get_tags_from_ec2(metadata.hostname) return self._tagcache[metadata.hostname] def expire_cache(self, key=None): """ Expire the cache for one host, or for all hosts. This is exposed as an XML-RPC RMI. """ self._tagcache.expire(key=key) def start_client_run(self, metadata): self.expire_cache(key=metadata.hostname) def get_additional_data(self, metadata): return self.get_tags(metadata) def get_additional_groups(self, metadata): return self.config.get_groups(self.get_tags(metadata))
class AWSTags(Bcfg2.Server.Plugin.Plugin, Bcfg2.Server.Plugin.ClientRunHooks, Bcfg2.Server.Plugin.Connector): """ Query tags from AWS via boto, optionally setting group membership """ __rmi__ = Bcfg2.Server.Plugin.Plugin.__rmi__ + ['expire_cache'] def __init__(self, core): Bcfg2.Server.Plugin.Plugin.__init__(self, core) Bcfg2.Server.Plugin.ClientRunHooks.__init__(self) Bcfg2.Server.Plugin.Connector.__init__(self) try: key_id = self.core.setup.cfp.get("awstags", "access_key_id") secret_key = self.core.setup.cfp.get("awstags", "secret_access_key") except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): err = sys.exc_info()[1] raise Bcfg2.Server.Plugin.PluginInitError( "AWSTags is not configured in bcfg2.conf: %s" % err) self.debug_log("%s: Connecting to EC2" % self.name) self._ec2 = connect_ec2(aws_access_key_id=key_id, aws_secret_access_key=secret_key) self._tagcache = Cache() try: self._keep_cache = self.core.setup.cfp.getboolean( "awstags", "cache") except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): self._keep_cache = True self.config = PatternFile(os.path.join(self.data, 'config.xml'), core=core) def _load_instance(self, hostname): """ Load an instance from EC2 whose private DNS name matches the given hostname """ self.debug_log("AWSTags: Loading instance with private-dns-name=%s" % hostname) filters = {'private-dns-name': hostname} reservations = self._ec2.get_all_instances(filters=filters) if reservations: res = reservations[0] if res.instances: return res.instances[0] raise NoInstanceFound( "AWSTags: No instance found with private-dns-name=%s" % hostname) def _get_tags_from_ec2(self, hostname): """ Get tags for the given host from EC2. This does not use the local caching layer. """ self.debug_log("AWSTags: Getting tags for %s from AWS" % hostname) try: return self._load_instance(hostname).tags except NoInstanceFound: self.debug_log(sys.exc_info()[1]) return dict() def get_tags(self, metadata): """ Get tags for the given host. This caches the tags locally if 'cache' in the ``[awstags]`` section of ``bcfg2.conf`` is true. """ if not self._keep_cache: return self._get_tags_from_ec2(metadata) if metadata.hostname not in self._tagcache: self._tagcache[metadata.hostname] = \ self._get_tags_from_ec2(metadata.hostname) return self._tagcache[metadata.hostname] def expire_cache(self, key=None): """ Expire the cache for one host, or for all hosts. This is exposed as an XML-RPC RMI. """ self._tagcache.expire(key=key) def start_client_run(self, metadata): self.expire_cache(key=metadata.hostname) if self.core.metadata_cache_mode == 'aggressive': self.logger.warning("AWSTags is incompatible with aggressive " "client metadata caching, try 'cautious' " "or 'initial'") self.core.metadata_cache.expire(metadata.hostname) def get_additional_data(self, metadata): return self.get_tags(metadata) def get_additional_groups(self, metadata): return self.config.get_groups(self.get_tags(metadata))
def expire(self, key=None): self.rpc_q.publish(self.method, args=[key]) Cache.expire(self, key=key)
def __init__(self, *args, **kwargs): self.rpc_q = kwargs.pop("queue") Bcfg2.Server.Plugin.Debuggable.__init__(self) Cache.__init__(self, *args, **kwargs)