-
Notifications
You must be signed in to change notification settings - Fork 18
/
rhcos.go
108 lines (92 loc) · 2.92 KB
/
rhcos.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
package imageprovider
import (
"errors"
"fmt"
"github.com/go-logr/logr"
metal3 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
"github.com/metal3-io/baremetal-operator/pkg/imageprovider"
"github.com/openshift/image-customization-controller/pkg/env"
"github.com/openshift/image-customization-controller/pkg/ignition"
"github.com/openshift/image-customization-controller/pkg/imagehandler"
)
type rhcosImageProvider struct {
ImageHandler imagehandler.ImageHandler
EnvInputs *env.EnvInputs
RegistriesConf []byte
}
func NewRHCOSImageProvider(imageServer imagehandler.ImageHandler, inputs *env.EnvInputs) imageprovider.ImageProvider {
registries, err := inputs.RegistriesConf()
if err != nil {
panic(err)
}
return &rhcosImageProvider{
ImageHandler: imageServer,
EnvInputs: inputs,
RegistriesConf: registries,
}
}
func (ip *rhcosImageProvider) SupportsArchitecture(arch string) bool {
return true
}
func (ip *rhcosImageProvider) SupportsFormat(format metal3.ImageFormat) bool {
switch format {
case metal3.ImageFormatISO, metal3.ImageFormatInitRD:
return true
default:
return false
}
}
func (ip *rhcosImageProvider) buildIgnitionConfig(networkData imageprovider.NetworkData, hostname string) ([]byte, error) {
nmstateData := networkData["nmstate"]
builder, err := ignition.New(nmstateData, ip.RegistriesConf,
ip.EnvInputs.IronicBaseURL,
ip.EnvInputs.IronicInspectorBaseURL,
ip.EnvInputs.IronicAgentImage,
ip.EnvInputs.IronicAgentPullSecret,
ip.EnvInputs.IronicRAMDiskSSHKey,
ip.EnvInputs.IpOptions,
ip.EnvInputs.HttpProxy,
ip.EnvInputs.HttpsProxy,
ip.EnvInputs.NoProxy,
hostname,
ip.EnvInputs.IronicAgentVlanInterfaces,
)
if err != nil {
return nil, imageprovider.BuildInvalidError(err)
}
err, message := builder.ProcessNetworkState()
if message != "" {
return nil, imageprovider.BuildInvalidError(errors.New(message))
}
if err != nil {
return nil, err
}
return builder.Generate()
}
func imageKey(data imageprovider.ImageData) string {
return fmt.Sprintf("%s-%s-%s-%s.%s",
data.ImageMetadata.Namespace,
data.ImageMetadata.Name,
data.ImageMetadata.UID,
data.Architecture,
data.Format,
)
}
func (ip *rhcosImageProvider) BuildImage(data imageprovider.ImageData, networkData imageprovider.NetworkData, log logr.Logger) (imageprovider.GeneratedImage, error) {
generated := imageprovider.GeneratedImage{}
ignitionConfig, err := ip.buildIgnitionConfig(networkData, data.ImageMetadata.Name)
if err != nil {
return generated, err
}
url, err := ip.ImageHandler.ServeImage(imageKey(data), ignitionConfig,
data.Format == metal3.ImageFormatInitRD, false)
if errors.As(err, &imagehandler.InvalidBaseImageError{}) {
return generated, imageprovider.BuildInvalidError(err)
}
generated.ImageURL = url
return generated, err
}
func (ip *rhcosImageProvider) DiscardImage(data imageprovider.ImageData) error {
ip.ImageHandler.RemoveImage(imageKey(data))
return nil
}