Example #1
0
    def _get_hash_tar(self, image_id, indexes, top_most_layer):
        target_file = HashedBytesIo()

        with TarFile(mode='w', fileobj=target_file) as tar_file:
            layers_dict = inspectlayers(self._dc, image_id)

            if isinstance(indexes, slice):
                layers = layers_dict[':layers'][indexes]
            else:
                if indexes:
                    self.assertLess(top_most_layer,
                                    len(indexes),
                                    msg='image: {}; indexes: {}'.format(
                                        image_id, indexes))
                    self.assertGreaterEqual(
                        top_most_layer,
                        -len(indexes),
                        msg='image: {}; indexes: {}'.format(image_id, indexes))
                    self.assertEqual(indexes[top_most_layer],
                                     min(indexes),
                                     msg='image: {}; indexes: {}'.format(
                                         image_id, indexes))

                layers = [layers_dict[':layers'][i] for i in indexes]

            extractlayers(self._dc, layers, tar_file, top_most_layer)

        target_file.seek(0)

        return target_file
Example #2
0
    def _get_hash_tar(self, image_id, indexes, top_most_layer):
        target_file = HashedBytesIo()

        with TarFile(mode='w', fileobj=target_file) as tar_file:
            layers_dict = inspectlayers(self._dc, image_id)

            if isinstance(indexes, slice):
                layers = layers_dict[':layers'][indexes]
            else:
                if indexes:
                    self.assertLess(top_most_layer, len(indexes), msg='image: {}; indexes: {}'.format(image_id, indexes))
                    self.assertGreaterEqual(top_most_layer, -len(indexes), msg='image: {}; indexes: {}'.format(image_id, indexes))
                    self.assertEqual(indexes[top_most_layer], min(indexes), msg='image: {}; indexes: {}'.format(image_id, indexes))

                layers = [ layers_dict[':layers'][i] for i in indexes ]

            extractlayers(self._dc, layers, tar_file, top_most_layer)

        target_file.seek(0)

        return target_file
Example #3
0
def main():
    import _dimgx
    _dimgx._logexception = exitonraise(_dimgx._logexception) # WARNING: monkey patch; pylint: disable=protected-access
    args = buildparser().parse_args(sys_argv[1:])
    logging_basicConfig(format=args.log_format)
    getLogger().setLevel(logging_getLevelName(args.log_level))
    dc_kw = kwargs_from_env()

    # TODO: hack to work around github:docker/docker-py#706
    if DOCKER_TLS_VERIFY == '0':
        dc_kw['tls'].assert_hostname = False

    dc = AutoVersionClient(**dc_kw)
    layers_dict = inspectlayers(dc, args.image)
    top_most_layer_id, selected_layers = selectlayers(args, layers_dict)

    if not selected_layers:
        _LOGGER.warning('no known layers selected')

    if args.target is None:
        printlayerinfo(args, selected_layers)
    else:
        extractlayers(dc, args, selected_layers, top_most_layer_id)
Example #4
0
def main():
    import _dimgx
    _dimgx._logexception = exitonraise(_dimgx._logexception)  # WARNING: monkey patch; pylint: disable=protected-access
    args = buildparser().parse_args(sys_argv[1:])
    logging_basicConfig(format=args.log_format)
    getLogger().setLevel(logging_getLevelName(args.log_level))
    patch_broken_tarfile_29760()
    dc_kw = kwargs_from_env()

    # TODO: hack to work around github:docker/docker-py#706
    if DOCKER_TLS_VERIFY == '0':
        dc_kw['tls'].assert_hostname = False

    dc = AutoVersionClient(**dc_kw)
    layers_dict = inspectlayers(dc, args.image)
    top_most_layer_id, selected_layers = selectlayers(args, layers_dict)

    if not selected_layers:
        _LOGGER.warning('no known layers selected')

    if args.target is None:
        printlayerinfo(args, selected_layers)
    else:
        extractlayers(dc, args, selected_layers, top_most_layer_id)
Example #5
0
    def test_layerspecs(self):
        path_ids = FauxDockerClient.SHORT_IDS_BY_PATH[0]
        image_spec = '52d7263f000f'

        specs = (
            {
                'args': ( '-q', image_spec ),
                'layer_ids': path_ids,
            }, {
                'args': ( '-r', '-q', image_spec ),
                'layer_ids': path_ids[::-1],
            }, {
                'args': ( '-l', 'ffffffffffff', '-q', image_spec ),
                'layer_ids': [],
            }, {
                'args': ( '-l', '2b32db6c0000:ffffffffffff', '-q', image_spec ),
                'layer_ids': [],
            }, {
                'args': ( '-l', 'ffffffffffff:52d7263f000f', '-q', image_spec ),
                'layer_ids': [],
            }, {
                'args': (  '-l', '52d7263f000f', '-l', 'ffffffffffff', '-q', image_spec ),
                'layer_ids': path_ids[0x0:0x1],
            }, {
                'args': (  '-l', 'ffffffffffff', '-l', '52d7263f000f', '-q', image_spec ),
                'layer_ids': path_ids[0x0:0x1],
            }, {
                'args': (  '-l', '52d7263f000f', '-q', image_spec ),
                'layer_ids': path_ids[0x0:0x1],
            }, {
                'args': (  '-l', '52d7263f000f:52d7263f000f', '-q', image_spec ),
                'layer_ids': path_ids[0x0:0x1],
            }, {
                'args': (  '-l', '5a48f220000e:52d7263f000f', '-q', image_spec ),
                'layer_ids': path_ids[0x0:0x2],
            }, {
                'args': (  '-l', '52d7263f000f:5a48f220000e', '-r', '-q', image_spec ),
                'layer_ids': path_ids[0x0:0x2],
            }, {
                'args': (  '-l', '52d7263f000f:5a48f220000e', '-q', image_spec ),
                'layer_ids': path_ids[0x1::-1],
            }, {
                'args': (  '-l', '5a48f220000e:52d7263f000f', '-r', '-q', image_spec ),
                'layer_ids': path_ids[0x1::-1],
            }, {
                'args': ( '-l', '2b32db6c0000', '-l', '52d7263f000f', '-l', 'ff304d2a0001', '-l', '5a48f220000e', '-q', image_spec ),
                'layer_ids': [ path_ids[0x1], path_ids[0xe], path_ids[0x0], path_ids[0xf] ],
            }, {
                'args': ( '-l', '2b32db6c0000', '-l', '52d7263f000f', '-l', 'ff304d2a0001', '-l', '5a48f220000e', '-r', '-q', image_spec ),
                'layer_ids': [ path_ids[0xf], path_ids[0x0], path_ids[0xe], path_ids[0x1] ],
            }, {
                'args': ( '-l', 'ff304d2a0001', '-l', 'f62dd7680002', '-l', 'ff304d2a0001', '-l', '0c2ccea2000a', '-q', image_spec ),
                'layer_ids': [ path_ids[0x5], path_ids[0xe], path_ids[0xd] ],
            }, {
                'args': ( '-l', 'ff304d2a0001', '-l', 'f62dd7680002', '-l', 'ff304d2a0001', '-l', '0c2ccea2000a', '-r', '-q', image_spec ),
                'layer_ids': [ path_ids[0xe], path_ids[0xd], path_ids[0x5] ],
            }, {
                'args': ( '-l', 'f62dd7680002', '-l', '149dccab0003:2b32db6c0000', '-q', image_spec ),
                'layer_ids': path_ids[0xf:0xb:-1],
            }, {
                'args': ( '-l', 'f62dd7680002', '-l', '149dccab0003:2b32db6c0000', '-r', '-q', image_spec ),
                'layer_ids': [ path_ids[0xd], path_ids[0xc], path_ids[0xe], path_ids[0xf] ],
            }, {
                'args': ( '-l', 'ff304d2a0001', '-q', image_spec ),
                'layer_ids': path_ids[0xe:0xf],
            }, {
                'args': ( '-l', '2b32db6c0000:ff304d2a0001', '-q', image_spec ),
                'layer_ids': path_ids[0xe:],
            }, {
                'args': ( '-l', '2b32db6c0000:ff304d2a0001', '-r', '-q', image_spec ),
                'layer_ids': path_ids[0xf:0xd:-1],
            }, {
                'args': ( '-l', 'ff304d2a0001:2b32db6c0000', '-q', image_spec ),
                'layer_ids': path_ids[0xf:0xd:-1],
            }, {
                'args': ( '-l', 'ff304d2a0001:2b32db6c0000', '-r', '-q', image_spec ),
                'layer_ids': path_ids[0xe:],
            }, {
                'args': ( '-l', 'ff304d2a0001:52d7263f000f', '-q', image_spec ),
                'layer_ids': path_ids[:0xf],
            }, {
                'args': ( '-l', 'ff304d2a0001:52d7263f000f', '-r', '-q', image_spec ),
                'layer_ids': path_ids[0xe::-1],
            }, {
                'args': ( '-l', '52d7263f000f:ff304d2a0001', '-q', image_spec ),
                'layer_ids': path_ids[0xe::-1],
            }, {
                'args': ( '-l', '52d7263f000f:ff304d2a0001', '-r', '-q', image_spec ),
                'layer_ids': path_ids[:0xf],
            }
        )

        for spec in specs:
            args = self._parser.parse_args(spec['args'])
            layers_dict = inspectlayers(self._dc, args.image)
            top_most_layer_id, selected_layers = selectlayers(args, layers_dict)
            layer_ids = spec['layer_ids']

            if top_most_layer_id is not None:
                self.assertEqual(top_most_layer_id[:12], max(spec['layer_ids'], key=lambda i: i[-4:]), msg='spec: {!r}; selected_layers: {!r}'.format(spec, selected_layers))

            self.assertEqual(len(layer_ids), len(selected_layers), msg='spec: {!r}; selected_layers: {!r}'.format(spec, selected_layers))

            for layer_id, selected_layer in zip(layer_ids, selected_layers):
                self.assertEqual(layer_id, selected_layer['Id'][:len(layer_id)], msg='spec: {!r}; selected_layers: {!r}'.format(spec, selected_layers))

            outfile = StringIO()
            printlayerinfo(args, selected_layers, outfile)
            outfile.seek(0)
            self.assertEqual([ l.strip() for l in outfile ], layer_ids)