openstack-image-manager 0.20240812.0__tar.gz → 0.20240829.0__tar.gz

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.
Files changed (32) hide show
  1. {openstack_image_manager-0.20240812.0/openstack_image_manager.egg-info → openstack_image_manager-0.20240829.0}/PKG-INFO +4 -4
  2. openstack_image_manager-0.20240829.0/etc/__init__.py +0 -0
  3. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/gardenlinux.yml +10 -0
  4. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/schema.yaml +1 -0
  5. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/openstack_image_manager/main.py +46 -19
  6. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0/openstack_image_manager.egg-info}/PKG-INFO +4 -4
  7. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/openstack_image_manager.egg-info/SOURCES.txt +1 -0
  8. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/openstack_image_manager.egg-info/requires.txt +3 -3
  9. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/pyproject.toml +6 -3
  10. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/requirements.txt +3 -3
  11. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/LICENSE +0 -0
  12. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/MANIFEST.in +0 -0
  13. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/README.md +0 -0
  14. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/almalinux.yml +0 -0
  15. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/centos.yml +0 -0
  16. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/cirros.yml +0 -0
  17. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/clearlinux.yml +0 -0
  18. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/debian.yml +0 -0
  19. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/fedora.yml +0 -0
  20. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/flatcar.yml +0 -0
  21. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/kubernetes.yml +0 -0
  22. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/opensuse.yml +0 -0
  23. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/opnsense.yml +0 -0
  24. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/osism.yml +0 -0
  25. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/rockylinux.yml +0 -0
  26. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/talos.yml +0 -0
  27. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/etc/images/ubuntu.yml +0 -0
  28. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/openstack_image_manager/__init__.py +0 -0
  29. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/openstack_image_manager.egg-info/dependency_links.txt +0 -0
  30. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/openstack_image_manager.egg-info/entry_points.txt +0 -0
  31. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/openstack_image_manager.egg-info/top_level.txt +0 -0
  32. {openstack_image_manager-0.20240812.0 → openstack_image_manager-0.20240829.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openstack-image-manager
3
- Version: 0.20240812.0
3
+ Version: 0.20240829.0
4
4
  Summary: OpenStack image manager
5
5
  Author-email: OSISM community <info@osism.tech>
6
6
  License: Apache License
@@ -223,16 +223,16 @@ Requires-Python: >=3.8
223
223
  Description-Content-Type: text/markdown
224
224
  License-File: LICENSE
225
225
  Requires-Dist: loguru==0.7.2
226
- Requires-Dist: minio==7.2.7
226
+ Requires-Dist: minio==7.2.8
227
227
  Requires-Dist: munch==4.0.0
228
228
  Requires-Dist: natsort==8.4.0
229
229
  Requires-Dist: openstacksdk==3.3.0
230
230
  Requires-Dist: paramiko==3.4.1
231
- Requires-Dist: patool==2.3.0
231
+ Requires-Dist: patool==2.4.0
232
232
  Requires-Dist: requests==2.32.3
233
233
  Requires-Dist: ruamel.yaml==0.18.6
234
234
  Requires-Dist: tabulate==0.9.0
235
- Requires-Dist: typer[all]==0.12.3
235
+ Requires-Dist: typer[all]==0.12.5
236
236
  Requires-Dist: yamale==5.2.1
237
237
 
238
238
  # openstack-image-manager
File without changes
@@ -33,3 +33,13 @@ images:
33
33
  mirror_url: https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-images/gardenlinux/1443.10/openstack-gardener_prod-amd64-1443.10-8d098305.qcow2
34
34
  checksum: "sha256:fb85ca67608638167b876df2988f927815c00c4a4b3e6d11d20565aa55b0f268"
35
35
  build_date: 2024-07-23
36
+ - version: '1592.0'
37
+ url: https://github.com/gardenlinux/gardenlinux/releases/download/1592.0/openstack-gardener_prod-amd64-1592.0-0cc2b85d.tar.xz
38
+ mirror_url: https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-images/gardenlinux/1592.0/openstack-gardener_prod-amd64-1592.0-0cc2b85d.qcow2
39
+ checksum: "sha256:43fbd3af61b6c531bb32fb4b74a09371c538839e3afab6ca7fe023e854c40e67"
40
+ build_date: 2024-08-12
41
+ - version: '1592.1'
42
+ url: https://github.com/gardenlinux/gardenlinux/releases/download/1592.1/openstack-gardener_prod-amd64-1592.1-ec945aa9.tar.xz
43
+ mirror_url: https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-images/gardenlinux/1592.1/openstack-gardener_prod-amd64-1592.1-ec945aa9.qcow2
44
+ checksum: "sha256:990f4843f4bb08dd5972710fb8909d4b3d34d53d1adecbec477f8c2e6bbc0db4"
45
+ build_date: 2024-08-22
@@ -17,6 +17,7 @@ image:
17
17
  password: str(required=False)
18
18
  shortname: str(required=False)
19
19
  status: enum('active', 'deactivated')
20
+ separator: str(required=False)
20
21
  tags: list(str())
21
22
  versions: list(include('versions'))
22
23
  visibility: enum('public', 'private', 'community', 'shared')
@@ -12,6 +12,7 @@ import typing
12
12
  from typing import Dict, Set
13
13
  import yamale
14
14
  import urllib.parse
15
+ import pkgutil
15
16
 
16
17
  from datetime import datetime, date
17
18
  from decimal import Decimal, ROUND_UP
@@ -92,9 +93,14 @@ class ImageManager:
92
93
  "project", "--share-type", help="Share - Type: 'project' or 'domain'"
93
94
  ),
94
95
  check: bool = typer.Option(
96
+ True,
97
+ "--check/--no-check",
98
+ help="Check the local image definitions against the SCS Image Metadata Standard (and process the images)",
99
+ ),
100
+ check_only: bool = typer.Option(
95
101
  False,
96
- "--check",
97
- help="Check the local image definitions against the SCS Image Metadata Standard",
102
+ "--check-only",
103
+ help="Quit after checking the image definitions against the SCS Image Metadata Standard",
98
104
  ),
99
105
  ):
100
106
  self.CONF = Munch.fromDict(locals())
@@ -209,11 +215,14 @@ class ImageManager:
209
215
  )
210
216
 
211
217
  # check local image definitions with yamale
212
- if self.CONF.check:
218
+ if self.CONF.check or self.CONF.check_only:
213
219
  self.validate_yaml_schema()
214
220
 
221
+ if self.CONF.check_only:
222
+ return
223
+
215
224
  # share image (previously share.py)
216
- elif self.CONF.share_image:
225
+ if self.CONF.share_image:
217
226
  self.create_connection()
218
227
  image = self.conn.get_image(self.CONF.share_image)
219
228
 
@@ -355,6 +364,9 @@ class ImageManager:
355
364
  if "image_description" not in image["meta"]:
356
365
  image["meta"]["image_description"] = image["name"]
357
366
 
367
+ if "image_name" not in image["meta"]:
368
+ image["meta"]["image_name"] = image["name"]
369
+
358
370
  existing_images, imported_image, previous_image = self.process_image(
359
371
  image, versions, sorted_versions, image["meta"].copy()
360
372
  )
@@ -362,7 +374,7 @@ class ImageManager:
362
374
 
363
375
  if imported_image and image["multi"]:
364
376
  self.rename_images(
365
- image["name"], sorted_versions, imported_image, previous_image
377
+ image, sorted_versions, imported_image, previous_image
366
378
  )
367
379
 
368
380
  return managed_images
@@ -511,11 +523,14 @@ class ImageManager:
511
523
  previous_image = None
512
524
  upstream_checksum = ""
513
525
 
526
+ separator = image.get("separator", " ")
527
+ image_name = image["name"]
528
+
514
529
  for version in sorted_versions:
515
530
  if image["multi"]:
516
- name = f"{image['name']} ({version})"
531
+ name = f"{image_name}{separator}({version})"
517
532
  else:
518
- name = f"{image['name']} {version}"
533
+ name = f"{image_name}{separator}{version}"
519
534
 
520
535
  logger.info(f"Processing image '{name}'")
521
536
  logger.debug(f"Checking existence of '{name}'")
@@ -550,7 +565,7 @@ class ImageManager:
550
565
  and version == sorted_versions[-1]
551
566
  and not existence
552
567
  ):
553
- previous = f"{image['name']} ({sorted_versions[-2]})"
568
+ previous = f"{image['name']}{separator}({sorted_versions[-2]})"
554
569
  existence = previous in cloud_images and image["name"] in cloud_images
555
570
 
556
571
  elif (
@@ -825,7 +840,7 @@ class ImageManager:
825
840
 
826
841
  def rename_images(
827
842
  self,
828
- name: str,
843
+ image: dict,
829
844
  sorted_versions: list,
830
845
  imported_image: Image,
831
846
  previous_image: Image,
@@ -834,16 +849,18 @@ class ImageManager:
834
849
  Rename outdated images in Glance (only applies to images of type multi)
835
850
 
836
851
  Params:
837
- name: the name of the image from images.yml
852
+ image: image dict from images.yml
838
853
  sorted_versions: list with all sorted image versions
839
854
  imported_image: the newly imported image
840
855
  previous_image: the previous latest image
841
856
  """
857
+ name = image["name"]
858
+ separator = image.get("separator", " ")
842
859
  cloud_images = self.get_images()
843
860
 
844
861
  if len(sorted_versions) > 1:
845
- latest = f"{name} ({sorted_versions[-1]})"
846
- previous_latest = f"{name} ({sorted_versions[-2]})"
862
+ latest = f"{name}{separator}({sorted_versions[-1]})"
863
+ previous_latest = f"{name}{separator}({sorted_versions[-2]})"
847
864
 
848
865
  if name in cloud_images and previous_latest not in cloud_images:
849
866
  logger.info(f"Renaming {name} to {previous_latest}")
@@ -865,7 +882,7 @@ class ImageManager:
865
882
  )
866
883
  create_date = create_date.replace("-", "")
867
884
 
868
- previous_latest = f"{name} ({create_date})"
885
+ previous_latest = f"{name}{separator}({create_date})"
869
886
 
870
887
  logger.info(
871
888
  f"Setting internal_version: {create_date} for {previous_latest}"
@@ -874,9 +891,7 @@ class ImageManager:
874
891
  previous_image.id, **{"internal_version": create_date}
875
892
  )
876
893
  else:
877
- previous_latest = (
878
- f"{name} ({previous_image['properties']['internal_version']})"
879
- )
894
+ previous_latest = f"{name}{separator}({previous_image['properties']['internal_version']})"
880
895
 
881
896
  logger.info(f"Renaming old latest '{name}' to '{previous_latest}'")
882
897
  self.conn.image.update_image(previous_image.id, name=previous_latest)
@@ -885,7 +900,7 @@ class ImageManager:
885
900
  self.conn.image.update_image(imported_image.id, name=name)
886
901
 
887
902
  elif len(sorted_versions) == 1:
888
- latest = f"{name} ({sorted_versions[-1]})"
903
+ latest = f"{name}{separator}({sorted_versions[-1]})"
889
904
 
890
905
  if latest in cloud_images:
891
906
  logger.info(f"Renaming {latest} to {name}")
@@ -1100,25 +1115,37 @@ class ImageManager:
1100
1115
 
1101
1116
  def validate_yaml_schema(self):
1102
1117
  """Validate all image.yaml files against the SCS Metadata spec"""
1103
- schema = yamale.make_schema("etc/schema.yaml")
1104
1118
  try:
1119
+ # We are a pip package
1120
+ schema_data = pkgutil.get_data(__name__, "etc/schema.yaml").decode("utf-8")
1121
+ schema = yamale.make_schema(content=schema_data)
1122
+ except Exception:
1123
+ # We are a cloned repo
1124
+ schema = yamale.make_schema("etc/schema.yaml")
1125
+ try:
1126
+ validation_error_log = []
1105
1127
  for file in os.listdir(self.CONF.images):
1106
1128
  try:
1107
1129
  data = yamale.make_data(self.CONF.images + file)
1108
1130
  yamale.validate(schema, data)
1109
1131
  except YamaleError as e:
1110
- self.exit_with_error = True
1111
1132
  for result in e.results:
1112
1133
  logger.error(
1113
1134
  f"Error validating data '{result.data}' with '{result.schema}'"
1114
1135
  )
1115
1136
  for error in result.errors:
1116
1137
  logger.error(f"\t{error}")
1138
+ validation_error_log.append((file, error))
1117
1139
  else:
1118
1140
  logger.debug(f"Image file {file} is valid")
1119
1141
  except FileNotFoundError:
1120
1142
  logger.error(f"Invalid path '{self.CONF.images}'")
1121
1143
 
1144
+ if len(validation_error_log) > 0:
1145
+ sys.exit(
1146
+ f"Image definition validation failed with these error(s): {validation_error_log}"
1147
+ )
1148
+
1122
1149
  def share_image_with_project(self, image, project):
1123
1150
  member = self.conn.image.find_member(project.id, image.id)
1124
1151
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openstack-image-manager
3
- Version: 0.20240812.0
3
+ Version: 0.20240829.0
4
4
  Summary: OpenStack image manager
5
5
  Author-email: OSISM community <info@osism.tech>
6
6
  License: Apache License
@@ -223,16 +223,16 @@ Requires-Python: >=3.8
223
223
  Description-Content-Type: text/markdown
224
224
  License-File: LICENSE
225
225
  Requires-Dist: loguru==0.7.2
226
- Requires-Dist: minio==7.2.7
226
+ Requires-Dist: minio==7.2.8
227
227
  Requires-Dist: munch==4.0.0
228
228
  Requires-Dist: natsort==8.4.0
229
229
  Requires-Dist: openstacksdk==3.3.0
230
230
  Requires-Dist: paramiko==3.4.1
231
- Requires-Dist: patool==2.3.0
231
+ Requires-Dist: patool==2.4.0
232
232
  Requires-Dist: requests==2.32.3
233
233
  Requires-Dist: ruamel.yaml==0.18.6
234
234
  Requires-Dist: tabulate==0.9.0
235
- Requires-Dist: typer[all]==0.12.3
235
+ Requires-Dist: typer[all]==0.12.5
236
236
  Requires-Dist: yamale==5.2.1
237
237
 
238
238
  # openstack-image-manager
@@ -3,6 +3,7 @@ MANIFEST.in
3
3
  README.md
4
4
  pyproject.toml
5
5
  requirements.txt
6
+ etc/__init__.py
6
7
  etc/schema.yaml
7
8
  etc/images/almalinux.yml
8
9
  etc/images/centos.yml
@@ -1,12 +1,12 @@
1
1
  loguru==0.7.2
2
- minio==7.2.7
2
+ minio==7.2.8
3
3
  munch==4.0.0
4
4
  natsort==8.4.0
5
5
  openstacksdk==3.3.0
6
6
  paramiko==3.4.1
7
- patool==2.3.0
7
+ patool==2.4.0
8
8
  requests==2.32.3
9
9
  ruamel.yaml==0.18.6
10
10
  tabulate==0.9.0
11
- typer[all]==0.12.3
11
+ typer[all]==0.12.5
12
12
  yamale==5.2.1
@@ -30,12 +30,15 @@ dynamic = ["dependencies", "version"]
30
30
  [tool.mypy]
31
31
  exclude = ["doc"]
32
32
 
33
+ [tool.setuptools]
34
+ packages = ["openstack_image_manager", "openstack_image_manager.etc"]
35
+ package-dir = {"openstack_image_manager.etc" = "etc"}
36
+
33
37
  [tool.setuptools.dynamic]
34
38
  dependencies = {file = ["requirements.txt"]}
35
39
 
36
- [tool.setuptools.packages.find]
37
- where = ["."]
38
- include = ["openstack_image_manager"]
40
+ [tool.setuptools.package-data]
41
+ "openstack_image_manager.etc" = ["**/*"]
39
42
 
40
43
  [tool.setuptools-git-versioning]
41
44
  enabled = true
@@ -1,12 +1,12 @@
1
1
  loguru==0.7.2
2
- minio==7.2.7
2
+ minio==7.2.8
3
3
  munch==4.0.0
4
4
  natsort==8.4.0
5
5
  openstacksdk==3.3.0
6
6
  paramiko==3.4.1
7
- patool==2.3.0
7
+ patool==2.4.0
8
8
  requests==2.32.3
9
9
  ruamel.yaml==0.18.6
10
10
  tabulate==0.9.0
11
- typer[all]==0.12.3
11
+ typer[all]==0.12.5
12
12
  yamale==5.2.1