def install(self, nodes=None): ''' Write out the config, then restart services. After this runs, we should have a configured and running service. ''' cfg = hookenv.config() myid = hookenv.local_unit().split('/')[1] datadir = unitdata.kv().get('zookeeper.storage.data_dir', os.path.join(APP_DATADIR)) os.makedirs(datadir, exist_ok=True) context = { 'myid': myid, 'datadir': datadir, 'ensemble': self.read_peers(), 'client_bind_addr': hookenv.unit_private_ip(), 'port': ZK_PORT, 'autopurge_purge_interval': cfg.get('autopurge_purge_interval'), 'autopurge_snap_retain_count': cfg.get('autopurge_snap_retain_count'), 'jmx_port': cfg.get('jmx_port'), } for file_config in ('zoo.cfg', 'environment'): render(source=file_config, target=os.path.join(APP_COMMON, file_config), owner='root', perms=0o644, context=context) with open(os.path.join(datadir, 'myid'), 'w') as f: f.write(myid) self.restart() if self.is_zk_leader(): zkpeer = RelationBase.from_state('zkpeer.joined') zkpeer.set_zk_leader()
def update_clients(): """ Sends the combined list of connected and external registered services to any connected clients. """ services = all_services() clients = RelationBase.from_state('hub.client') if clients: clients.provide_services(services)
def all_services(): """ Combines both connected and external registered services. """ services = kv().get('external-services', {}) providers = RelationBase.from_state('hub.provider') if providers: for name, datas in providers.registered_services().items(): services.setdefault(name, []).extend(datas) return services
def update_db_config(): mysql = RelationBase.from_state('database.available') db_type = 'mysql' if mysql else 'sqlite' hookenv.log('Updating database config, using: %s' % db_type) render(source='%s.js.template' % db_type, target=path.join(node_dist_dir(), 'dbconfig.js'), context={ 'db': mysql, 'dist_dir': node_dist_dir(), })
def get_zks(self): ''' Will attempt to read zookeeper nodes from the zookeeper.joined state. If the flag has never been set, an empty list will be returned. ''' zk = RelationBase.from_flag('zookeeper.joined') if zk: return zk.zookeepers() else: return []
def get_kafkas(self): ''' Will attempt to read kafka nodes from the kafka.joined state. If the flag has never been set, an empty list will be returned. ''' kafka = RelationBase.from_flag('kafka.joined') if kafka: return kafka.kafkas() else: return []
def check_db_changed(): mysql = RelationBase.from_state('database.available') db_data = [] if mysql: db_data.extend(( mysql.host(), mysql.port(), mysql.database(), mysql.user(), mysql.password() )) return data_changed('ghost.db', db_data)
def install(self, nodes=None): ''' Write out the config, then run puppet. After this runs, we should have a configured and running service. ''' bigtop = Bigtop() log("Rendering site yaml ''with overrides: {}".format(self._override)) bigtop.render_site_yaml(self._hosts, self._roles, self._override) bigtop.trigger_puppet() if self.is_zk_leader(): zkpeer = RelationBase.from_state('zkpeer.joined') zkpeer.set_zk_leader()
def read_peers(self): ''' Fetch the list of peers available. The first item in this list should always be the node that this code is executing on. ''' # A Zookeeper node likes to be first on the list. nodes = [(local_unit(), unit_private_ip())] # Get the list of peers zkpeer = RelationBase.from_state('zkpeer.joined') if zkpeer: nodes.extend(sorted(zkpeer.get_nodes())) nodes = [format_node(*node) for node in nodes] return nodes
def arg_gen(): # use a generator to defer calling of hookenv.relation_type, for tests rel = RelationBase.from_name(hookenv.relation_type()) if rel: yield rel