Exemple #1
0
 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
Exemple #2
0
    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