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
79 lines
1.9 KiB
Go
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
|
|
}
|