Skip to content

Commit

Permalink
Merge pull request #492 from Danil-Grigorev/runtime-extension-provider
Browse files Browse the repository at this point in the history
✨ Add RuntimeExtension provider
  • Loading branch information
k8s-ci-robot committed Apr 18, 2024
2 parents a6eeda6 + c07240c commit 59e1588
Show file tree
Hide file tree
Showing 18 changed files with 3,465 additions and 34 deletions.
61 changes: 61 additions & 0 deletions api/v1alpha2/runtimeextensionprovider_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
Copyright 2024 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package v1alpha2

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// RuntimeExtensionProviderSpec defines the desired state of RuntimeExtensionProvider.
type RuntimeExtensionProviderSpec struct {
ProviderSpec `json:",inline"`
}

// RuntimeExtensionProviderStatus defines the observed state of RuntimeExtensionProvider.
type RuntimeExtensionProviderStatus struct {
ProviderStatus `json:",inline"`
}

// +kubebuilder:object:root=true
// +kubebuilder:resource:path=runtimeextensionproviders,shortName=carep,scope=Namespaced
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:name="InstalledVersion",type="string",JSONPath=".status.installedVersion"
// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].status"
// +kubebuilder:storageversion

// RuntimeExtensionProvider is the Schema for the RuntimeExtensionProviders API.
type RuntimeExtensionProvider struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`

Spec RuntimeExtensionProviderSpec `json:"spec,omitempty"`
Status RuntimeExtensionProviderStatus `json:"status,omitempty"`
}

// +kubebuilder:object:root=true

// RuntimeExtensionProviderList contains a list of RuntimeExtensionProviders.
type RuntimeExtensionProviderList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []RuntimeExtensionProvider `json:"items"`
}

func init() {
ProviderLists = append(ProviderLists, &RuntimeExtensionProviderList{})
Providers = append(Providers, &RuntimeExtensionProvider{})
}
61 changes: 61 additions & 0 deletions api/v1alpha2/runtimeextensionprovider_wrapper.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
Copyright 2024 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package v1alpha2

import (
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
)

var _ GenericProvider = &RuntimeExtensionProvider{}

func (p *RuntimeExtensionProvider) GetConditions() clusterv1.Conditions {
return p.Status.Conditions
}

func (p *RuntimeExtensionProvider) SetConditions(conditions clusterv1.Conditions) {
p.Status.Conditions = conditions
}

func (p *RuntimeExtensionProvider) GetSpec() ProviderSpec {
return p.Spec.ProviderSpec
}

func (p *RuntimeExtensionProvider) SetSpec(in ProviderSpec) {
p.Spec.ProviderSpec = in
}

func (p *RuntimeExtensionProvider) GetStatus() ProviderStatus {
return p.Status.ProviderStatus
}

func (p *RuntimeExtensionProvider) SetStatus(in ProviderStatus) {
p.Status.ProviderStatus = in
}

func (p *RuntimeExtensionProvider) GetType() string {
return "runtimeextension"
}

func (p *RuntimeExtensionProviderList) GetItems() []GenericProvider {
providers := []GenericProvider{}

for index := range p.Items {
providers = append(providers, &p.Items[index])
}

return providers
}
91 changes: 91 additions & 0 deletions api/v1alpha2/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,16 @@ func setupReconcilers(mgr ctrl.Manager) {
os.Exit(1)
}

if err := (&providercontroller.GenericProviderReconciler{
Provider: &operatorv1.RuntimeExtensionProvider{},
ProviderList: &operatorv1.RuntimeExtensionProviderList{},
Client: mgr.GetClient(),
Config: mgr.GetConfig(),
}).SetupWithManager(mgr, concurrency(concurrencyNumber)); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "RuntimeExtensionProvider")
os.Exit(1)
}

if err := (&healtchcheckcontroller.ProviderHealthCheckReconciler{
Client: mgr.GetClient(),
}).SetupWithManager(mgr, concurrency(concurrencyNumber)); err != nil {
Expand Down Expand Up @@ -308,6 +318,11 @@ func setupWebhooks(mgr ctrl.Manager) {
setupLog.Error(err, "unable to create webhook", "webhook", "IPAMProvider")
os.Exit(1)
}

if err := (&webhook.RuntimeExtensionProviderWebhook{}).SetupWebhookWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create webhook", "webhook", "RuntimeExtensionProvider")
os.Exit(1)
}
}

func concurrency(c int) controller.Options {
Expand Down
31 changes: 16 additions & 15 deletions cmd/plugin/cmd/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,18 @@ import (
)

type deleteOptions struct {
kubeconfig string
kubeconfigContext string
coreProvider bool
bootstrapProviders []string
controlPlaneProviders []string
infrastructureProviders []string
ipamProviders []string
addonProviders []string
// runtimeExtensionProviders []string
includeNamespace bool
includeCRDs bool
deleteAll bool
kubeconfig string
kubeconfigContext string
coreProvider bool
bootstrapProviders []string
controlPlaneProviders []string
infrastructureProviders []string
ipamProviders []string
addonProviders []string
runtimeExtensionProviders []string
includeNamespace bool
includeCRDs bool
deleteAll bool
}

var deleteOpts = &deleteOptions{}
Expand Down Expand Up @@ -127,8 +127,8 @@ func init() {
"ControlPlane provider and namespace (e.g. kubeadm:<namespace>) to delete from the management cluster")
deleteCmd.Flags().StringSliceVar(&deleteOpts.ipamProviders, "ipam", nil,
"IPAM provider and namespace (e.g. infoblox:<namespace>) to delete from the management cluster")
// deleteCmd.Flags().StringSliceVar(&deleteOpts.runtimeExtensionProviders, "runtime-extension", nil,
// "Runtime extension providers and versions (e.g. test:v0.0.1) to delete from the management cluster")
deleteCmd.Flags().StringSliceVar(&deleteOpts.runtimeExtensionProviders, "runtime-extension", nil,
"Runtime extension providers and namespace (e.g. my-runtime-ex:<namespace>) to delete from the management cluster")
deleteCmd.Flags().StringSliceVar(&deleteOpts.addonProviders, "addon", nil,
"Add-on providers and versions (e.g. helm:<namespace>) to delete from the management cluster")

Expand Down Expand Up @@ -177,7 +177,8 @@ func runDelete() error {
group.delete(&operatorv1.ControlPlaneProviderList{}, deleteOpts.controlPlaneProviders...),
group.delete(&operatorv1.InfrastructureProviderList{}, deleteOpts.infrastructureProviders...),
group.delete(&operatorv1.IPAMProviderList{}, deleteOpts.ipamProviders...),
group.delete(&operatorv1.AddonProviderList{}, deleteOpts.addonProviders...))
group.delete(&operatorv1.AddonProviderList{}, deleteOpts.addonProviders...),
group.delete(&operatorv1.RuntimeExtensionProviderList{}, deleteOpts.runtimeExtensionProviders...))

if deleteOpts.coreProvider {
errors = append(errors, group.delete(&operatorv1.CoreProviderList{}, []string{""}...))
Expand Down
48 changes: 31 additions & 17 deletions cmd/plugin/cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,20 +41,20 @@ import (
)

type initOptions struct {
kubeconfig string
kubeconfigContext string
operatorVersion string
coreProvider string
bootstrapProviders []string
controlPlaneProviders []string
infrastructureProviders []string
ipamProviders []string
// runtimeExtensionProviders []string
addonProviders []string
targetNamespace string
configSecret string
waitProviders bool
waitProviderTimeout int
kubeconfig string
kubeconfigContext string
operatorVersion string
coreProvider string
bootstrapProviders []string
controlPlaneProviders []string
infrastructureProviders []string
ipamProviders []string
runtimeExtensionProviders []string
addonProviders []string
targetNamespace string
configSecret string
waitProviders bool
waitProviderTimeout int
}

const (
Expand Down Expand Up @@ -141,8 +141,8 @@ func init() {
"Control plane providers and versions (e.g. kubeadm:v1.1.5) to add to the management cluster. If unspecified, the Kubeadm control plane provider's latest release is used.")
initCmd.PersistentFlags().StringSliceVar(&initOpts.ipamProviders, "ipam", nil,
"IPAM providers and versions (e.g. infoblox:v0.0.1) to add to the management cluster.")
// initCmd.PersistentFlags().StringSliceVar(&initOpts.runtimeExtensionProviders, "runtime-extension", nil,
// "Runtime extension providers and versions (e.g. test:v0.0.1) to add to the management cluster.")
initCmd.PersistentFlags().StringSliceVar(&initOpts.runtimeExtensionProviders, "runtime-extension", nil,
"Runtime extension providers and versions (e.g. my-extension:v0.0.1) to add to the management cluster.")
initCmd.PersistentFlags().StringSliceVar(&initOpts.addonProviders, "addon", []string{},
"Add-on providers and versions (e.g. helm:v0.1.0) to add to the management cluster.")
initCmd.Flags().StringVarP(&initOpts.targetNamespace, "target-namespace", "n", "capi-operator-system",
Expand Down Expand Up @@ -305,7 +305,21 @@ func initProviders(ctx context.Context, client ctrlclient.Client, initOpts *init
continue
}

return fmt.Errorf("cannot create addon provider: %w", err)
return fmt.Errorf("cannot create IPAM provider: %w", err)
}

createdProviders = append(createdProviders, provider)
}

// Deploy Runtime Extension Providers.
for _, runtimeExtension := range initOpts.runtimeExtensionProviders {
provider, err := createGenericProvider(ctx, client, clusterctlv1.RuntimeExtensionProviderType, runtimeExtension, initOpts.targetNamespace, configSecretName, configSecretNamespace)
if err != nil {
if apierrors.IsAlreadyExists(err) {
continue
}

return fmt.Errorf("cannot create runtime extension provider: %w", err)
}

createdProviders = append(createdProviders, provider)
Expand Down
7 changes: 7 additions & 0 deletions cmd/plugin/cmd/init_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,13 @@ func getGenericProvider(ctx context.Context, client ctrlclient.Client, providerK
return nil, err
}

return provider, nil
case "RuntimExtensionProvider":
provider := &operatorv1.RuntimeExtensionProvider{}
if err := client.Get(ctx, types.NamespacedName{Name: providerName, Namespace: providerNamespace}, provider); err != nil {
return nil, err
}

return provider, nil
default:
return nil, fmt.Errorf("failed to cast interface for type: %s", providerKind)
Expand Down
4 changes: 3 additions & 1 deletion cmd/plugin/cmd/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,9 @@ func NewGenericProvider(providerType clusterctlv1.ProviderType) operatorv1.Gener
return &operatorv1.InfrastructureProvider{}
case clusterctlv1.AddonProviderType:
return &operatorv1.AddonProvider{}
case clusterctlv1.IPAMProviderType, clusterctlv1.RuntimeExtensionProviderType, clusterctlv1.ProviderTypeUnknown:
case clusterctlv1.RuntimeExtensionProviderType:
return &operatorv1.RuntimeExtensionProvider{}
case clusterctlv1.IPAMProviderType, clusterctlv1.ProviderTypeUnknown:
panic(fmt.Sprintf("unsupported provider type %s", providerType))
default:
panic(fmt.Sprintf("unknown provider type %s", providerType))
Expand Down
Loading

0 comments on commit 59e1588

Please sign in to comment.