def create_network(self, network_name="Default", network_driver="overlay"): """ Create overlay network for the virtual connection between services in a swarm :param self: Reference :param network_name: Name of the overlay network (Default: "Default") :param network_driver: Driver of the network engine (Default: "overlay") :return: The created network or a docker result code """ llogger = local_logger.LocalLogger() llogger.log_method_call(self.__class__.__name__, sys._getframe().f_code.co_name) try: if self.has_network_with_name(network_name) is False: llogger.debug( "No network with name %s available. Try to create network. ", network_name) network = self._docker_env.networks.create(network_name, network_driver, attachable=True) else: network = self.get_network_by_name(network_name) return network except docker.errors.APIError: llogger.exception(traceback.format_exc()) raise DockerException("Unable to create network " + network_name)
def _start_container(self, service_definition, remote_logger, swarm_uuid, worker_uuid, hostname, network): llogger = local_logger.LocalLogger() llogger.log_method_call(self.__class__.__name__, sys._getframe().f_code.co_name) try: result = self._docker_env.containers.create( str(service_definition._tag), detach=True, environment=service_definition._environment, volumes=service_definition._volumes, devices=service_definition._devices, hostname=hostname, network=network) llogger.debug(result) remote_logger.debug(result) result.start() llogger.debug( "\n" + service_definition.format_service_definition_as_table()) remote_logger.debug( "\n" + service_definition.format_service_definition_as_table()) return result except (docker.errors.ImageNotFound, docker.errors.APIError): llogger.exception(traceback.format_exc()) raise DockerException("Unable to create container for service " + service_definition._tag)
def init_docker_swarm(self, interface): llogger = local_logger.LocalLogger() llogger.log_method_call(self.__class__.__name__, sys._getframe().f_code.co_name) try: self._docker_env.swarm.init(interface, force_new_cluster=True) except (docker.errors.APIError, ConnectionError): llogger.exception(traceback.format_exc()) raise DockerException("Unable to init docker swarm")
def get_network_by_name(self, network_name): """ Returns an overlay network by its name :param self: Reference :param network_name: Name of the network :return: Object of the network """ llogger = local_logger.LocalLogger() llogger.log_method_call(self.__class__.__name__, sys._getframe().f_code.co_name) try: network_list = self._docker_env.networks.list( names=[str(network_name)]) if len(network_list) == 0: raise DockerException("There is no network with name " + network_name) return network_list[0] except docker.errors.APIError: raise DockerException("Unable to get network list")
def get_join_token(self): llogger = local_logger.LocalLogger() llogger.log_method_call(self.__class__.__name__, sys._getframe().f_code.co_name) try: self._docker_env.swarm.reload() return self._docker_env.swarm.attrs['JoinTokens']['Worker'] except (KeyError, docker.errors.APIError): llogger.debug('No Join Token available') llogger.exception(traceback.format_exc()) raise DockerException("Unable to get join token")
def join_docker_swarm(self, master_address, interface, join_token): llogger = local_logger.LocalLogger() llogger.log_method_call(self.__class__.__name__, sys._getframe().f_code.co_name) try: success = self._docker_env.swarm.join( remote_addrs=[master_address], join_token=join_token, advertise_addr=interface) if not success: raise DockerException( "Unable to join docker swarm with token " + join_token) except docker.errors.APIError: raise DockerException
def has_network_with_name(self, network_name): """ Check the existence of an overlay network by its name :param self: Reference :param network_name: Name of the network :return: Boolean if the network exists """ llogger = local_logger.LocalLogger() llogger.log_method_call(self.__class__.__name__, sys._getframe().f_code.co_name) try: return len( self._docker_env.networks.list(names=[str(network_name)])) > 0 except docker.errors.APIError: raise DockerException("Unable to get network list")
def _pull_image(self, image_tag): llogger = local_logger.LocalLogger() llogger.log_method_call(self.__class__.__name__, sys._getframe().f_code.co_name) if self.is_image_available(image_tag): llogger.debug( 'Image {0} already downloaded. Using downloaded image.'.format( image_tag)) return True try: result = self._docker_env.images.pull(str(image_tag)) return result is not None except docker.errors.APIError: llogger.debug("Unable to load image %s", image_tag) raise DockerException("Unable to load image " + image_tag)
def get_image_size(self, image_tag): """ Returns the image size of the image :param image_tag: name of the image :return: size of image, if an error occurred or the image was not found -1 is returned instead """ llogger = local_logger.LocalLogger() llogger.log_method_call(self.__class__.__name__, sys._getframe().f_code.co_name) if not self.is_image_available(image_tag): return -1 try: image = self._docker_env.images.get(image_tag) if image is not None: return image.attrs.get('Size') except docker.errors.ImageNotFound: return -1 except docker.errors.APIError: raise DockerException("Unable to get image")
def is_image_available(self, image_tag): """ Checks if the docker image is downloaded or not :param image_tag: name of the image :return: True, when the image is available """ llogger = local_logger.LocalLogger() llogger.log_method_call(self.__class__.__name__, sys._getframe().f_code.co_name) try: for image in self._docker_env.images.list(): if len(image.tags) > 0 and (image.tags[0] == image_tag or image.tags[0].split( ':', 1)[0] == image_tag): return True except docker.errors.APIError: llogger.exception(traceback.format_exc()) raise DockerException("Unable to get image list") return False