openstack-image-manager 0.20240327.0__py3-none-any.whl → 0.20240403.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -203,12 +203,12 @@ class ImageManager:
203
203
  Read all files in etc/images/ and process each image
204
204
  Rename outdated images when not dry-running
205
205
  """
206
- logger.debug("cloud = %s" % self.CONF.cloud)
207
- logger.debug("dry-run = %s" % self.CONF.dry_run)
208
- logger.debug("images = %s" % self.CONF.images)
209
- logger.debug("tag = %s" % self.CONF.tag)
206
+ logger.debug(f"cloud = {self.CONF.cloud}")
207
+ logger.debug(f"dry-run = {self.CONF.dry_run}")
208
+ logger.debug(f"images = {self.CONF.images}")
209
+ logger.debug(f"tag = {self.CONF.tag}")
210
210
  logger.debug(
211
- "yes-i-really-know-what-i-do = %s" % self.CONF.yes_i_really_know_what_i_do
211
+ f"yes-i-really-know-what-i-do = {self.CONF.yes_i_really_know_what_i_do}"
212
212
  )
213
213
 
214
214
  # check local image definitions with yamale
@@ -281,13 +281,12 @@ class ImageManager:
281
281
  for required_key in REQUIRED_KEYS:
282
282
  if required_key not in image:
283
283
  logger.error(
284
- "'%s' lacks the necessary key %s"
285
- % (image["name"], required_key)
284
+ f"'{image['name']}' lacks the necessary key {required_key}"
286
285
  )
287
286
  self.exit_with_error = True
288
287
  continue
289
288
 
290
- logger.debug("Processing '%s'" % image["name"])
289
+ logger.debug(f"Processing '{image['name']}'")
291
290
 
292
291
  try:
293
292
  versions = dict()
@@ -332,7 +331,8 @@ class ImageManager:
332
331
  # strip any directory path for file: urls in order to
333
332
  # avoid exposing local filesystem details to other users
334
333
  if url.startswith("file:") and "/" in url:
335
- url = "file:%s" % url.rsplit("/", 1)[1]
334
+ urlfile = url.rsplit("/", 1)[1]
335
+ url = f"file:{urlfile}"
336
336
  versions[version["version"]]["meta"]["image_source"] = url
337
337
 
338
338
  if "build_date" in version:
@@ -353,7 +353,7 @@ class ImageManager:
353
353
  image["tags"].append(self.CONF.tag)
354
354
 
355
355
  if "os_distro" in image["meta"]:
356
- image["tags"].append("os:%s" % image["meta"]["os_distro"])
356
+ image["tags"].append(f"os:{image['meta']['os_distro']}")
357
357
 
358
358
  if "image_description" not in image["meta"]:
359
359
  image["meta"]["image_description"] = image["name"]
@@ -383,7 +383,8 @@ class ImageManager:
383
383
  versions: versions dict generated by main()
384
384
  version: currently processed version
385
385
  """
386
- logger.info("Importing image %s" % name)
386
+ logger.info(f"Importing image {name}")
387
+ logger.info(f"Importing from URL {url}")
387
388
 
388
389
  properties = {
389
390
  "container_format": "bare",
@@ -404,16 +405,13 @@ class ImageManager:
404
405
  with local_file:
405
406
  try:
406
407
  logger.info(
407
- "Uploading local file '%s' as image %s"
408
- % (parsed_url.path, name)
408
+ f"Uploading local file '{parsed_url.path}' as image {name}"
409
409
  )
410
410
  new_image.data = local_file
411
411
  new_image.upload(self.conn.image)
412
412
  except Exception as e:
413
413
  self.conn.image.delete_image(new_image)
414
- logger.error(
415
- "Failed to upload local file for image %s\n%s" % (name, e)
416
- )
414
+ logger.error(f"Failed to upload local file for image {name}\n{e}")
417
415
  self.exit_with_error = True
418
416
  return None
419
417
  else:
@@ -436,13 +434,9 @@ class ImageManager:
436
434
  or image.owner == self.conn.current_project_id
437
435
  ):
438
436
  result[image.name] = image
439
- logger.debug(
440
- "Managed image '%s' (tags = %s)" % (image.name, image.tags)
441
- )
437
+ logger.debug(f"Managed image '{image.name}' (tags = {image.tags})")
442
438
  else:
443
- logger.debug(
444
- "Unmanaged image '%s' (tags = %s)" % (image.name, image.tags)
445
- )
439
+ logger.debug(f"Unmanaged image '{image.name}' (tags = {image.tags})")
446
440
 
447
441
  if self.CONF.use_os_hidden:
448
442
  for image in self.conn.image.images(**{"os_hidden": True}):
@@ -452,13 +446,11 @@ class ImageManager:
452
446
  ):
453
447
  result[image.name] = image
454
448
  logger.debug(
455
- "Managed hidden image '%s' (tags = %s)"
456
- % (image.name, image.tags)
449
+ f"Managed hidden image '{image.name}' (tags = {image.tags})"
457
450
  )
458
451
  else:
459
452
  logger.debug(
460
- "Unmanaged hidden image '%s' (tags = %s)"
461
- % (image.name, image.tags)
453
+ f"Unmanaged hidden image '{image.name}' (tags = {image.tags})"
462
454
  )
463
455
  return result
464
456
 
@@ -483,9 +475,7 @@ class ImageManager:
483
475
  # indefinitely stuck in "queued" state.
484
476
  if imported_image.status == "queued":
485
477
  if retry_attempts_for_queued_state < 0:
486
- logger.error(
487
- "Image %s seems stuck in queued state" % image.name
488
- )
478
+ logger.error(f"Image {image.name} seems stuck in queued state")
489
479
  self.exit_with_error = True
490
480
  return None
491
481
  else:
@@ -498,7 +488,7 @@ class ImageManager:
498
488
  else:
499
489
  return imported_image
500
490
  except Exception as e:
501
- logger.error("Exception while importing image %s\n%s" % (image.name, e))
491
+ logger.error(f"Exception while importing image {image.name}\n{e}")
502
492
  self.exit_with_error = True
503
493
 
504
494
  def process_image(
@@ -526,12 +516,12 @@ class ImageManager:
526
516
 
527
517
  for version in sorted_versions:
528
518
  if image["multi"]:
529
- name = "%s (%s)" % (image["name"], version)
519
+ name = f"{image['name']} ({version})"
530
520
  else:
531
- name = "%s %s" % (image["name"], version)
521
+ name = f"{image['name']} {version}"
532
522
 
533
- logger.info("Processing image '%s'" % name)
534
- logger.debug("Checking existence of '%s'" % name)
523
+ logger.info(f"Processing image '{name}'")
524
+ logger.debug(f"Checking existence of '{name}'")
535
525
  existence = name in cloud_images
536
526
 
537
527
  if existence and cloud_images[name].status != "active":
@@ -554,8 +544,7 @@ class ImageManager:
554
544
  )
555
545
  except KeyError:
556
546
  logger.error(
557
- "Image %s is missing property 'internal_version'"
558
- % image["name"]
547
+ f"Image {image['name']} is missing property 'internal_version'"
559
548
  )
560
549
 
561
550
  elif (
@@ -564,7 +553,7 @@ class ImageManager:
564
553
  and version == sorted_versions[-1]
565
554
  and not existence
566
555
  ):
567
- previous = "%s (%s)" % (image["name"], sorted_versions[-2])
556
+ previous = f"{image['name']} ({sorted_versions[-2]})"
568
557
  existence = previous in cloud_images and image["name"] in cloud_images
569
558
 
570
559
  elif (
@@ -585,8 +574,7 @@ class ImageManager:
585
574
  )
586
575
  if not upstream_checksum:
587
576
  logger.error(
588
- "Could not find checksum for image '%s', check the checksums_url"
589
- % image["name"]
577
+ f"Could not find checksum for image '{image['name']}', check the checksums_url"
590
578
  )
591
579
  return existing_images, imported_image, previous_image
592
580
 
@@ -597,11 +585,11 @@ class ImageManager:
597
585
  else ""
598
586
  )
599
587
  if image_checksum == upstream_checksum:
600
- logger.info("No new version for '%s'" % image["name"])
588
+ logger.info(f"No new version for '{image['name']}'")
601
589
  existing_images.add(image["name"])
602
590
  return existing_images, imported_image, previous_image
603
591
  else:
604
- logger.info("New version for '%s'" % image["name"])
592
+ logger.info(f"New version for '{image['name']}'")
605
593
  existence = False
606
594
  except KeyError:
607
595
  # when switching from a release pointer to a latest pointer, the image has no checksum property
@@ -620,8 +608,7 @@ class ImageManager:
620
608
  file_path = parsed_url.path
621
609
  if not (os.path.exists(file_path) and os.path.isfile(file_path)):
622
610
  logger.error(
623
- "Skipping '%s' due to file '%s' not found locally"
624
- % (name, file_path)
611
+ f"Skipping '{name}' due to file '{file_path}' not found locally"
625
612
  )
626
613
  self.exit_with_error = True
627
614
  return existing_images, imported_image, previous_image
@@ -629,12 +616,11 @@ class ImageManager:
629
616
  r = requests.head(url)
630
617
 
631
618
  if r.status_code in [200, 302]:
632
- logger.info("Tested URL %s: %s" % (url, r.status_code))
619
+ logger.info(f"Tested URL {url}: {r.status_code}")
633
620
  else:
634
- logger.error("Tested URL %s: %s" % (url, r.status_code))
621
+ logger.error(f"Tested URL {url}: {r.status_code}")
635
622
  logger.error(
636
- "Skipping '%s' due to HTTP status code %s"
637
- % (name, r.status_code)
623
+ f"Skipping '{name}' due to HTTP status code {r.status_code}"
638
624
  )
639
625
  self.exit_with_error = True
640
626
  return existing_images, imported_image, previous_image
@@ -648,8 +634,7 @@ class ImageManager:
648
634
  )
649
635
  if import_result:
650
636
  logger.info(
651
- "Import of '%s' successfully completed, reloading images"
652
- % name
637
+ f"Import of '{name}' successfully completed, reloading images"
653
638
  )
654
639
  cloud_images = self.get_images()
655
640
  imported_image = cloud_images.get(name, None)
@@ -660,8 +645,7 @@ class ImageManager:
660
645
 
661
646
  elif self.CONF.latest and version != sorted_versions[-1]:
662
647
  logger.info(
663
- "Skipping image '%s' (only importing the latest version from type multi)"
664
- % name
648
+ f"Skipping image '{name}' (only importing the latest version from type multi)"
665
649
  )
666
650
 
667
651
  if image["multi"]:
@@ -698,7 +682,7 @@ class ImageManager:
698
682
  image["meta"] = meta.copy()
699
683
 
700
684
  if name in cloud_images:
701
- logger.info("Checking parameters of '%s'" % name)
685
+ logger.info(f"Checking parameters of '{name}'")
702
686
 
703
687
  cloud_image = cloud_images[name]
704
688
  real_image_size = int(
@@ -709,8 +693,7 @@ class ImageManager:
709
693
 
710
694
  if "min_disk" in image and image["min_disk"] != cloud_image.min_disk:
711
695
  logger.info(
712
- "Setting min_disk: %s != %s"
713
- % (image["min_disk"], cloud_image.min_disk)
696
+ f"Setting min_disk: {image['min_disk']} != {cloud_image.min_disk}"
714
697
  )
715
698
  self.conn.image.update_image(
716
699
  cloud_image.id, **{"min_disk": int(image["min_disk"])}
@@ -719,15 +702,14 @@ class ImageManager:
719
702
  if (
720
703
  "min_disk" in image and real_image_size > image["min_disk"]
721
704
  ) or "min_disk" not in image:
722
- logger.info("Setting min_disk = %d" % real_image_size)
705
+ logger.info(f"Setting min_disk = {real_image_size}")
723
706
  self.conn.image.update_image(
724
707
  cloud_image.id, **{"min_disk": real_image_size}
725
708
  )
726
709
 
727
710
  if "min_ram" in image and image["min_ram"] != cloud_image.min_ram:
728
711
  logger.info(
729
- "Setting min_ram: %s != %s"
730
- % (image["min_ram"], cloud_image.min_ram)
712
+ f"Setting min_ram: {image['min_ram']} != {cloud_image.min_ram}"
731
713
  )
732
714
  self.conn.image.update_image(
733
715
  cloud_image.id, **{"min_ram": int(image["min_ram"])}
@@ -735,7 +717,7 @@ class ImageManager:
735
717
 
736
718
  if self.CONF.use_os_hidden:
737
719
  if "hidden" in versions[version]:
738
- logger.info("Setting os_hidden = %s" % versions[version]["hidden"])
720
+ logger.info(f"Setting os_hidden = {versions[version]['hidden']}")
739
721
  self.conn.image.update_image(
740
722
  cloud_image.id, **{"os_hidden": versions[version]["hidden"]}
741
723
  )
@@ -757,24 +739,23 @@ class ImageManager:
757
739
  )
758
740
  modify_date = modify_date.replace("-", "")
759
741
 
760
- logger.info("Setting internal_version = %s" % modify_date)
742
+ logger.info(f"Setting internal_version = {modify_date}")
761
743
  image["meta"]["internal_version"] = modify_date
762
744
  except Exception:
763
745
  logger.error(
764
- "Error when retrieving the modification date of image '%s'",
765
- image["name"],
746
+ f"Error when retrieving the modification date of image '{image['name']}'"
766
747
  )
767
- logger.info("Setting internal_version = %s" % version)
748
+ logger.info(f"Setting internal_version = {version}")
768
749
  image["meta"]["internal_version"] = version
769
750
  else:
770
- logger.info("Setting internal_version = %s" % version)
751
+ logger.info(f"Setting internal_version = {version}")
771
752
  image["meta"]["internal_version"] = version
772
753
 
773
- logger.info("Setting image_original_user = %s" % image["login"])
754
+ logger.info(f"Setting image_original_user = {image['login']}")
774
755
  image["meta"]["image_original_user"] = image["login"]
775
756
 
776
757
  if self.CONF.hypervisor:
777
- logger.info("Setting hypervisor type = %s" % self.CONF.hypervisor)
758
+ logger.info(f"Setting hypervisor type = {self.CONF.hypervisor}")
778
759
  image["meta"]["hypervisor_type"] = self.CONF.hypervisor
779
760
 
780
761
  if version == "latest" and upstream_checksum:
@@ -787,12 +768,12 @@ class ImageManager:
787
768
 
788
769
  for tag in image["tags"]:
789
770
  if tag not in cloud_image.tags:
790
- logger.info("Adding tag %s" % (tag))
771
+ logger.info(f"Adding tag {tag}")
791
772
  self.conn.image.add_tag(cloud_image.id, tag)
792
773
 
793
774
  for tag in cloud_image.tags:
794
775
  if tag not in image["tags"]:
795
- logger.info("Deleting tag %s" % (tag))
776
+ logger.info(f"Deleting tag {tag}")
796
777
  self.conn.image.remove_tag(cloud_image.id, tag)
797
778
 
798
779
  if "meta" in versions[version]:
@@ -804,8 +785,7 @@ class ImageManager:
804
785
  if property in image["meta"]:
805
786
  if image["meta"][property] != properties[property]:
806
787
  logger.info(
807
- "Setting property %s: %s != %s"
808
- % (property, properties[property], image["meta"][property])
788
+ f"Setting property {property}: {properties[property]} != {image['meta'][property]}"
809
789
  )
810
790
  self.conn.image.update_image(
811
791
  cloud_image.id, **{property: str(image["meta"][property])}
@@ -817,37 +797,37 @@ class ImageManager:
817
797
  "stores",
818
798
  ] or not property.startswith("os_"):
819
799
  # FIXME: handle deletion of properties
820
- logger.debug("Deleting property %s" % (property))
800
+ logger.debug(f"Deleting property {property}")
821
801
 
822
802
  for property in image["meta"]:
823
803
  if property not in properties:
824
804
  logger.info(
825
- "Setting property %s: %s" % (property, image["meta"][property])
805
+ f"Setting property {property}: {image['meta'][property]}"
826
806
  )
827
807
  self.conn.image.update_image(
828
808
  cloud_image.id, **{property: str(image["meta"][property])}
829
809
  )
830
810
 
831
- logger.info("Checking status of '%s'" % name)
811
+ logger.info(f"Checking status of '{name}'")
832
812
  if (
833
813
  cloud_image.status != image["status"]
834
814
  and image["status"] == "deactivated"
835
815
  ):
836
- logger.info("Deactivating image '%s'" % name)
816
+ logger.info(f"Deactivating image '{name}'")
837
817
  self.conn.image.deactivate_image(cloud_image.id)
838
818
 
839
819
  elif cloud_image.status != image["status"] and image["status"] == "active":
840
- logger.info("Reactivating image '%s'" % name)
820
+ logger.info(f"Reactivating image '{name}'")
841
821
  self.conn.image.reactivate_image(cloud_image.id)
842
822
 
843
- logger.info("Checking visibility of '%s'" % name)
823
+ logger.info(f"Checking visibility of '{name}'")
844
824
  if "visibility" in versions[version]:
845
825
  visibility = versions[version]["visibility"]
846
826
  else:
847
827
  visibility = image["visibility"]
848
828
 
849
829
  if cloud_image.visibility != visibility:
850
- logger.info("Setting visibility of '%s' to '%s'" % (name, visibility))
830
+ logger.info(f"Setting visibility of '{name}' to '{visibility}'")
851
831
  self.conn.image.update_image(cloud_image.id, visibility=visibility)
852
832
 
853
833
  def rename_images(
@@ -869,17 +849,17 @@ class ImageManager:
869
849
  cloud_images = self.get_images()
870
850
 
871
851
  if len(sorted_versions) > 1:
872
- latest = "%s (%s)" % (name, sorted_versions[-1])
873
- previous_latest = "%s (%s)" % (name, sorted_versions[-2])
852
+ latest = f"{name} ({sorted_versions[-1]})"
853
+ previous_latest = f"{name} ({sorted_versions[-2]})"
874
854
 
875
855
  if name in cloud_images and previous_latest not in cloud_images:
876
- logger.info("Renaming %s to %s" % (name, previous_latest))
856
+ logger.info(f"Renaming {name} to {previous_latest}")
877
857
  self.conn.image.update_image(
878
858
  cloud_images[name].id, name=previous_latest
879
859
  )
880
860
 
881
861
  if latest in cloud_images:
882
- logger.info("Renaming %s to %s" % (latest, name))
862
+ logger.info(f"Renaming {latest} to {name}")
883
863
  self.conn.image.update_image(cloud_images[latest].id, name=name)
884
864
 
885
865
  elif len(sorted_versions) == 1 and name in cloud_images:
@@ -892,34 +872,30 @@ class ImageManager:
892
872
  )
893
873
  create_date = create_date.replace("-", "")
894
874
 
895
- previous_latest = "%s (%s)" % (name, create_date)
875
+ previous_latest = f"{name} ({create_date})"
896
876
 
897
877
  logger.info(
898
- "Setting internal_version: %s for %s"
899
- % (create_date, previous_latest)
878
+ f"Setting internal_version: {create_date} for {previous_latest}"
900
879
  )
901
880
  self.conn.image.update_image(
902
881
  previous_image.id, **{"internal_version": create_date}
903
882
  )
904
883
  else:
905
- previous_latest = "%s (%s)" % (
906
- name,
907
- previous_image["properties"]["internal_version"],
884
+ previous_latest = (
885
+ f"{name} ({previous_image['properties']['internal_version']})"
908
886
  )
909
887
 
910
- logger.info("Renaming old latest '%s' to '%s'" % (name, previous_latest))
888
+ logger.info(f"Renaming old latest '{name}' to '{previous_latest}'")
911
889
  self.conn.image.update_image(previous_image.id, name=previous_latest)
912
890
 
913
- logger.info(
914
- "Renaming imported image '%s' to '%s'" % (imported_image.name, name)
915
- )
891
+ logger.info(f"Renaming imported image '{imported_image.name}' to '{name}'")
916
892
  self.conn.image.update_image(imported_image.id, name=name)
917
893
 
918
894
  elif len(sorted_versions) == 1:
919
- latest = "%s (%s)" % (name, sorted_versions[-1])
895
+ latest = f"{name} ({sorted_versions[-1]})"
920
896
 
921
897
  if latest in cloud_images:
922
- logger.info("Renaming %s to %s" % (latest, name))
898
+ logger.info(f"Renaming {latest} to {name}")
923
899
  self.conn.image.update_image(cloud_images[latest].id, name=name)
924
900
 
925
901
  def check_image_age(self) -> set:
@@ -1065,10 +1041,10 @@ class ImageManager:
1065
1041
  and not self.CONF.dry_run
1066
1042
  ):
1067
1043
  try:
1068
- logger.info("Deactivating image '%s'" % image)
1044
+ logger.info(f"Deactivating image '{image}'")
1069
1045
  self.conn.image.deactivate_image(cloud_image.id)
1070
1046
 
1071
- logger.info("Setting visibility of '%s' to 'community'" % image)
1047
+ logger.info(f"Setting visibility of '{image}' to 'community'")
1072
1048
  self.conn.image.update_image(
1073
1049
  cloud_image.id, visibility="community"
1074
1050
  )
@@ -1077,25 +1053,24 @@ class ImageManager:
1077
1053
  "keep" not in image_definition
1078
1054
  or not image_definition["keep"]
1079
1055
  ):
1080
- logger.info("Deleting %s" % image)
1056
+ logger.info(f"Deleting {image}")
1081
1057
  self.conn.image.delete_image(cloud_image.id)
1082
1058
  else:
1083
1059
  logger.info(
1084
- "Image '%s' will not be deleted, because 'keep' flag is True"
1085
- % image
1060
+ f"Image '{image}' will not be deleted, because 'keep' flag is True"
1086
1061
  )
1087
1062
  except Exception as e:
1088
1063
  logger.info(
1089
- "%s is still in use and cannot be deleted\n %s" % (image, e)
1064
+ f"{image} is still in use and cannot be deleted\n {e}"
1090
1065
  )
1091
1066
 
1092
1067
  else:
1093
1068
  logger.warning(
1094
- "Image %s should be deleted, but deletion is disabled" % image
1069
+ f"Image {image} should be deleted, but deletion is disabled"
1095
1070
  )
1096
1071
  try:
1097
1072
  if self.CONF.deactivate and not self.CONF.dry_run:
1098
- logger.info("Deactivating image '%s'" % image)
1073
+ logger.info(f"Deactivating image '{image}'")
1099
1074
  self.conn.image.deactivate_image(cloud_image.id)
1100
1075
 
1101
1076
  if (
@@ -1104,13 +1079,13 @@ class ImageManager:
1104
1079
  and cloud_image.visibility != "community"
1105
1080
  ):
1106
1081
  logger.info(
1107
- "Setting visibility of '%s' to 'community'" % image
1082
+ f"Setting visibility of '{image}' to 'community'"
1108
1083
  )
1109
1084
  self.conn.image.update_image(
1110
1085
  cloud_image.id, visibility="community"
1111
1086
  )
1112
1087
  except Exception as e:
1113
- logger.error("An Exception occurred: \n%s" % e)
1088
+ logger.error(f"An Exception occurred: \n{e}")
1114
1089
  self.exit_with_error = True
1115
1090
  elif counter[image_name] <= last:
1116
1091
  logger.info(
@@ -1121,12 +1096,12 @@ class ImageManager:
1121
1096
  and not self.CONF.dry_run
1122
1097
  and cloud_image.visibility != "community"
1123
1098
  ):
1124
- logger.info("Setting visibility of '%s' to 'community'" % image)
1099
+ logger.info(f"Setting visibility of '{image}' to 'community'")
1125
1100
  self.conn.image.update_image(cloud_image.id, visibility="community")
1126
1101
  elif (
1127
1102
  counter[image_name] < last and self.CONF.hide and not self.CONF.dry_run
1128
1103
  ):
1129
- logger.info("Setting visibility of '%s' to 'community'" % image)
1104
+ logger.info(f"Setting visibility of '{image}' to 'community'")
1130
1105
  self.conn.image.update_image(cloud_image.id, visibility="community")
1131
1106
  return unmanaged_images
1132
1107
 
@@ -1142,39 +1117,32 @@ class ImageManager:
1142
1117
  self.exit_with_error = True
1143
1118
  for result in e.results:
1144
1119
  logger.error(
1145
- "Error validating data '%s' with '%s'"
1146
- % (result.data, result.schema)
1120
+ f"Error validating data '{result.data}' with '{result.schema}'"
1147
1121
  )
1148
1122
  for error in result.errors:
1149
- logger.error("\t%s" % error)
1123
+ logger.error(f"\t{error}")
1150
1124
  else:
1151
- logger.debug("Image file %s is valid" % file)
1125
+ logger.debug(f"Image file {file} is valid")
1152
1126
  except FileNotFoundError:
1153
- logger.error("Invalid path '%s'" % self.CONF.images)
1127
+ logger.error(f"Invalid path '{self.CONF.images}'")
1154
1128
 
1155
1129
  def share_image_with_project(self, image, project):
1156
1130
  member = self.conn.image.find_member(project.id, image.id)
1157
1131
 
1158
1132
  if not member:
1159
- logger.info(
1160
- "add - %s - %s (%s)" % (image.name, project.name, project.domain_id)
1161
- )
1133
+ logger.info(f"add - {image.name} - {project.name} ({project.domain_id})")
1162
1134
  if not self.CONF.dry_run:
1163
1135
  member = self.conn.image.add_member(image.id, member_id=project.id)
1164
1136
 
1165
1137
  if not self.CONF.dry_run and member.status != "accepted":
1166
- logger.info(
1167
- "accept - %s - %s (%s)" % (image.name, project.name, project.domain_id)
1168
- )
1138
+ logger.info(f"accept - {image.name} - {project.name} ({project.domain_id})")
1169
1139
  self.conn.image.update_member(member, image.id, status="accepted")
1170
1140
 
1171
1141
  def unshare_image_with_project(self, image, project):
1172
1142
  member = self.conn.image.find_member(project.id, image.id)
1173
1143
 
1174
1144
  if member:
1175
- logger.info(
1176
- "del - %s - %s (%s)" % (image.name, project.name, project.domain_id)
1177
- )
1145
+ logger.info(f"del - {image.name} - {project.name} ({project.domain_id})")
1178
1146
  if not self.CONF.dry_run:
1179
1147
  self.conn.image.remove_member(member, image.id)
1180
1148
 
@@ -149,10 +149,10 @@ def mirror_image(
149
149
 
150
150
  try:
151
151
  client.stat_object(minio_bucket, os.path.join(dirname, new_filename))
152
- logger.info("'%s' available in '%s'" % (new_filename, dirname))
152
+ logger.info(f"'{new_filename}' available in '{dirname}'")
153
153
  except S3Error:
154
- logger.info("'%s' not yet available in '%s'" % (new_filename, dirname))
155
- logger.info("Downloading '%s'" % latest_url)
154
+ logger.info(f"'{new_filename}' not yet available in '{dirname}'")
155
+ logger.info(f"Downloading '{latest_url}'")
156
156
 
157
157
  response = requests.get(latest_url, stream=True)
158
158
  with open(os.path.basename(path.path), "wb") as fp:
@@ -160,13 +160,11 @@ def mirror_image(
160
160
  del response
161
161
 
162
162
  if fileextension in [".bz2", ".zip", ".xz", ".gz"]:
163
- logger.info("Decompressing '%s'" % os.path.basename(path.path))
163
+ logger.info(f"Decompressing '{os.path.basename(path.path)}'")
164
164
  patoolib.extract_archive(os.path.basename(path.path), outdir=".")
165
165
  os.remove(os.path.basename(path.path))
166
166
 
167
- logger.info(
168
- "Uploading '%s' to '%s' as '%s'" % (filename, dirname, new_filename)
169
- )
167
+ logger.info(f"Uploading '{filename}' to '{dirname}' as '{new_filename}'")
170
168
 
171
169
  client.fput_object(minio_bucket, os.path.join(dirname, new_filename), filename)
172
170
  os.remove(filename)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openstack-image-manager
3
- Version: 0.20240327.0
3
+ Version: 0.20240403.0
4
4
  Summary: OpenStack image manager
5
5
  Author-email: OSISM community <info@osism.tech>
6
6
  License: Apache License
@@ -232,7 +232,7 @@ Requires-Dist: patool ==2.2.0
232
232
  Requires-Dist: requests ==2.31.0
233
233
  Requires-Dist: ruamel.yaml ==0.18.6
234
234
  Requires-Dist: tabulate ==0.9.0
235
- Requires-Dist: typer[all] ==0.11.0
235
+ Requires-Dist: typer[all] ==0.12.0
236
236
  Requires-Dist: yamale ==5.1.0
237
237
 
238
238
  # openstack-image-manager
@@ -0,0 +1,11 @@
1
+ openstack_image_manager/__init__.py,sha256=z6lQHDMfCV8IkUz5pM1QYfQ37O2Rdy82jYovN8N9DIU,240
2
+ openstack_image_manager/manage.py,sha256=gh8Cf5XAKTOCoKL8jMe-Q6V_d3pQryLc2b457OQLZPI,46764
3
+ openstack_image_manager/mirror.py,sha256=_84-vAFfF1a3IuDBzluwTJWo20cyJEJaNIcxn3X87QI,4737
4
+ openstack_image_manager/table.py,sha256=cZ6Xuqp8uh2V5_uzT4KwWoiLAUdvsPZkrPjOXdxFeU4,1080
5
+ openstack_image_manager/update.py,sha256=MFx7wZ1kEQb4WXYfvdjgSCeyXflkJqbBBx-4z8pQQ4Y,11057
6
+ openstack_image_manager-0.20240403.0.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
7
+ openstack_image_manager-0.20240403.0.dist-info/METADATA,sha256=yydaIZqhbmwnh_HU0b6LRrouNba065I5W-1PueTV2NU,14871
8
+ openstack_image_manager-0.20240403.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
9
+ openstack_image_manager-0.20240403.0.dist-info/entry_points.txt,sha256=AEHPHHHZ3jAZfpvaI5ZzLi3DHb9vGQwL7TJcw_G_5nc,80
10
+ openstack_image_manager-0.20240403.0.dist-info/top_level.txt,sha256=iLfREddId51T97Dr9IGRQtJXKJgVy1PB6uHCaQk1j44,24
11
+ openstack_image_manager-0.20240403.0.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- openstack_image_manager/__init__.py,sha256=z6lQHDMfCV8IkUz5pM1QYfQ37O2Rdy82jYovN8N9DIU,240
2
- openstack_image_manager/manage.py,sha256=zEspJ8vKHg3xT2trKOmf1fCUsIMlJFxXU1BeOt-At-E,47728
3
- openstack_image_manager/mirror.py,sha256=_84-vAFfF1a3IuDBzluwTJWo20cyJEJaNIcxn3X87QI,4737
4
- openstack_image_manager/table.py,sha256=cZ6Xuqp8uh2V5_uzT4KwWoiLAUdvsPZkrPjOXdxFeU4,1080
5
- openstack_image_manager/update.py,sha256=kSEG3HJPAtazIy9S2uEuLOZq4VDOpZifeO8OngClcK0,11103
6
- openstack_image_manager-0.20240327.0.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
7
- openstack_image_manager-0.20240327.0.dist-info/METADATA,sha256=zg24GictICQvJaQm_BuP6llALIY4s-8ri_kW03Pb6cU,14871
8
- openstack_image_manager-0.20240327.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
9
- openstack_image_manager-0.20240327.0.dist-info/entry_points.txt,sha256=AEHPHHHZ3jAZfpvaI5ZzLi3DHb9vGQwL7TJcw_G_5nc,80
10
- openstack_image_manager-0.20240327.0.dist-info/top_level.txt,sha256=iLfREddId51T97Dr9IGRQtJXKJgVy1PB6uHCaQk1j44,24
11
- openstack_image_manager-0.20240327.0.dist-info/RECORD,,