Skip to content

Commit f9b4568

Browse files
Allow to utilize providers from clusterctl.yaml file in /config/clusterctl.yaml
1 parent e3b4abe commit f9b4568

File tree

4 files changed

+50
-9
lines changed

4 files changed

+50
-9
lines changed

internal/controller/consts.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ const (
2727
githubDomain = "github.com"
2828
gitlabHostPrefix = "gitlab."
2929
gitlabPackagesAPIPrefix = "/api/v4/projects/"
30+
configPath = "/config/clusterctl.yaml"
3031
)

internal/controller/phases.go

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"fmt"
2424
"io"
2525
"net/url"
26+
"os"
2627
"strings"
2728

2829
corev1 "k8s.io/api/core/v1"
@@ -114,18 +115,35 @@ func (p *phaseReconciler) preflightChecks(ctx context.Context) (reconcile.Result
114115

115116
// initializePhaseReconciler initializes phase reconciler.
116117
func (p *phaseReconciler) initializePhaseReconciler(ctx context.Context) (reconcile.Result, error) {
117-
// Load provider's secret and config url.
118-
reader, err := p.secretReader(ctx)
119-
if err != nil {
120-
return reconcile.Result{}, wrapPhaseError(err, "failed to load the secret reader")
118+
path := configPath
119+
if _, err := os.Stat(configPath); os.IsNotExist(err) {
120+
path = ""
121+
} else if err != nil {
122+
return reconcile.Result{}, err
121123
}
122124

123125
// Initialize a client for interacting with the clusterctl configuration.
124-
p.configClient, err = configclient.New(ctx, "", configclient.InjectReader(reader))
126+
initConfig, err := configclient.New(ctx, path)
127+
if err != nil {
128+
return reconcile.Result{}, err
129+
}
130+
131+
providers, err := initConfig.Providers().List()
125132
if err != nil {
126133
return reconcile.Result{}, err
127134
}
128135

136+
reader, err := p.secretReader(ctx, providers...)
137+
if err != nil {
138+
return reconcile.Result{}, err
139+
}
140+
141+
// Load provider's secret and config url.
142+
p.configClient, err = configclient.New(ctx, "", configclient.InjectReader(reader))
143+
if err != nil {
144+
return reconcile.Result{}, wrapPhaseError(err, "failed to load the secret reader")
145+
}
146+
129147
// Get returns the configuration for the provider with a given name/type.
130148
// This is done using clusterctl internal API types.
131149
p.providerConfig, err = p.configClient.Providers().Get(p.provider.GetName(), util.ClusterctlProviderType(p.provider))
@@ -197,7 +215,7 @@ func (p *phaseReconciler) load(ctx context.Context) (reconcile.Result, error) {
197215

198216
// secretReader use clusterctl MemoryReader structure to store the configuration variables
199217
// that are obtained from a secret and try to set fetch url config.
200-
func (p *phaseReconciler) secretReader(ctx context.Context) (configclient.Reader, error) {
218+
func (p *phaseReconciler) secretReader(ctx context.Context, providers ...configclient.Provider) (configclient.Reader, error) {
201219
log := ctrl.LoggerFrom(ctx)
202220

203221
mr := configclient.NewMemoryReader()
@@ -222,6 +240,12 @@ func (p *phaseReconciler) secretReader(ctx context.Context) (configclient.Reader
222240
log.Info("No configuration secret was specified")
223241
}
224242

243+
for _, provider := range providers {
244+
if _, err := mr.AddProvider(provider.Name(), provider.Type(), provider.URL()); err != nil {
245+
return nil, err
246+
}
247+
}
248+
225249
// If provided store fetch config url in memory reader.
226250
if p.provider.GetSpec().FetchConfig != nil {
227251
if p.provider.GetSpec().FetchConfig.URL != "" {

internal/controller/phases_test.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ func TestSecretReader(t *testing.T) {
7272
testValue1 := "test-value1"
7373
testKey2 := "test-key2"
7474
testValue2 := "test-value2"
75+
testKey3 := "test-key3"
76+
testValue3 := "test-value3"
7577

7678
g.Expect(fakeclient.Create(ctx, &corev1.Secret{
7779
ObjectMeta: metav1.ObjectMeta{
@@ -84,7 +86,7 @@ func TestSecretReader(t *testing.T) {
8486
},
8587
})).To(Succeed())
8688

87-
configreader, err := p.secretReader(context.TODO())
89+
configreader, err := p.secretReader(context.TODO(), configclient.NewProvider(testKey3, testValue3, clusterctlv1.CoreProviderType))
8890
g.Expect(err).ToNot(HaveOccurred())
8991

9092
expectedValue1, err := configreader.Get(testKey1)
@@ -97,7 +99,13 @@ func TestSecretReader(t *testing.T) {
9799

98100
exptectedProviderData, err := configreader.Get("providers")
99101
g.Expect(err).ToNot(HaveOccurred())
100-
g.Expect(exptectedProviderData).To(Equal("- name: cluster-api\n type: CoreProvider\n url: https://example.com\n"))
102+
g.Expect(exptectedProviderData).To(Equal(`- name: test-key3
103+
type: CoreProvider
104+
url: test-value3
105+
- name: cluster-api
106+
type: CoreProvider
107+
url: https://example.com
108+
`))
101109
}
102110

103111
func TestConfigmapRepository(t *testing.T) {

internal/controller/preflight_checks.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package controller
1919
import (
2020
"context"
2121
"fmt"
22+
"os"
2223

2324
"github.com/google/go-github/v52/github"
2425
"golang.org/x/oauth2"
@@ -230,8 +231,15 @@ func coreProviderIsReady(ctx context.Context, c client.Client) (bool, error) {
230231
// The list of known providers can be found here:
231232
// https://github.com/kubernetes-sigs/cluster-api/blob/main/cmd/clusterctl/client/config/providers_client.go
232233
func isPredefinedProvider(ctx context.Context, providerName string, providerType clusterctlv1.ProviderType) (bool, error) {
234+
path := configPath
235+
if _, err := os.Stat(configPath); os.IsNotExist(err) {
236+
path = ""
237+
} else if err != nil {
238+
return false, err
239+
}
240+
233241
// Initialize a client that contains predefined providers only.
234-
configClient, err := configclient.New(ctx, "")
242+
configClient, err := configclient.New(ctx, path)
235243
if err != nil {
236244
return false, err
237245
}

0 commit comments

Comments
 (0)