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
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
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)
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)
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)