Skip to content

Commit e22009c

Browse files
Merge pull request #10072 from dtantsur/bmc-ca
METAL-1105: support specifying CA to verify BMC connections
2 parents 64cc933 + 2cb7563 commit e22009c

File tree

9 files changed

+177
-2
lines changed

9 files changed

+177
-2
lines changed

data/data/bootstrap/baremetal/files/etc/containers/systemd/ironic.container.template

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ Volume=ironic.volume:/shared:z
2222
Volume=/opt/openshift/tls/ironic/:/certs/vmedia/:z
2323
{{ end }}
2424
Volume=/opt/openshift/tls/ironic/:/certs/ironic/:z
25+
{{ if .PlatformData.BareMetal.BMCVerifyCA }}
26+
Volume=/opt/openshift/bmc-ca:/certs/ca/bmc:z
27+
{{ end }}
2528
Environment="IRONIC_RAMDISK_SSH_KEY=${IRONIC_RAMDISK_SSH_KEY}"
2629
Environment="PROVISIONING_INTERFACE=${PROVISIONING_INTERFACE}"
2730
Environment="OS_CONDUCTOR__HEARTBEAT_TIMEOUT=120"

data/data/bootstrap/bootstrap-in-place/files/opt/openshift/bootstrap-in-place/bootstrap-in-place-post-reboot.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ function wait_for_api {
1313
}
1414

1515
# This is required since the progress service (https://github.com/openshift/installer/blob/dd9047c4c119e942331f702a4b7da85c60042da5/data/data/bootstrap/files/usr/local/bin/report-progress.sh#L22-L33),
16-
# usually dedicated to creating the bootstrap ConfigMap, will fail to create this configmap in case of bootstrap-in-place single node deployment,
16+
# usually dedicated to creating the bootstrap ConfigMap, will fail to create this configmap in case of bootstrap-in-place single node deployment,
1717
# due to the lack of a control plane when bootkube is complete
1818
function signal_bootstrap_complete {
1919
until oc get cm bootstrap -n kube-system &> /dev/null

data/data/install.openshift.io_installconfigs.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5738,6 +5738,8 @@ spec:
57385738
type: string
57395739
maxItems: 2
57405740
type: array
5741+
bmcVerifyCA:
5742+
type: string
57415743
bootstrapExternalStaticDNS:
57425744
description: |-
57435745
BootstrapExternalStaticDNS is the static network DNS of the bootstrap node.

pkg/asset/ignition/bootstrap/baremetal/template.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ type TemplateData struct {
8989

9090
// AdditionalNTPServers holds a list of additional NTP servers to be used for provisioning
9191
AdditionalNTPServers []string
92+
93+
BMCVerifyCA string
9294
}
9395

9496
func externalURLs(apiVIPs []string, protocol string) (externalURLv4 string, externalURLv6 string) {
@@ -126,6 +128,7 @@ func GetTemplateData(config *baremetal.Platform, networks []types.MachineNetwork
126128
templateData.ExternalStaticGateway = config.BootstrapExternalStaticGateway
127129
templateData.ExternalStaticDNS = config.BootstrapExternalStaticDNS
128130
templateData.ExternalMACAddress = config.ExternalMACAddress
131+
templateData.BMCVerifyCA = config.BMCVerifyCA
129132

130133
if len(config.AdditionalNTPServers) > 0 {
131134
templateData.AdditionalNTPServers = config.AdditionalNTPServers

pkg/asset/ignition/bootstrap/common.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ func (a *Common) Dependencies() []asset.Asset {
171171
&tls.RootCA{},
172172
&tls.ServiceAccountKeyPair{},
173173
&tls.IronicTLSCert{},
174+
&tls.BMCVerifyCA{},
174175
&releaseimage.Image{},
175176
new(rhcos.Image),
176177
}
@@ -672,6 +673,7 @@ func (a *Common) addParentFiles(dependencies asset.Parents) {
672673
&tls.ServiceAccountKeyPair{},
673674
&tls.JournalCertKey{},
674675
&tls.IronicTLSCert{},
676+
&tls.BMCVerifyCA{},
675677
} {
676678
dependencies.Get(asset)
677679

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package manifests
2+
3+
import (
4+
"context"
5+
"path"
6+
7+
"github.com/pkg/errors"
8+
corev1 "k8s.io/api/core/v1"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"sigs.k8s.io/yaml"
11+
12+
"github.com/openshift/installer/pkg/asset"
13+
"github.com/openshift/installer/pkg/asset/tls"
14+
)
15+
16+
var (
17+
bmcVerifyCAConfigMapFileName = path.Join("manifests", "bmc-verify-ca-configmap.yaml")
18+
)
19+
20+
const (
21+
bmcVerifyCAConfigMapName = "bmc-verify-ca"
22+
bmcVerifyCAConfigMapNamespace = "openshift-machine-api"
23+
bmcVerifyCAConfigMapDataKey = "verify_ca.crt"
24+
)
25+
26+
// BMCVerifyCAConfigMap generates the bmc-verify-ca ConfigMap.
27+
type BMCVerifyCAConfigMap struct {
28+
ConfigMap *corev1.ConfigMap
29+
File *asset.File
30+
}
31+
32+
var _ asset.WritableAsset = (*BMCVerifyCAConfigMap)(nil)
33+
34+
// Name returns a human friendly name for the asset.
35+
func (*BMCVerifyCAConfigMap) Name() string {
36+
return "BMC Verify CA ConfigMap"
37+
}
38+
39+
// Dependencies returns all of the dependencies directly needed to generate
40+
// the asset.
41+
func (*BMCVerifyCAConfigMap) Dependencies() []asset.Asset {
42+
return []asset.Asset{
43+
&tls.BMCVerifyCA{},
44+
}
45+
}
46+
47+
// Generate generates the BMC Verify CA ConfigMap.
48+
func (bvc *BMCVerifyCAConfigMap) Generate(_ context.Context, dependencies asset.Parents) error {
49+
bmcVerifyCA := &tls.BMCVerifyCA{}
50+
dependencies.Get(bmcVerifyCA)
51+
52+
// Only generate the ConfigMap if BMCVerifyCA has content
53+
files := bmcVerifyCA.Files()
54+
if len(files) == 0 {
55+
return nil
56+
}
57+
58+
cm := &corev1.ConfigMap{
59+
TypeMeta: metav1.TypeMeta{
60+
APIVersion: corev1.SchemeGroupVersion.String(),
61+
Kind: "ConfigMap",
62+
},
63+
ObjectMeta: metav1.ObjectMeta{
64+
Namespace: bmcVerifyCAConfigMapNamespace,
65+
Name: bmcVerifyCAConfigMapName,
66+
},
67+
Data: map[string]string{
68+
bmcVerifyCAConfigMapDataKey: string(files[0].Data),
69+
},
70+
}
71+
72+
cmData, err := yaml.Marshal(cm)
73+
if err != nil {
74+
return errors.Wrapf(err, "failed to create %s manifest", bvc.Name())
75+
}
76+
bvc.ConfigMap = cm
77+
bvc.File = &asset.File{
78+
Filename: bmcVerifyCAConfigMapFileName,
79+
Data: cmData,
80+
}
81+
return nil
82+
}
83+
84+
// Files returns the files generated by the asset.
85+
func (bvc *BMCVerifyCAConfigMap) Files() []*asset.File {
86+
if bvc.File != nil {
87+
return []*asset.File{bvc.File}
88+
}
89+
return []*asset.File{}
90+
}
91+
92+
// Load loads the already-rendered files back from disk.
93+
func (bvc *BMCVerifyCAConfigMap) Load(f asset.FileFetcher) (bool, error) {
94+
return false, nil
95+
}

pkg/asset/manifests/operators.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ func (m *Manifests) Dependencies() []asset.Asset {
8585
&bootkube.MachineConfigServerCAConfigMap{},
8686
&bootkube.MachineConfigServerTLSSecret{},
8787
&bootkube.OpenshiftConfigSecretPullSecret{},
88+
&BMCVerifyCAConfigMap{},
8889
}
8990
}
9091

@@ -101,8 +102,9 @@ func (m *Manifests) Generate(_ context.Context, dependencies asset.Parents) erro
101102
clusterCSIDriverConfig := &ClusterCSIDriverConfig{}
102103
imageDigestMirrorSet := &ImageDigestMirrorSet{}
103104
mcoCfgTemplate := &manifests.MCO{}
105+
bmcVerifyCAConfigMap := &BMCVerifyCAConfigMap{}
104106

105-
dependencies.Get(installConfig, ingress, dns, network, infra, proxy, scheduler, imageContentSourcePolicy, imageDigestMirrorSet, clusterCSIDriverConfig, mcoCfgTemplate)
107+
dependencies.Get(installConfig, ingress, dns, network, infra, proxy, scheduler, imageContentSourcePolicy, imageDigestMirrorSet, clusterCSIDriverConfig, mcoCfgTemplate, bmcVerifyCAConfigMap)
106108

107109
redactedConfig, err := redactedInstallConfig(*installConfig.Config)
108110
if err != nil {
@@ -140,6 +142,7 @@ func (m *Manifests) Generate(_ context.Context, dependencies asset.Parents) erro
140142
m.FileList = append(m.FileList, imageContentSourcePolicy.Files()...)
141143
m.FileList = append(m.FileList, clusterCSIDriverConfig.Files()...)
142144
m.FileList = append(m.FileList, imageDigestMirrorSet.Files()...)
145+
m.FileList = append(m.FileList, bmcVerifyCAConfigMap.Files()...)
143146

144147
asset.SortFiles(m.FileList)
145148

pkg/asset/tls/bmcverifyca.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package tls
2+
3+
import (
4+
"context"
5+
6+
"github.com/openshift/installer/pkg/asset"
7+
"github.com/openshift/installer/pkg/asset/installconfig"
8+
"github.com/openshift/installer/pkg/types/baremetal"
9+
)
10+
11+
// BMCVerifyCA is the asset for the user-provided BMC verify CA certificate file.
12+
// This CA certificate is used to verify BMC TLS certificates.
13+
type BMCVerifyCA struct {
14+
File *asset.File
15+
}
16+
17+
var _ asset.WritableAsset = (*BMCVerifyCA)(nil)
18+
19+
// Name returns the human-friendly name of the asset.
20+
func (*BMCVerifyCA) Name() string {
21+
return "BMC Verify CA Certificate"
22+
}
23+
24+
// Dependencies returns the dependency of the asset.
25+
func (*BMCVerifyCA) Dependencies() []asset.Asset {
26+
return []asset.Asset{
27+
&installconfig.InstallConfig{},
28+
}
29+
}
30+
31+
// Generate generates the BMC verify CA file from the install config.
32+
func (a *BMCVerifyCA) Generate(_ context.Context, dependencies asset.Parents) error {
33+
installConfig := &installconfig.InstallConfig{}
34+
dependencies.Get(installConfig)
35+
36+
// Only generate the file for baremetal platform with BMCVerifyCA configured
37+
if installConfig.Config.Platform.Name() != baremetal.Name {
38+
return nil
39+
}
40+
41+
if installConfig.Config.Platform.BareMetal == nil || installConfig.Config.Platform.BareMetal.BMCVerifyCA == "" {
42+
return nil
43+
}
44+
45+
// Create the file at rootDir/bmc-ca/verify_ca.crt (rootDir = /opt/openshift)
46+
a.File = &asset.File{
47+
Filename: "bmc-ca/verify_ca.crt",
48+
Data: []byte(installConfig.Config.Platform.BareMetal.BMCVerifyCA),
49+
}
50+
51+
return nil
52+
}
53+
54+
// Files returns the files generated by the asset.
55+
func (a *BMCVerifyCA) Files() []*asset.File {
56+
if a.File != nil {
57+
return []*asset.File{a.File}
58+
}
59+
return []*asset.File{}
60+
}
61+
62+
// Load loads the already-generated files back from disk.
63+
func (a *BMCVerifyCA) Load(f asset.FileFetcher) (bool, error) {
64+
return false, nil
65+
}

pkg/types/baremetal/platform.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,4 +247,6 @@ type Platform struct {
247247
// to use for provisioning
248248
// +optional
249249
AdditionalNTPServers []string `json:"additionalNTPServers,omitempty"`
250+
251+
BMCVerifyCA string `json:"bmcVerifyCA,omitempty"`
250252
}

0 commit comments

Comments
 (0)