Files
airshipctl/pkg/bootstrap/cloudinit/cloud-init.go
Kostiantyn Kalynovskyi ca0ecbd3ab Change document labeling
Now document labeling would allow to have same document to be deployed
to different clusters, ephemeral or target at the same type.

Change-Id: Ia1bb618c322c19c4db3c47b3d19c630b61125f5c
2020-02-19 20:51:21 +00:00

79 lines
1.9 KiB
Go

package cloudinit
import (
b64 "encoding/base64"
"opendev.org/airship/airshipctl/pkg/document"
)
const (
// TODO (dukov) This should depend on cluster api version once it is
// fully available for Metal3. In other words:
// - Secret for v1alpha1
// - KubeAdmConfig for v1alpha2
EphemeralClusterConfKind = "Secret"
)
func decodeData(cfg document.Document, key string) ([]byte, error) {
data, err := cfg.GetStringMap("data")
if err != nil {
return nil, ErrDataNotSupplied{DocName: cfg.GetName(), Key: key}
}
res, ok := data[key]
if !ok {
return nil, ErrDataNotSupplied{DocName: cfg.GetName(), Key: key}
}
return b64.StdEncoding.DecodeString(res)
}
// getDataFromSecret extracts data from Secret with respect to overrides
func getDataFromSecret(cfg document.Document, key string) ([]byte, error) {
data, err := cfg.GetStringMap("stringData")
if err != nil {
return decodeData(cfg, key)
}
res, ok := data[key]
if !ok {
return decodeData(cfg, key)
}
return []byte(res), nil
}
// GetCloudData reads YAML document input and generates cloud-init data for
// node (i.e. Cluster API Machine) with bootstrap label.
func GetCloudData(docBundle document.Bundle, bsSelector string) ([]byte, []byte, error) {
var userData []byte
var netConf []byte
docs, err := docBundle.GetByLabel(bsSelector)
if err != nil {
return nil, nil, err
}
var ephemeralCfg document.Document
for _, doc := range docs {
if doc.GetKind() == EphemeralClusterConfKind {
ephemeralCfg = doc
break
}
}
if ephemeralCfg == nil {
return nil, nil, document.ErrDocNotFound{
Selector: bsSelector,
Kind: EphemeralClusterConfKind,
}
}
netConf, err = getDataFromSecret(ephemeralCfg, "netconfig")
if err != nil {
return nil, nil, err
}
userData, err = getDataFromSecret(ephemeralCfg, "userdata")
if err != nil {
return nil, nil, err
}
return userData, netConf, nil
}