Skip to content

Commit aacbbc7

Browse files
add support for IPAM and Runtime Extension provider in clusterctl
1 parent 345b902 commit aacbbc7

File tree

12 files changed

+227
-94
lines changed

12 files changed

+227
-94
lines changed

cmd/clusterctl/api/v1alpha3/labels.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ func ManifestLabel(name string, providerType ProviderType) string {
5050
return fmt.Sprintf("control-plane-%s", name)
5151
case InfrastructureProviderType:
5252
return fmt.Sprintf("infrastructure-%s", name)
53+
case IPAMProviderType:
54+
return fmt.Sprintf("ipam-%s", name)
55+
case RuntimeExtensionProviderType:
56+
return fmt.Sprintf("runtime-extension-%s", name)
5357
default:
5458
return name
5559
}

cmd/clusterctl/api/v1alpha3/provider_type.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ func (p *Provider) GetProviderType() ProviderType {
9292
CoreProviderType,
9393
BootstrapProviderType,
9494
InfrastructureProviderType,
95-
ControlPlaneProviderType:
95+
ControlPlaneProviderType,
96+
IPAMProviderType,
97+
RuntimeExtensionProviderType:
9698
return t
9799
default:
98100
return ProviderTypeUnknown
@@ -118,6 +120,14 @@ const (
118120
// control-plane capabilities.
119121
ControlPlaneProviderType = ProviderType("ControlPlaneProvider")
120122

123+
// IPAMProviderType is the type associated with codebases that provide
124+
// IPAM capabilities.
125+
IPAMProviderType = ProviderType("IPAMProvider")
126+
127+
// RuntimeExtensionProviderType is the type associated with codebases that provide
128+
// runtime extensions.
129+
RuntimeExtensionProviderType = ProviderType("RuntimeExtensionProvider")
130+
121131
// ProviderTypeUnknown is used when the type is unknown.
122132
ProviderTypeUnknown = ProviderType("")
123133
)
@@ -133,8 +143,12 @@ func (p ProviderType) Order() int {
133143
return 2
134144
case InfrastructureProviderType:
135145
return 3
136-
default:
146+
case IPAMProviderType:
137147
return 4
148+
case RuntimeExtensionProviderType:
149+
return 5
150+
default:
151+
return 99
138152
}
139153
}
140154

cmd/clusterctl/client/config/providers_client.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -361,14 +361,18 @@ func validateProvider(r Provider) error {
361361
case clusterctlv1.CoreProviderType,
362362
clusterctlv1.BootstrapProviderType,
363363
clusterctlv1.InfrastructureProviderType,
364-
clusterctlv1.ControlPlaneProviderType:
364+
clusterctlv1.ControlPlaneProviderType,
365+
clusterctlv1.IPAMProviderType,
366+
clusterctlv1.RuntimeExtensionProviderType:
365367
break
366368
default:
367-
return errors.Errorf("invalid provider type. Allowed values are [%s, %s, %s, %s]",
369+
return errors.Errorf("invalid provider type. Allowed values are [%s, %s, %s, %s, %s, %s]",
368370
clusterctlv1.CoreProviderType,
369371
clusterctlv1.BootstrapProviderType,
370372
clusterctlv1.InfrastructureProviderType,
371-
clusterctlv1.ControlPlaneProviderType)
373+
clusterctlv1.ControlPlaneProviderType,
374+
clusterctlv1.IPAMProviderType,
375+
clusterctlv1.RuntimeExtensionProviderType)
372376
}
373377
return nil
374378
}

cmd/clusterctl/client/delete.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,24 @@ type DeleteOptions struct {
3030
// default rules for kubeconfig discovery will be used.
3131
Kubeconfig Kubeconfig
3232

33-
// CoreProvider version (e.g. cluster-api:v1.1.5) to add to the management cluster. If unspecified, the
34-
// cluster-api core provider's latest release is used.
33+
// CoreProvider version (e.g. cluster-api:v1.1.5) to delete from the management cluster.
3534
CoreProvider string
3635

37-
// BootstrapProviders and versions (e.g. kubeadm:v1.1.5) to add to the management cluster.
38-
// If unspecified, the kubeadm bootstrap provider's latest release is used.
36+
// BootstrapProviders and versions (e.g. kubeadm:v1.1.5) to delete from the management cluster.
3937
BootstrapProviders []string
4038

41-
// InfrastructureProviders and versions (e.g. aws:v0.5.0) to add to the management cluster.
39+
// InfrastructureProviders and versions (e.g. aws:v0.5.0) to delete from the management cluster.
4240
InfrastructureProviders []string
4341

44-
// ControlPlaneProviders and versions (e.g. kubeadm:v1.1.5) to add to the management cluster.
45-
// If unspecified, the kubeadm control plane provider latest release is used.
42+
// ControlPlaneProviders and versions (e.g. kubeadm:v1.1.5) to delete from the management cluster.
4643
ControlPlaneProviders []string
4744

45+
// IPAMProviders and versions (e.g. infoblox:v0.0.1) to delete from the management cluster.
46+
IPAMProviders []string
47+
48+
// RuntimeExtensionProviders and versions (e.g. test:v0.0.1) to delete from the management cluster.
49+
RuntimeExtensionProviders []string
50+
4851
// DeleteAll set for deletion of all the providers.
4952
DeleteAll bool
5053

@@ -109,6 +112,16 @@ func (c *clusterctlClient) Delete(options DeleteOptions) error {
109112
return err
110113
}
111114

115+
providers, err = appendProviders(providers, clusterctlv1.IPAMProviderType, options.IPAMProviders...)
116+
if err != nil {
117+
return err
118+
}
119+
120+
providers, err = appendProviders(providers, clusterctlv1.RuntimeExtensionProviderType, options.RuntimeExtensionProviders...)
121+
if err != nil {
122+
return err
123+
}
124+
112125
for _, provider := range providers {
113126
// Try to detect the namespace where the provider lives
114127
provider.Namespace, err = clusterClient.ProviderInventory().GetProviderNamespace(provider.ProviderName, provider.GetProviderType())

cmd/clusterctl/client/init.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ type InitOptions struct {
5353
// If unspecified, the kubeadm control plane provider latest release is used.
5454
ControlPlaneProviders []string
5555

56+
// IPAMProviders and versions (e.g. infoblox:v0.0.1) to add to the management cluster.
57+
IPAMProviders []string
58+
59+
// RuntimeExtensionProviders and versions (e.g. test:v0.0.1) to add to the management cluster.
60+
RuntimeExtensionProviders []string
61+
5662
// TargetNamespace defines the namespace where the providers should be deployed. If unspecified, each provider
5763
// will be installed in a provider's default namespace.
5864
TargetNamespace string
@@ -227,6 +233,14 @@ func (c *clusterctlClient) setupInstaller(cluster cluster.Client, options InitOp
227233
return nil, err
228234
}
229235

236+
if err := c.addToInstaller(addOptions, clusterctlv1.IPAMProviderType, options.IPAMProviders...); err != nil {
237+
return nil, err
238+
}
239+
240+
if err := c.addToInstaller(addOptions, clusterctlv1.RuntimeExtensionProviderType, options.RuntimeExtensionProviders...); err != nil {
241+
return nil, err
242+
}
243+
230244
return installer, nil
231245
}
232246

cmd/clusterctl/client/upgrade.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ type ApplyUpgradeOptions struct {
109109
// InfrastructureProviders instance and versions (e.g. capa-system/aws:v0.5.0) to upgrade to. This field can be used as alternative to Contract.
110110
InfrastructureProviders []string
111111

112+
// IPAMProviders instance and versions (e.g. ipam-system/infoblox:v0.0.1) to upgrade to. This field can be used as alternative to Contract.
113+
IPAMProviders []string
114+
115+
// RuntimeExtensionProviders instance and versions (e.g. runtime-extension-system/test:v0.0.1) to upgrade to. This field can be used as alternative to Contract.
116+
RuntimeExtensionProviders []string
117+
112118
// WaitProviders instructs the upgrade apply command to wait till the providers are successfully upgraded.
113119
WaitProviders bool
114120

@@ -155,7 +161,9 @@ func (c *clusterctlClient) ApplyUpgrade(options ApplyUpgradeOptions) error {
155161
isCustomUpgrade := options.CoreProvider != "" ||
156162
len(options.BootstrapProviders) > 0 ||
157163
len(options.ControlPlaneProviders) > 0 ||
158-
len(options.InfrastructureProviders) > 0
164+
len(options.InfrastructureProviders) > 0 ||
165+
len(options.IPAMProviders) > 0 ||
166+
len(options.RuntimeExtensionProviders) > 0
159167

160168
opts := cluster.UpgradeOptions{
161169
WaitProviders: options.WaitProviders,
@@ -185,6 +193,14 @@ func (c *clusterctlClient) ApplyUpgrade(options ApplyUpgradeOptions) error {
185193
if err != nil {
186194
return err
187195
}
196+
upgradeItems, err = addUpgradeItems(upgradeItems, clusterctlv1.IPAMProviderType, options.IPAMProviders...)
197+
if err != nil {
198+
return err
199+
}
200+
upgradeItems, err = addUpgradeItems(upgradeItems, clusterctlv1.RuntimeExtensionProviderType, options.RuntimeExtensionProviders...)
201+
if err != nil {
202+
return err
203+
}
188204

189205
// Execute the upgrade using the custom upgrade items
190206
return clusterClient.ProviderUpgrader().ApplyCustomPlan(opts, upgradeItems...)

cmd/clusterctl/cmd/delete.go

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,17 @@ import (
2424
)
2525

2626
type deleteOptions struct {
27-
kubeconfig string
28-
kubeconfigContext string
29-
coreProvider string
30-
bootstrapProviders []string
31-
controlPlaneProviders []string
32-
infrastructureProviders []string
33-
includeNamespace bool
34-
includeCRDs bool
35-
deleteAll bool
27+
kubeconfig string
28+
kubeconfigContext string
29+
coreProvider string
30+
bootstrapProviders []string
31+
controlPlaneProviders []string
32+
infrastructureProviders []string
33+
ipamProviders []string
34+
runtimeExtensionProviders []string
35+
includeNamespace bool
36+
includeCRDs bool
37+
deleteAll bool
3638
}
3739

3840
var dd = &deleteOptions{}
@@ -102,6 +104,10 @@ func init() {
102104
"Bootstrap providers and versions (e.g. kubeadm:v1.1.5) to delete from the management cluster")
103105
deleteCmd.Flags().StringSliceVarP(&dd.controlPlaneProviders, "control-plane", "c", nil,
104106
"ControlPlane providers and versions (e.g. kubeadm:v1.1.5) to delete from the management cluster")
107+
deleteCmd.Flags().StringSliceVar(&dd.ipamProviders, "ipam", nil,
108+
"IPAM providers and versions (e.g. infoblox:v0.0.1) to delete from the management cluster")
109+
deleteCmd.Flags().StringSliceVar(&dd.runtimeExtensionProviders, "runtime-extension", nil,
110+
"Runtime extension providers and versions (e.g. test:v0.0.1) to delete from the management cluster")
105111

106112
deleteCmd.Flags().BoolVar(&dd.deleteAll, "all", false,
107113
"Force deletion of all the providers")
@@ -118,24 +124,28 @@ func runDelete() error {
118124
hasProviderNames := (dd.coreProvider != "") ||
119125
(len(dd.bootstrapProviders) > 0) ||
120126
(len(dd.controlPlaneProviders) > 0) ||
121-
(len(dd.infrastructureProviders) > 0)
127+
(len(dd.infrastructureProviders) > 0) ||
128+
(len(dd.ipamProviders) > 0) ||
129+
(len(dd.runtimeExtensionProviders) > 0)
122130

123131
if dd.deleteAll && hasProviderNames {
124-
return errors.New("The --all flag can't be used in combination with --core, --bootstrap, --control-plane, --infrastructure")
132+
return errors.New("The --all flag can't be used in combination with --core, --bootstrap, --control-plane, --infrastructure, --ipam, --extension")
125133
}
126134

127135
if !dd.deleteAll && !hasProviderNames {
128-
return errors.New("At least one of --core, --bootstrap, --control-plane, --infrastructure should be specified or the --all flag should be set")
136+
return errors.New("At least one of --core, --bootstrap, --control-plane, --infrastructure, --ipam, --extension should be specified or the --all flag should be set")
129137
}
130138

131139
return c.Delete(client.DeleteOptions{
132-
Kubeconfig: client.Kubeconfig{Path: dd.kubeconfig, Context: dd.kubeconfigContext},
133-
IncludeNamespace: dd.includeNamespace,
134-
IncludeCRDs: dd.includeCRDs,
135-
CoreProvider: dd.coreProvider,
136-
BootstrapProviders: dd.bootstrapProviders,
137-
InfrastructureProviders: dd.infrastructureProviders,
138-
ControlPlaneProviders: dd.controlPlaneProviders,
139-
DeleteAll: dd.deleteAll,
140+
Kubeconfig: client.Kubeconfig{Path: dd.kubeconfig, Context: dd.kubeconfigContext},
141+
IncludeNamespace: dd.includeNamespace,
142+
IncludeCRDs: dd.includeCRDs,
143+
CoreProvider: dd.coreProvider,
144+
BootstrapProviders: dd.bootstrapProviders,
145+
InfrastructureProviders: dd.infrastructureProviders,
146+
ControlPlaneProviders: dd.controlPlaneProviders,
147+
IPAMProviders: dd.ipamProviders,
148+
RuntimeExtensionProviders: dd.runtimeExtensionProviders,
149+
DeleteAll: dd.deleteAll,
140150
})
141151
}

cmd/clusterctl/cmd/generate_provider.go

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ import (
2525
)
2626

2727
type generateProvidersOptions struct {
28-
coreProvider string
29-
bootstrapProvider string
30-
controlPlaneProvider string
31-
infrastructureProvider string
32-
targetNamespace string
33-
textOutput bool
34-
raw bool
28+
coreProvider string
29+
bootstrapProvider string
30+
controlPlaneProvider string
31+
infrastructureProvider string
32+
ipamProvider string
33+
runtimeExtensionProvider string
34+
targetNamespace string
35+
textOutput bool
36+
raw bool
3537
}
3638

3739
var gpo = &generateProvidersOptions{}
@@ -82,6 +84,10 @@ func init() {
8284
"Bootstrap provider and version (e.g. kubeadm:v1.1.5)")
8385
generateProviderCmd.Flags().StringVarP(&gpo.controlPlaneProvider, "control-plane", "c", "",
8486
"ControlPlane provider and version (e.g. kubeadm:v1.1.5)")
87+
generateProviderCmd.Flags().StringVar(&gpo.ipamProvider, "ipam", "",
88+
"IPAM provider and version (e.g. infoblox:v0.0.1)")
89+
generateProviderCmd.Flags().StringVar(&gpo.runtimeExtensionProvider, "runtime-extension", "",
90+
"Runtime extension provider and version (e.g. test:v0.0.1)")
8591
generateProviderCmd.Flags().StringVarP(&gpo.targetNamespace, "target-namespace", "n", "",
8692
"The target namespace where the provider should be deployed. If unspecified, the components default namespace is used.")
8793
generateProviderCmd.Flags().BoolVar(&gpo.textOutput, "describe", false,
@@ -125,27 +131,41 @@ func parseProvider() (string, clusterctlv1.ProviderType, error) {
125131
providerType := clusterctlv1.CoreProviderType
126132
if gpo.bootstrapProvider != "" {
127133
if providerName != "" {
128-
return "", "", errors.New("only one of --core, --bootstrap, --control-plane, --infrastructure should be set")
134+
return "", "", errors.New("only one of --core, --bootstrap, --control-plane, --infrastructure, --ipam, --extension should be set")
129135
}
130136
providerName = gpo.bootstrapProvider
131137
providerType = clusterctlv1.BootstrapProviderType
132138
}
133139
if gpo.controlPlaneProvider != "" {
134140
if providerName != "" {
135-
return "", "", errors.New("only one of --core, --bootstrap, --control-plane, --infrastructure should be set")
141+
return "", "", errors.New("only one of --core, --bootstrap, --control-plane, --infrastructure, --ipam, --extension should be set")
136142
}
137143
providerName = gpo.controlPlaneProvider
138144
providerType = clusterctlv1.ControlPlaneProviderType
139145
}
140146
if gpo.infrastructureProvider != "" {
141147
if providerName != "" {
142-
return "", "", errors.New("only one of --core, --bootstrap, --control-plane, --infrastructure should be set")
148+
return "", "", errors.New("only one of --core, --bootstrap, --control-plane, --infrastructure, --ipam, --extension should be set")
143149
}
144150
providerName = gpo.infrastructureProvider
145151
providerType = clusterctlv1.InfrastructureProviderType
146152
}
153+
if gpo.ipamProvider != "" {
154+
if providerName != "" {
155+
return "", "", errors.New("only one of --core, --bootstrap, --control-plane, --infrastructure, --ipam, --extension should be set")
156+
}
157+
providerName = gpo.ipamProvider
158+
providerType = clusterctlv1.IPAMProviderType
159+
}
160+
if gpo.runtimeExtensionProvider != "" {
161+
if providerName != "" {
162+
return "", "", errors.New("only one of --core, --bootstrap, --control-plane, --infrastructure, --ipam, --extension should be set")
163+
}
164+
providerName = gpo.runtimeExtensionProvider
165+
providerType = clusterctlv1.RuntimeExtensionProviderType
166+
}
147167
if providerName == "" {
148-
return "", "", errors.New("at least one of --core, --bootstrap, --control-plane, --infrastructure should be set")
168+
return "", "", errors.New("at least one of --core, --bootstrap, --control-plane, --infrastructure, --ipam, --extension should be set")
149169
}
150170

151171
return providerName, providerType, nil

0 commit comments

Comments
 (0)