def check(self, container_map, container_config, config_name, instance_name, instance_detail): instance_volumes = get_instance_volumes(instance_detail) vfs = SingleContainerVfsCheck(self._vfs_paths, container_map, container_config, instance_name, instance_volumes) for share in container_config.shares: cr_shared_path = resolve_value(share) self._vfs_paths[config_name, instance_name, cr_shared_path] = instance_volumes.get(share) if not vfs.check_bind(container_config, instance_name): return False if not vfs.check_attached(container_config, config_name): return False if not vfs.check_used(container_config): return False return True
def get_container_state(self, map_name, container_map, config_name, container_config, client_name, client_config, client, instance_alias, config_flags=0): """ Extends the base state by checking the current instance detail against the container configuration and volumes other containers. Also checks if the container image matches the configured image's id. :param map_name: Container map name. :type map_name: unicode | str :param container_map: Container map instance. :type container_map: dockermap.map.container.ContainerMap :param config_name: Container configuration name. :type config_name: unicode | str :param container_config: Container configuration object. :type container_config: dockermap.map.config.ContainerConfiguration :param client_name: Client name. :type client_name: unicode | str :param client_config: Client configuration object. :type client_config: dockermap.map.config.ClientConfiguration :param client: Docker client. :type client: docker.client.Client :param instance_alias: Container instance name or attached alias. :type instance_alias: unicode | str :param config_flags: Config flags on the container. :type config_flags: bool :return: Tuple of container inspection detail, and the base state information derived from that. :rtype: (dict | NoneType, unicode | str, int, dict | NoneType) """ detail, base_state, state_flags, extra = super( UpdateStateGenerator, self).get_container_state(map_name, container_map, config_name, container_config, client_name, client_config, client, instance_alias, config_flags=config_flags) if base_state == STATE_ABSENT: return detail, base_state, state_flags, extra c_image_id = detail['Image'] if config_flags & CONFIG_FLAG_ATTACHED: if self.update_persistent and c_image_id != self._base_image_ids[client_name]: return detail, base_state, state_flags | STATE_FLAG_OUTDATED, extra volumes = get_instance_volumes(detail) if volumes: mapped_path = resolve_value(container_map.volumes[instance_alias]) if container_map.use_attached_parent_name: self._volume_checker.register_attached(mapped_path, volumes.get(mapped_path), instance_alias, config_name) else: self._volume_checker.register_attached(mapped_path, volumes.get(mapped_path), instance_alias) else: image_name = self._policy.image_name(container_config.image or config_name, container_map) images = self._policy.images[client_name] ref_image_id = images.ensure_image(image_name, pull=self.pull_before_update, insecure_registry=self.pull_insecure_registry) if not (((container_config.persistent and not self.update_persistent) or c_image_id == ref_image_id) and self._volume_checker.check(container_map, container_config, config_name, instance_alias, detail) and self._check_links(map_name, container_config, detail) and _check_environment(container_config, detail) and _check_cmd(container_config, detail) and _check_network(container_config, client_config, detail)): return detail, base_state, state_flags | STATE_FLAG_OUTDATED, extra if (self.check_exec_commands and self.check_exec_commands != CMD_CHECK_NONE and container_config.exec_commands): exec_results = self._check_commands(container_config, client, detail['Id']) if exec_results is not None: extra.update(exec_commands=exec_results) return detail, base_state, state_flags, extra