def list_available_images(self, node_name): """List the images available on the specified node.""" host_conf = None for conf in self.docker_config: if conf.name == node_name: host_conf = conf break if host_conf is None: log.error('Unknown node {}, returning empty image list'.format( node_name)) return [] my_engine = DockerClient(host_conf) image_list = [] for dk_image in my_engine.list_images(): image = { 'id': dk_image.attrs['Id'], 'size': dk_image.attrs['Size'], 'names': dk_image.tags } for name in image['names']: if name[-7:] == ':latest': # add an image with the name without 'latest' to fake Docker image lookup algorithm image['names'].append(name[:-7]) break image_list.append(image) return image_list
def _host_subthread(self, host_config: DockerHostConfig): log.info("Synchro thread for host {} started".format(host_config.name)) self.host_stats[host_config.name] = NodeStats(host_config.name) while True: time_start = time.time() try: my_engine = DockerClient(host_config) container_list = my_engine.list( only_label={ 'zoe_deployment_name': get_conf().deployment_name }) info = my_engine.info() except ZoeException as e: self.host_stats[host_config.name].status = 'offline' log.error(str(e)) log.info('Node {} is offline'.format(host_config.name)) else: if self.host_stats[host_config.name].status == 'offline': log.info('Node {} is now online'.format(host_config.name)) self.host_stats[host_config.name].status = 'online' self.host_stats[ host_config.name].container_count = info['Containers'] self.host_stats[host_config.name].cores_total = info['NCPU'] self.host_stats[ host_config.name].memory_total = info['MemTotal'] self.host_stats[host_config.name].labels = host_config.labels if info['Labels'] is not None: self.host_stats[host_config.name].labels.union( set(info['Labels'])) self.host_stats[host_config.name].memory_allocated = sum([ cont['memory_soft_limit'] for cont in container_list if cont['memory_soft_limit'] != info['MemTotal'] ]) self.host_stats[host_config.name].cores_allocated = sum([ cont['cpu_quota'] / cont['cpu_period'] for cont in container_list if cont['cpu_period'] != 0 ]) stats = {} self.host_stats[host_config.name].memory_reserved = 0 self.host_stats[host_config.name].cores_reserved = 0 for cont in container_list: service = self.state.services.select( only_one=True, backend_host=host_config.name, backend_id=cont['id']) if service is None: log.warning( 'Container {} on host {} has no corresponding service' .format(cont['name'], host_config.name)) if cont['state'] == Service.BACKEND_DIE_STATUS: log.warning( 'Terminating dead and orphan container {}'. format(cont['name'])) my_engine.terminate_container(cont['id'], delete=True) continue self._update_service_status(service, cont) self.host_stats[ host_config. name].memory_reserved += service.resource_reservation.memory.min self.host_stats[ host_config. name].cores_reserved += service.resource_reservation.cores.min stats[service.id] = { 'core_limit': cont['cpu_quota'] / cont['cpu_period'], 'mem_limit': cont['memory_soft_limit'] } self.host_stats[host_config.name].service_stats = stats self.host_stats[host_config.name].images = [] for dk_image in my_engine.list_images(): image = { 'id': dk_image.attrs['Id'], 'size': dk_image.attrs['Size'], 'names': dk_image.tags # type: list } for name in image['names']: if name[-7:] == ':latest': # add an image with the name without 'latest' to fake Docker image lookup algorithm image['names'].append(name[:-7]) break self.host_stats[host_config.name].images.append(image) sleep_time = CHECK_INTERVAL - (time.time() - time_start) if sleep_time <= 0: log.warning( 'synchro thread for host {} is late by {:.2f} seconds'. format(host_config.name, sleep_time * -1)) sleep_time = 0 if self.stop.wait(timeout=sleep_time): break log.info("Synchro thread for host {} stopped".format(host_config.name))