Skip to content

Commit

Permalink
chore: bump to capi v1.2.0-rc.0
Browse files Browse the repository at this point in the history
- Upgrade dependencies as required by CAPI
- Migrate OpenStackMachineTemplate webhook as instructed in migration docs
  • Loading branch information
apricote committed Jul 12, 2022
1 parent e38f2d4 commit c8e4035
Show file tree
Hide file tree
Showing 13 changed files with 150 additions and 68 deletions.
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +171,9 @@ e2e-image: docker-build

# Pull all the images references in test/e2e/data/e2e_conf.yaml
test-e2e-image-prerequisites:
docker pull gcr.io/k8s-staging-cluster-api/cluster-api-controller:v1.2.0-beta.1
docker pull gcr.io/k8s-staging-cluster-api/kubeadm-bootstrap-controller:v1.2.0-beta.1
docker pull gcr.io/k8s-staging-cluster-api/kubeadm-control-plane-controller:v1.2.0-beta.1
docker pull gcr.io/k8s-staging-cluster-api/cluster-api-controller:v1.2.0-rc.0
docker pull gcr.io/k8s-staging-cluster-api/kubeadm-bootstrap-controller:v1.2.0-rc.0
docker pull gcr.io/k8s-staging-cluster-api/kubeadm-control-plane-controller:v1.2.0-rc.0
docker pull quay.io/jetstack/cert-manager-cainjector:v1.8.2
docker pull quay.io/jetstack/cert-manager-webhook:v1.8.2
docker pull quay.io/jetstack/cert-manager-controller:v1.8.2
Expand Down
49 changes: 36 additions & 13 deletions api/v1alpha6/openstackmachinetemplate_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,59 +17,82 @@ limitations under the License.
package v1alpha6

import (
"context"
"fmt"
"reflect"

apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/validation/field"
"sigs.k8s.io/cluster-api/util/topology"
"sigs.k8s.io/controller-runtime/pkg/builder"
"sigs.k8s.io/controller-runtime/pkg/manager"
"sigs.k8s.io/controller-runtime/pkg/webhook"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
)

// OpenStackMachineTemplateImmutableMsg ...
const OpenStackMachineTemplateImmutableMsg = "OpenStackMachineTemplate spec.template.spec field is immutable. Please create a new resource instead. Ref doc: https://cluster-api.sigs.k8s.io/tasks/change-machine-template.html"

func (r *OpenStackMachineTemplate) SetupWebhookWithManager(mgr manager.Manager) error {
// +kubebuilder:object:generate=false
type OpenStackMachineTemplateWebhook struct{}

func (r *OpenStackMachineTemplateWebhook) SetupWebhookWithManager(mgr manager.Manager) error {
return builder.WebhookManagedBy(mgr).
For(r).
For(&OpenStackMachineTemplate{}).
WithValidator(r).
Complete()
}

// +kubebuilder:webhook:verbs=create;update,path=/validate-infrastructure-cluster-x-k8s-io-v1alpha6-openstackmachinetemplate,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=infrastructure.cluster.x-k8s.io,resources=openstackmachinetemplates,versions=v1alpha6,name=validation.openstackmachinetemplate.infrastructure.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1beta1

var _ webhook.Validator = &OpenStackMachineTemplate{}
var _ webhook.CustomValidator = &OpenStackMachineTemplateWebhook{}

// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type.
func (r *OpenStackMachineTemplateWebhook) ValidateCreate(ctx context.Context, obj runtime.Object) error {
openStackMachineTemplate, ok := obj.(*OpenStackMachineTemplate)
if !ok {
return apierrors.NewBadRequest(fmt.Sprintf("expected an OpenStackMachineTemplate but got a %T", obj))
}

// ValidateCreate implements webhook.Validator so a webhook will be registered for the type.
func (r *OpenStackMachineTemplate) ValidateCreate() error {
var allErrs field.ErrorList

if r.Spec.Template.Spec.ProviderID != nil {
if openStackMachineTemplate.Spec.Template.Spec.ProviderID != nil {
allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "template", "spec", "providerID"), "cannot be set in templates"))
}

return aggregateObjErrors(r.GroupVersionKind().GroupKind(), r.Name, allErrs)
return aggregateObjErrors(openStackMachineTemplate.GroupVersionKind().GroupKind(), openStackMachineTemplate.Name, allErrs)
}

// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
func (r *OpenStackMachineTemplate) ValidateUpdate(oldRaw runtime.Object) error {
// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type.
func (r *OpenStackMachineTemplateWebhook) ValidateUpdate(ctx context.Context, oldRaw runtime.Object, newRaw runtime.Object) error {
var allErrs field.ErrorList
old, ok := oldRaw.(*OpenStackMachineTemplate)
if !ok {
return apierrors.NewBadRequest(fmt.Sprintf("expected an OpenStackMachineTemplate but got a %T", oldRaw))
}

if !reflect.DeepEqual(r.Spec.Template.Spec, old.Spec.Template.Spec) {
newObj, ok := newRaw.(*OpenStackMachineTemplate)
if !ok {
return apierrors.NewBadRequest(fmt.Sprintf("expected an OpenStackMachineTemplate but got a %T", oldRaw))
}

req, err := admission.RequestFromContext(ctx)
if err != nil {
return apierrors.NewBadRequest(fmt.Sprintf("expected a admission.Request inside context: %v", err))
}

if !topology.ShouldSkipImmutabilityChecks(req, newObj) &&
!reflect.DeepEqual(newObj.Spec.Template.Spec, old.Spec.Template.Spec) {
allErrs = append(allErrs,
field.Invalid(field.NewPath("spec", "template", "spec"), r, OpenStackMachineTemplateImmutableMsg),
)
}

return aggregateObjErrors(r.GroupVersionKind().GroupKind(), r.Name, allErrs)
return aggregateObjErrors(newObj.GroupVersionKind().GroupKind(), newObj.Name, allErrs)
}

// ValidateDelete implements webhook.Validator so a webhook will be registered for the type.
func (r *OpenStackMachineTemplate) ValidateDelete() error {
// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type.
func (r *OpenStackMachineTemplateWebhook) ValidateDelete(_ context.Context, _ runtime.Object) error {
return nil
}
69 changes: 68 additions & 1 deletion api/v1alpha6/openstackmachinetemplate_webhook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,15 @@ limitations under the License.
package v1alpha6

import (
"context"
"testing"

. "github.com/onsi/gomega"
admissionv1 "k8s.io/api/admission/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/utils/pointer"
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
)

func TestOpenStackMachineTemplate_ValidateUpdate(t *testing.T) {
Expand All @@ -30,6 +35,7 @@ func TestOpenStackMachineTemplate_ValidateUpdate(t *testing.T) {
name string
oldTemplate *OpenStackMachineTemplate
newTemplate *OpenStackMachineTemplate
req *admission.Request
wantErr bool
}{
{
Expand All @@ -54,6 +60,7 @@ func TestOpenStackMachineTemplate_ValidateUpdate(t *testing.T) {
},
},
},
req: &admission.Request{},
wantErr: true,
},
{
Expand Down Expand Up @@ -84,12 +91,72 @@ func TestOpenStackMachineTemplate_ValidateUpdate(t *testing.T) {
Name: "bar",
},
},
req: &admission.Request{},
},
{
name: "don't allow modification, dry run, no skip immutability annotation set",
oldTemplate: &OpenStackMachineTemplate{
Spec: OpenStackMachineTemplateSpec{
Template: OpenStackMachineTemplateResource{
Spec: OpenStackMachineSpec{
Flavor: "foo",
Image: "bar",
},
},
},
},
newTemplate: &OpenStackMachineTemplate{
Spec: OpenStackMachineTemplateSpec{
Template: OpenStackMachineTemplateResource{
Spec: OpenStackMachineSpec{
Flavor: "foo",
Image: "NewImage",
},
},
},
},
req: &admission.Request{AdmissionRequest: admissionv1.AdmissionRequest{DryRun: pointer.Bool(true)}},
wantErr: true,
},
{
name: "allow modification, dry run, skip immutability annotation set",
oldTemplate: &OpenStackMachineTemplate{
Spec: OpenStackMachineTemplateSpec{
Template: OpenStackMachineTemplateResource{
Spec: OpenStackMachineSpec{
Flavor: "foo",
Image: "bar",
},
},
},
},
newTemplate: &OpenStackMachineTemplate{
ObjectMeta: metav1.ObjectMeta{
Annotations: map[string]string{
clusterv1.TopologyDryRunAnnotation: "",
},
},
Spec: OpenStackMachineTemplateSpec{
Template: OpenStackMachineTemplateResource{
Spec: OpenStackMachineSpec{
Flavor: "foo",
Image: "NewImage",
},
},
},
},
req: &admission.Request{AdmissionRequest: admissionv1.AdmissionRequest{DryRun: pointer.Bool(true)}},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
err := tt.newTemplate.ValidateUpdate(tt.oldTemplate)

webhook := &OpenStackMachineTemplateWebhook{}
ctx := admission.NewContextWithRequest(context.Background(), *tt.req)

err := webhook.ValidateUpdate(ctx, tt.oldTemplate, tt.newTemplate)
if tt.wantErr {
g.Expect(err).To(HaveOccurred())
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.8.0
controller-gen.kubebuilder.io/version: v0.9.2
creationTimestamp: null
name: openstackclusters.infrastructure.cluster.x-k8s.io
spec:
Expand Down Expand Up @@ -114,6 +114,7 @@ spec:
the secret name must be unique.
type: string
type: object
x-kubernetes-map-type: atomic
configDrive:
description: Config Drive support
type: boolean
Expand Down Expand Up @@ -341,6 +342,7 @@ spec:
the secret name must be unique.
type: string
type: object
x-kubernetes-map-type: atomic
required:
- flavor
type: object
Expand All @@ -360,6 +362,7 @@ spec:
name must be unique.
type: string
type: object
x-kubernetes-map-type: atomic
controlPlaneAvailabilityZones:
description: ControlPlaneAvailabilityZones is the az to deploy control
plane to
Expand Down Expand Up @@ -5931,9 +5934,3 @@ spec:
storage: true
subresources:
status: {}
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.8.0
controller-gen.kubebuilder.io/version: v0.9.2
creationTimestamp: null
name: openstackclustertemplates.infrastructure.cluster.x-k8s.io
spec:
Expand Down Expand Up @@ -2153,9 +2153,3 @@ spec:
type: object
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.8.0
controller-gen.kubebuilder.io/version: v0.9.2
creationTimestamp: null
name: openstackmachines.infrastructure.cluster.x-k8s.io
spec:
Expand Down Expand Up @@ -79,6 +79,7 @@ spec:
name must be unique.
type: string
type: object
x-kubernetes-map-type: atomic
configDrive:
description: Config Drive support
type: boolean
Expand Down Expand Up @@ -302,6 +303,7 @@ spec:
name must be unique.
type: string
type: object
x-kubernetes-map-type: atomic
required:
- flavor
type: object
Expand Down Expand Up @@ -1746,9 +1748,3 @@ spec:
storage: true
subresources:
status: {}
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.8.0
controller-gen.kubebuilder.io/version: v0.9.2
creationTimestamp: null
name: openstackmachinetemplates.infrastructure.cluster.x-k8s.io
spec:
Expand Down Expand Up @@ -66,6 +66,7 @@ spec:
the secret name must be unique.
type: string
type: object
x-kubernetes-map-type: atomic
configDrive:
description: Config Drive support
type: boolean
Expand Down Expand Up @@ -293,6 +294,7 @@ spec:
the secret name must be unique.
type: string
type: object
x-kubernetes-map-type: atomic
required:
- flavor
type: object
Expand Down Expand Up @@ -1552,9 +1554,3 @@ spec:
type: object
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ require (
k8s.io/component-base v0.24.2
k8s.io/klog/v2 v2.60.1
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9
sigs.k8s.io/cluster-api v1.2.0-beta.1
sigs.k8s.io/cluster-api/test v1.2.0-beta.1
sigs.k8s.io/controller-runtime v0.12.2
sigs.k8s.io/cluster-api v1.2.0-rc.0
sigs.k8s.io/cluster-api/test v1.2.0-rc.0
sigs.k8s.io/controller-runtime v0.12.3
sigs.k8s.io/yaml v1.3.0
)

Expand Down Expand Up @@ -126,4 +126,4 @@ require (
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
)

replace sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.0-beta.1
replace sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.0-rc.0
Loading

0 comments on commit c8e4035

Please sign in to comment.