Revision 3f36ba1d kamaki/cli/commands/image.py

b/kamaki/cli/commands/image.py
446 446
            'Load metadata from a json-formated file <img-file>.meta :'
447 447
            '{"key1": "val1", "key2": "val2", ..., "properties: {...}"}',
448 448
            ('--metafile')),
449
        metafile_force=FlagArgument(
450
            'Overide remote metadata file', ('-f', '--force')),
449
        force_upload=FlagArgument(
450
            'Overwrite remote files (image file, metadata file)',
451
            ('-f', '--force')),
451 452
        no_metafile_upload=FlagArgument(
452 453
            'Do not store metadata in remote meta file',
453 454
            ('--no-metafile-upload')),
......
471 472
    required = ('name', 'pithos_location')
472 473

  
473 474
    def _get_pithos_client(self, locator):
474
        if self['no_metafile_upload']:
475
            return None
476 475
        ptoken = self.client.token
477 476
        if getattr(self, 'auth_base', False):
478 477
            pithos_endpoints = self.auth_base.get_service_endpoints(
......
518 517
        for k, v in self['properties'].items():
519 518
            properties[k.upper().replace('-', '_')] = v
520 519

  
520
    def _assert_remote_file_not_exist(self, pithos, path):
521
        if pithos and not self['force_upload']:
522
            try:
523
                pithos.get_object_info(path)
524
                raiseCLIError(
525
                    'Remote file /%s/%s already exists' % (
526
                        pithos.container, path),
527
                    importance=2,
528
                    details=[
529
                        'Registration ABORTED',
530
                        'Use %s to force upload' % self.arguments[
531
                            'force_upload'].lvalue])
532
            except ClientError as ce:
533
                if ce.status != 404:
534
                    raise
535

  
521 536
    @errors.generic.all
522 537
    @errors.plankton.connection
523 538
    def _run(self, name, location):
524
        locator = self.arguments['pithos_location']
539
        locator, pithos = self.arguments['pithos_location'], None
525 540
        if self['local_image_path']:
526 541
            with open(self['local_image_path']) as f:
527 542
                pithos = self._get_pithos_client(locator)
543
                self._assert_remote_file_not_exist(pithos, locator.path)
528 544
                (pbar, upload_cb) = self._safe_progress_bar('Uploading')
529 545
                if pbar:
530 546
                    hash_bar = pbar.clone()
......
539 555
        if location != new_loc:
540 556
            locator.value = new_loc
541 557
        self._load_params_from_args(params, properties)
542
        pclient = self._get_pithos_client(locator)
543 558

  
544
        #check if metafile exists
545
        meta_path = '%s.meta' % locator.path
546
        if pclient and not self['metafile_force']:
547
            try:
548
                pclient.get_object_info(meta_path)
549
                raiseCLIError(
550
                    'Metadata file /%s/%s already exists, abort' % (
551
                        locator.container, meta_path),
552
                    details=['Registration ABORTED', 'Try -f to overwrite'])
553
            except ClientError as ce:
554
                if ce.status != 404:
555
                    raise
559
        if not self['no_metafile_upload']:
560
            #check if metafile exists
561
            pithos = pithos or self._get_pithos_client(locator)
562
            meta_path = '%s.meta' % locator.path
563
            self._assert_remote_file_not_exist(pithos, meta_path)
556 564

  
557 565
        #register the image
558 566
        try:
......
570 578
        self._print(r, self.print_dict)
571 579

  
572 580
        #upload the metadata file
573
        if pclient:
581
        if not self['no_metafile_upload']:
574 582
            try:
575
                meta_headers = pclient.upload_from_string(
583
                meta_headers = pithos.upload_from_string(
576 584
                    meta_path, dumps(r, indent=2),
577 585
                    container_info_cache=self.container_info_cache)
578 586
            except TypeError:

Also available in: Unified diff