-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
151 lines (135 loc) · 3.52 KB
/
main.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Fedora container image
//
// A Dagger module for working with and generating a container image from the
// specified source Fedora image wrapping the dagger.Container type with several
// Fedora specific methods
package main
import (
"context"
"dagger/fedora/internal/dagger"
"fmt"
"io"
"net/http"
"strings"
"time"
)
func New(
ctx context.Context,
// Container registry
// +optional
registry string,
// Container registry organization
// +optional
org *string,
// Variant or image name
// +optional
variant string,
// Variant suffix string
// e.g. main (as related to ublue-os images)
// +optional
suffix *string,
// Tag or major release version
// +optional
tag string,
) *Fedora {
now := time.Now()
return setFedoraVersions(ctx, &Fedora{
Tag: tag,
Org: org,
Registry: registry,
Suffix: suffix,
Variant: variant,
Date: strings.Replace(now.Format(time.DateOnly), "-", "", -1), // 20241031
})
}
// setFedoraVersions sets the base image & release version information for the
// given Fedora object
func setFedoraVersions(ctx context.Context, fedora *Fedora) *Fedora {
var err error
fedora.BaseImage = fedora.
ContainerAddress(
fedora.Registry,
fedora.Org,
fedora.Variant,
fedora.Suffix,
fedora.Tag,
)
baseImageCtr := dag.Container().From(fedora.BaseImage)
fedora.BaseImageVersion, _ = fedora.ContainerVersionFromLabel(ctx, baseImageCtr)
releaseVersion, err := fedora.ContainerReleaseVersionFromLabel(ctx, baseImageCtr)
// NOTE: major version skipped if not found! (not treated as error)
if err == nil {
fedora.ReleaseVersion = &releaseVersion
}
return fedora
}
// Fedora represents the constructed Fedora image
type Fedora struct {
Org *string
Registry string
Suffix *string
Tag string
Variant string
ReleaseVersion *string
BaseImage string
BaseImageVersion string
Date string
Digests []string
Directories []*DirectoryFromSource
Files []*FileFromSource
PackageGroupsInstalled []string
PackageGroupsRemoved []string
PackagesInstalled []string
PackagesRemoved []string
PackagesSwapped []Swap
Repos []*Repo
ExecScriptPre []*dagger.File
ExecScriptPost []*dagger.File
ExecPre [][]string
ExecPost [][]string
Labels []*ContainerLabel
}
func (f *Fedora) GetBaseImage() string {
return f.BaseImageVersion
}
// httpGet will get the given url and return the data
func httpGet(url string) ([]byte, error) {
resp, err := http.Get(url)
if err != nil {
return nil, fmt.Errorf("error getting url '%s': %w", url, err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("bad status for url '%s': %v", url, resp.StatusCode)
}
data, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("error reading data from url '%s': %w", url, err)
}
return data, nil
}
// DefaultTags returns the default image tags for the output Fedora image
// as:
//
// <release version> (if determined),
// <release version>-<date>,
// <latest> (if set to true)
func (f *Fedora) DefaultTags(
// if true the "latest" tag will be appended to the returned list
// +optional
// +default=false
latest bool,
) []string {
tags := []string{}
if f.ReleaseVersion != nil {
tags = append(tags,
*f.ReleaseVersion,
fmt.Sprintf("%s-%s", *f.ReleaseVersion, f.Date),
)
}
if latest {
tags = append(tags, "latest")
}
tags = append(tags, f.Date)
return tags
}