ci: improve image-manifest reliability (#981)
diff --git a/roles/defaults/vars.go b/roles/defaults/vars.go
index 4dc1e7d..4c11748 100644
--- a/roles/defaults/vars.go
+++ b/roles/defaults/vars.go
@@ -12,6 +12,20 @@
varsFile []byte
)
+func GetImages() (map[string]string, error) {
+ path, err := yaml.PathString("$._atmosphere_images")
+ if err != nil {
+ return nil, err
+ }
+
+ var images map[string]string
+ if err := path.Read(bytes.NewReader(varsFile), &images); err != nil {
+ return nil, err
+ }
+
+ return images, nil
+}
+
func GetImageByKey(key string) (string, error) {
path, err := yaml.PathString("$._atmosphere_images." + key)
if err != nil {
diff --git a/roles/defaults/vars_test.go b/roles/defaults/vars_test.go
new file mode 100644
index 0000000..e70e545
--- /dev/null
+++ b/roles/defaults/vars_test.go
@@ -0,0 +1,50 @@
+package defaults
+
+import (
+ "context"
+ "fmt"
+ "slices"
+ "strings"
+ "testing"
+
+ "github.com/containers/image/v5/docker"
+ "github.com/stretchr/testify/require"
+)
+
+func TestImageExist(t *testing.T) {
+ images, err := GetImages()
+ require.NoError(t, err)
+
+ var uniqueImages []string
+ for _, image := range images {
+ if slices.Contains(uniqueImages, image) {
+ continue
+ }
+
+ uniqueImages = append(uniqueImages, image)
+ }
+
+ for _, image := range uniqueImages {
+ // NOTE(mnaser): ParseReference does not allow both tag & digest,
+ // so we strip the tags from the image name.
+ nameWithTag := strings.Split(image, "@")[0]
+ name := strings.Split(nameWithTag, ":")[0]
+ digest := strings.Split(image, "@")[1]
+ image := fmt.Sprintf("%s@%s", name, digest)
+
+ t.Run(image, func(t *testing.T) {
+ t.Parallel()
+
+ ref, err := docker.ParseReference(fmt.Sprintf("//%s", image))
+ require.NoError(t, err)
+
+ ctx := context.Background()
+ img, err := ref.NewImage(ctx, nil)
+ require.NoError(t, err)
+ defer img.Close()
+
+ _, _, err = img.Manifest(ctx)
+ require.NoError(t, err)
+ })
+ }
+}