Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,18 @@ metadata:
name: aws-creds
{{- else if .CloudCreds.OpenStack}}
name: openstack-credentials
{{- else if .CloudCreds.VSphere}}
name: vsphere-creds
{{- end}}
data:
{{- if .CloudCreds.AWS}}
aws_access_key_id: {{.CloudCreds.AWS.Base64encodeAccessKeyID}}
aws_secret_access_key: {{.CloudCreds.AWS.Base64encodeSecretAccessKey}}
{{- else if .CloudCreds.OpenStack}}
clouds.yaml: {{.CloudCreds.OpenStack.Base64encodeCloudCreds}}
{{- else if .CloudCreds.VSphere}}
{{- range .CloudCreds.VSphere.VirtualCenters}}
{{.Name}}.username: {{.Base64encodeUsername}}
{{.Name}}.password: {{.Base64encodePassword}}
{{- end}}
{{- end}}
123 changes: 123 additions & 0 deletions pkg/asset/manifests/cloudproviderconfig.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package manifests

import (
"path/filepath"

"github.com/ghodss/yaml"
ospclientconfig "github.com/gophercloud/utils/openstack/clientconfig"
"github.com/pkg/errors"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/openshift/installer/pkg/asset"
"github.com/openshift/installer/pkg/asset/installconfig"
osmachine "github.com/openshift/installer/pkg/asset/machines/openstack"
vspheremanifests "github.com/openshift/installer/pkg/asset/manifests/vsphere"
awstypes "github.com/openshift/installer/pkg/types/aws"
libvirttypes "github.com/openshift/installer/pkg/types/libvirt"
nonetypes "github.com/openshift/installer/pkg/types/none"
openstacktypes "github.com/openshift/installer/pkg/types/openstack"
vspheretypes "github.com/openshift/installer/pkg/types/vsphere"
)

var (
cloudProviderConfigFileName = filepath.Join(manifestDir, "cloud-provider-config.yaml")
)

const (
cloudProviderConfigDataKey = "config"
)

// CloudProviderConfig generates the cloud-provider-config.yaml files.
type CloudProviderConfig struct {
ConfigMap *corev1.ConfigMap
File *asset.File
}

var _ asset.WritableAsset = (*CloudProviderConfig)(nil)

// Name returns a human friendly name for the asset.
func (*CloudProviderConfig) Name() string {
return "Cloud Provider Config"
}

// Dependencies returns all of the dependencies directly needed to generate
// the asset.
func (*CloudProviderConfig) Dependencies() []asset.Asset {
return []asset.Asset{
&installconfig.InstallConfig{},
// PlatformCredsCheck just checks the creds (and asks, if needed)
// We do not actually use it in this asset directly, hence
// it is put in the dependencies but not fetched in Generate
&installconfig.PlatformCredsCheck{},
}
}

// Generate generates the CloudProviderConfig.
func (cpc *CloudProviderConfig) Generate(dependencies asset.Parents) error {
installConfig := &installconfig.InstallConfig{}
dependencies.Get(installConfig)

cm := &corev1.ConfigMap{
TypeMeta: metav1.TypeMeta{
APIVersion: corev1.SchemeGroupVersion.String(),
Kind: "ConfigMap",
},
ObjectMeta: metav1.ObjectMeta{
Namespace: "openshift-config",
Name: "cloud-provider-config",
},
Data: map[string]string{},
}

switch installConfig.Config.Platform.Name() {
case awstypes.Name, libvirttypes.Name, nonetypes.Name:
return nil
case openstacktypes.Name:
opts := &ospclientconfig.ClientOpts{}
opts.Cloud = installConfig.Config.Platform.OpenStack.Cloud
cloud, err := ospclientconfig.GetCloudFromYAML(opts)
if err != nil {
return errors.Wrap(err, "failed to get cloud config for openstack")
}
clouds := make(map[string]map[string]*ospclientconfig.Cloud)
clouds["clouds"] = map[string]*ospclientconfig.Cloud{
osmachine.CloudName: cloud,
}
marshalled, err := yaml.Marshal(clouds)
if err != nil {
return err
}
cm.Data[cloudProviderConfigDataKey] = string(marshalled)
case vspheretypes.Name:
vsphereConfig, err := vspheremanifests.CloudProviderConfig(installConfig.Config.Platform.VSphere)
if err != nil {
return errors.Wrap(err, "could not create cloud provider config")
}
cm.Data[cloudProviderConfigDataKey] = vsphereConfig
default:
return errors.New("invalid Platform")
}

cmData, err := yaml.Marshal(cm)
if err != nil {
return errors.Wrapf(err, "failed to create %s manifest", cpc.Name())
}
cpc.ConfigMap = cm
cpc.File = &asset.File{
Filename: cloudProviderConfigFileName,
Data: cmData,
}
return nil
}

// Files returns the files generated by the asset.
func (cpc *CloudProviderConfig) Files() []*asset.File {
return []*asset.File{cpc.File}
}

// Load loads the already-rendered files back from disk.
func (cpc *CloudProviderConfig) Load(f asset.FileFetcher) (bool, error) {
return false, nil
}
22 changes: 13 additions & 9 deletions pkg/asset/manifests/infrastructure.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,16 @@ func (*Infrastructure) Dependencies() []asset.Asset {
return []asset.Asset{
&installconfig.ClusterID{},
&installconfig.InstallConfig{},
&CloudProviderConfig{},
}
}

// Generate generates the Infrastructure config and its CRD.
func (i *Infrastructure) Generate(dependencies asset.Parents) error {
clusterID := &installconfig.ClusterID{}
installConfig := &installconfig.InstallConfig{}
dependencies.Get(clusterID, installConfig)
cloudproviderconfig := &CloudProviderConfig{}
dependencies.Get(clusterID, installConfig, cloudproviderconfig)

var platform configv1.PlatformType
switch installConfig.Config.Platform.Name() {
Expand Down Expand Up @@ -83,18 +85,20 @@ func (i *Infrastructure) Generate(dependencies asset.Parents) error {
},
}

if cloudproviderconfig.ConfigMap != nil {
// set the configmap reference.
config.Spec.CloudConfig = configv1.ConfigMapFileReference{Name: cloudproviderconfig.ConfigMap.Name, Key: cloudProviderConfigDataKey}
i.FileList = append(i.FileList, cloudproviderconfig.File)
}

configData, err := yaml.Marshal(config)
if err != nil {
return errors.Wrapf(err, "failed to marshal config: %#v", config)
}

i.FileList = []*asset.File{
{
Filename: infraCfgFilename,
Data: configData,
},
}

i.FileList = append(i.FileList, &asset.File{
Filename: infraCfgFilename,
Data: configData,
})
return nil
}

Expand Down
21 changes: 18 additions & 3 deletions pkg/asset/manifests/openshift.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ import (
osmachine "github.com/openshift/installer/pkg/asset/machines/openstack"
"github.com/openshift/installer/pkg/asset/password"
"github.com/openshift/installer/pkg/asset/templates/content/openshift"
awstypes "github.com/openshift/installer/pkg/types/aws"
openstacktypes "github.com/openshift/installer/pkg/types/openstack"
vspheretypes "github.com/openshift/installer/pkg/types/vsphere"
)

const (
Expand Down Expand Up @@ -56,7 +59,7 @@ func (o *Openshift) Generate(dependencies asset.Parents) error {
var cloudCreds cloudCredsSecretData
platform := installConfig.Config.Platform.Name()
switch platform {
case "aws":
case awstypes.Name:
ssn := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
Expand All @@ -70,7 +73,7 @@ func (o *Openshift) Generate(dependencies asset.Parents) error {
Base64encodeSecretAccessKey: base64.StdEncoding.EncodeToString([]byte(creds.SecretAccessKey)),
},
}
case "openstack":
case openstacktypes.Name:
opts := new(clientconfig.ClientOpts)
opts.Cloud = installConfig.Config.Platform.OpenStack.Cloud
cloud, err := clientconfig.GetCloudFromYAML(opts)
Expand All @@ -93,6 +96,18 @@ func (o *Openshift) Generate(dependencies asset.Parents) error {
Base64encodeCloudCreds: credsEncoded,
},
}
case vspheretypes.Name:
vcCreds := make([]VSphereVirtualCenterCredsSecretData, len(installConfig.Config.VSphere.VirtualCenters))
for i, vc := range installConfig.Config.VSphere.VirtualCenters {
vcCreds[i].Name = vc.Name
vcCreds[i].Base64encodeUsername = base64.StdEncoding.EncodeToString([]byte(vc.Username))
vcCreds[i].Base64encodePassword = base64.StdEncoding.EncodeToString([]byte(vc.Password))
}
cloudCreds = cloudCredsSecretData{
VSphere: &VSphereCredsSecretData{
VirtualCenters: vcCreds,
},
}
}

templateData := &openshiftTemplateData{
Expand All @@ -116,7 +131,7 @@ func (o *Openshift) Generate(dependencies asset.Parents) error {
}

switch platform {
case "aws", "openstack":
case awstypes.Name, openstacktypes.Name, vspheretypes.Name:
assetData["99_cloud-creds-secret.yaml"] = applyTemplateData(cloudCredsSecret.Files()[0].Data, templateData)
assetData["99_role-cloud-creds-secret-reader.yaml"] = applyTemplateData(roleCloudCredsSecretReader.Files()[0].Data, templateData)
}
Expand Down
52 changes: 31 additions & 21 deletions pkg/asset/manifests/operators.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/openshift/installer/pkg/asset/templates/content/bootkube"
"github.com/openshift/installer/pkg/asset/tls"
"github.com/openshift/installer/pkg/types"
vspheretypes "github.com/openshift/installer/pkg/types/vsphere"
)

const (
Expand Down Expand Up @@ -166,27 +167,26 @@ func (m *Manifests) generateBootKubeManifests(dependencies asset.Parents) []*ass
}

templateData := &bootkubeTemplateData{
Base64encodeCloudProviderConfig: "", // FIXME
CVOClusterID: clusterID.UUID,
EtcdCaBundle: base64.StdEncoding.EncodeToString(etcdCABundle.Cert()),
EtcdCaCert: string(etcdCA.Cert()),
EtcdClientCaCert: base64.StdEncoding.EncodeToString(etcdCA.Cert()),
EtcdClientCaKey: base64.StdEncoding.EncodeToString(etcdCA.Key()),
EtcdClientCert: base64.StdEncoding.EncodeToString(etcdClientCertKey.Cert()),
EtcdClientKey: base64.StdEncoding.EncodeToString(etcdClientCertKey.Key()),
EtcdEndpointDNSSuffix: installConfig.Config.ClusterDomain(),
EtcdEndpointHostnames: etcdEndpointHostnames,
EtcdMetricCaCert: string(etcdMetricCABundle.Cert()),
EtcdMetricClientCert: base64.StdEncoding.EncodeToString(etcdMetricSignerClientCertKey.Cert()),
EtcdMetricClientKey: base64.StdEncoding.EncodeToString(etcdMetricSignerClientCertKey.Key()),
EtcdSignerCert: base64.StdEncoding.EncodeToString(etcdSignerCertKey.Cert()),
EtcdSignerClientCert: base64.StdEncoding.EncodeToString(etcdSignerClientCertKey.Cert()),
EtcdSignerClientKey: base64.StdEncoding.EncodeToString(etcdSignerClientCertKey.Key()),
EtcdSignerKey: base64.StdEncoding.EncodeToString(etcdSignerCertKey.Key()),
McsTLSCert: base64.StdEncoding.EncodeToString(mcsCertKey.Cert()),
McsTLSKey: base64.StdEncoding.EncodeToString(mcsCertKey.Key()),
PullSecretBase64: base64.StdEncoding.EncodeToString([]byte(installConfig.Config.PullSecret)),
RootCaCert: string(rootCA.Cert()),
CVOClusterID: clusterID.UUID,
EtcdCaBundle: base64.StdEncoding.EncodeToString(etcdCABundle.Cert()),
EtcdCaCert: string(etcdCA.Cert()),
EtcdClientCaCert: base64.StdEncoding.EncodeToString(etcdCA.Cert()),
EtcdClientCaKey: base64.StdEncoding.EncodeToString(etcdCA.Key()),
EtcdClientCert: base64.StdEncoding.EncodeToString(etcdClientCertKey.Cert()),
EtcdClientKey: base64.StdEncoding.EncodeToString(etcdClientCertKey.Key()),
EtcdEndpointDNSSuffix: installConfig.Config.ClusterDomain(),
EtcdEndpointHostnames: etcdEndpointHostnames,
EtcdMetricCaCert: string(etcdMetricCABundle.Cert()),
EtcdMetricClientCert: base64.StdEncoding.EncodeToString(etcdMetricSignerClientCertKey.Cert()),
EtcdMetricClientKey: base64.StdEncoding.EncodeToString(etcdMetricSignerClientCertKey.Key()),
EtcdSignerCert: base64.StdEncoding.EncodeToString(etcdSignerCertKey.Cert()),
EtcdSignerClientCert: base64.StdEncoding.EncodeToString(etcdSignerClientCertKey.Cert()),
EtcdSignerClientKey: base64.StdEncoding.EncodeToString(etcdSignerClientCertKey.Key()),
EtcdSignerKey: base64.StdEncoding.EncodeToString(etcdSignerCertKey.Key()),
McsTLSCert: base64.StdEncoding.EncodeToString(mcsCertKey.Cert()),
McsTLSKey: base64.StdEncoding.EncodeToString(mcsCertKey.Key()),
PullSecretBase64: base64.StdEncoding.EncodeToString([]byte(installConfig.Config.PullSecret)),
RootCaCert: string(rootCA.Cert()),
}

files := []*asset.File{}
Expand Down Expand Up @@ -264,6 +264,16 @@ func (m *Manifests) Load(f asset.FileFetcher) (bool, error) {

func redactedInstallConfig(config types.InstallConfig) ([]byte, error) {
config.PullSecret = ""
if config.Platform.VSphere != nil {
p := *config.Platform.VSphere
p.VirtualCenters = make([]vspheretypes.VirtualCenter, len(config.Platform.VSphere.VirtualCenters))
for i, vc := range config.Platform.VSphere.VirtualCenters {
vc.Username = ""
vc.Password = ""
p.VirtualCenters[i] = vc
}
config.Platform.VSphere = &p
}
return yaml.Marshal(config)
}

Expand Down
Loading