Skip to content

Commit 6f288a6

Browse files
authored
Merge pull request #6958 from ykakarap/clusterctl-generate-provider_version-check
✨ add version check to clusterctl generate provider
2 parents fe4b7de + f6596e9 commit 6f288a6

File tree

5 files changed

+84
-1
lines changed

5 files changed

+84
-1
lines changed

cmd/clusterctl/client/client.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ type Client interface {
3333
// GetProviderComponents returns the provider components for a given provider with options including targetNamespace.
3434
GetProviderComponents(provider string, providerType clusterctlv1.ProviderType, options ComponentsOptions) (Components, error)
3535

36+
// GenerateProvider returns the provider components for a given provider with options including targetNamespace.
37+
GenerateProvider(provider string, providerType clusterctlv1.ProviderType, options ComponentsOptions) (Components, error)
38+
3639
// Init initializes a management cluster by adding the requested list of providers.
3740
Init(options InitOptions) ([]Components, error)
3841

cmd/clusterctl/client/client_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ func (f fakeClient) GetProviderComponents(provider string, providerType clusterc
8080
return f.internalClient.GetProviderComponents(provider, providerType, options)
8181
}
8282

83+
func (f fakeClient) GenerateProvider(provider string, providerType clusterctlv1.ProviderType, options ComponentsOptions) (Components, error) {
84+
return f.internalClient.GenerateProvider(provider, providerType, options)
85+
}
86+
8387
func (f fakeClient) GetClusterTemplate(options GetClusterTemplateOptions) (Template, error) {
8488
return f.internalClient.GetClusterTemplate(options)
8589
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
Copyright 2022 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package client
18+
19+
import (
20+
"github.com/pkg/errors"
21+
"k8s.io/apimachinery/pkg/util/version"
22+
23+
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
24+
clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3"
25+
)
26+
27+
func (c *clusterctlClient) GenerateProvider(provider string, providerType clusterctlv1.ProviderType, options ComponentsOptions) (Components, error) {
28+
providerName, providerVersion, err := parseProviderName(provider)
29+
if err != nil {
30+
return nil, err
31+
}
32+
33+
configRepository, err := c.configClient.Providers().Get(providerName, providerType)
34+
if err != nil {
35+
return nil, err
36+
}
37+
38+
providerRepositoryClient, err := c.repositoryClientFactory(RepositoryClientFactoryInput{Provider: configRepository})
39+
if err != nil {
40+
return nil, err
41+
}
42+
43+
if providerVersion == "" {
44+
providerVersion = providerRepositoryClient.DefaultVersion()
45+
}
46+
47+
latestMetadata, err := providerRepositoryClient.Metadata(providerVersion).Get()
48+
if err != nil {
49+
return nil, err
50+
}
51+
52+
currentVersion, err := version.ParseSemantic(providerVersion)
53+
if err != nil {
54+
return nil, err
55+
}
56+
57+
releaseSeries := latestMetadata.GetReleaseSeriesForVersion(currentVersion)
58+
if releaseSeries == nil {
59+
return nil, errors.Errorf("invalid provider metadata: version %s for the provider %s does not match any release series", providerVersion, providerName)
60+
}
61+
62+
if releaseSeries.Contract != clusterv1.GroupVersion.Version {
63+
return nil, errors.Errorf("current version of clusterctl is only compatible with %s providers, detected %s for provider %s", clusterv1.GroupVersion.Version, releaseSeries.Contract, providerName)
64+
}
65+
66+
return c.GetProviderComponents(provider, providerType, options)
67+
}

cmd/clusterctl/client/repository/client.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ import (
3333
type Client interface {
3434
config.Provider
3535

36+
// DefaultVersion returns the default provider version returned by a repository.
37+
// In case the repository URL points to latest, this method returns the current latest version; in other cases
38+
// it returns the version of the provider hosted in the repository.
39+
DefaultVersion() string
40+
3641
// GetVersions return the list of versions that are available in a provider repository
3742
GetVersions() ([]string, error)
3843

@@ -62,6 +67,10 @@ type repositoryClient struct {
6267
// ensure repositoryClient implements Client.
6368
var _ Client = &repositoryClient{}
6469

70+
func (c *repositoryClient) DefaultVersion() string {
71+
return c.repository.DefaultVersion()
72+
}
73+
6574
func (c *repositoryClient) GetVersions() ([]string, error) {
6675
return c.repository.GetVersions()
6776
}

cmd/clusterctl/cmd/generate_provider.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func runGenerateProviderComponents() error {
107107
SkipTemplateProcess: gpo.raw || gpo.textOutput,
108108
}
109109

110-
components, err := c.GetProviderComponents(providerName, providerType, options)
110+
components, err := c.GenerateProvider(providerName, providerType, options)
111111
if err != nil {
112112
return err
113113
}

0 commit comments

Comments
 (0)