-
Notifications
You must be signed in to change notification settings - Fork 12
/
reference_addon.go
134 lines (118 loc) · 4.04 KB
/
reference_addon.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package testutils
import (
"context"
"fmt"
"os"
"path/filepath"
"sync"
addonsv1alpha1 "github.com/mt-sre/addon-metadata-operator/api/v1alpha1"
"github.com/mt-sre/addon-metadata-operator/pkg/extractor"
"github.com/mt-sre/addon-metadata-operator/pkg/types"
"github.com/mt-sre/addon-metadata-operator/pkg/utils"
)
/*
Helper functions used to load the reference addon. The reference addon will
be our perfect addon, successfully passing all validators. Hardcoding stage
as the only environment for now.
Bundles live here:
<internal_gitlab>/managed-tenants-bundles/addons/reference-addon/**
Catalog/Bundles images live here:
- https://quay.io/osd-addons/reference-addon-bundle:<tag>
- https://quay.io/osd-addons/reference-addon-index:<tag>
*/
type singleton struct {
MetaIndexImage *addonsv1alpha1.AddonMetadataSpec
MetaImageSet *addonsv1alpha1.AddonMetadataSpec
Env string
Extractor extractor.Extractor
}
var (
instance *singleton
lock = sync.Mutex{}
)
// GetReferenceAddonStage - uses singleton pattern to avoid loading yaml manifests over and over
// currently supports:
// - (DEPRECATED) static indexImage reference-addon
// - imageSet reference-addon
func GetReferenceAddonStage() (*singleton, error) {
lock.Lock()
defer lock.Unlock()
if instance != nil {
return instance, nil
}
instance = &singleton{
Env: "stage",
Extractor: extractor.New(),
}
metaIndexImage, err := instance.GetMetadata(false)
if err != nil {
return nil, fmt.Errorf("Could not load indexImage metadata for reference-addon, got %v.", err)
}
metaImageSet, err := instance.GetMetadata(true)
if err != nil {
return nil, fmt.Errorf("Could not load imageSet metadata for reference-addon, got %v.", err)
}
instance.MetaIndexImage = metaIndexImage
instance.MetaImageSet = metaImageSet
return instance, nil
}
func (r *singleton) ImageSetDir() string {
return filepath.Join(RootDir().TestData().MetadataV1().ImageSets(), "reference-addon")
}
func (r *singleton) IndexImageDir() string {
return filepath.Join(RootDir().TestData().MetadataV1().Legacy(), "reference-addon")
}
func (r *singleton) GetMetadata(useImageSet bool) (*addonsv1alpha1.AddonMetadataSpec, error) {
var metaPath string
if useImageSet {
metaPath = filepath.Join(r.ImageSetDir(), "metadata", r.Env, "addon.yaml")
} else {
metaPath = filepath.Join(r.IndexImageDir(), "metadata", r.Env, "addon.yaml")
}
data, err := os.ReadFile(metaPath)
if err != nil {
return nil, err
}
meta := &addonsv1alpha1.AddonMetadataSpec{}
err = meta.FromYAML(data)
return meta, err
}
func (r *singleton) GetImageSet(version string) (*addonsv1alpha1.AddonImageSetSpec, error) {
baseDir := filepath.Join(r.ImageSetDir(), "addonimagesets", r.Env)
target := fmt.Sprintf("reference-addon.v%v.yaml", version)
if version == "latest" {
latest, err := utils.GetLatestImageSetVersion(baseDir)
if err != nil {
return nil, err
}
target = latest
} else if version == "" {
// fallback to default value from addon.yaml metadata
target = fmt.Sprintf("reference-addon.v%v.yaml", *r.MetaImageSet.ImageSetVersion)
}
imageSetPath := filepath.Join(baseDir, target)
data, err := os.ReadFile(imageSetPath)
if err != nil {
return nil, err
}
imageSet := &addonsv1alpha1.AddonImageSetSpec{}
err = imageSet.FromYAML(data)
return imageSet, err
}
func (r *singleton) GetMetaBundle(version string) (*types.MetaBundle, error) {
imageSet, err := r.GetImageSet(version)
if err != nil {
return nil, fmt.Errorf("Could not get reference-addon imageset got %v.", err)
}
bundles, err := r.Extractor.ExtractBundles(context.Background(), imageSet.IndexImage, "reference-addon")
if err != nil {
return nil, fmt.Errorf("Could not extract reference-addon bundles, got %v.", err)
}
// resolve metadata - deep copy because we don't want to mess up the singleton
meta := r.MetaImageSet.DeepCopy()
combinedMeta, err := meta.CombineWithImageSet(imageSet)
if err != nil {
return nil, fmt.Errorf("Could not combine metadata with imageset, got %v.", err)
}
return types.NewMetaBundle(combinedMeta, bundles), nil
}