Skip to content

Commit

Permalink
feat(OscVm): add userdata on nodes for tags usage
Browse files Browse the repository at this point in the history
  • Loading branch information
sebglon committed Jun 21, 2024
1 parent cce9bad commit a0d8690
Show file tree
Hide file tree
Showing 22 changed files with 197 additions and 81 deletions.
44 changes: 22 additions & 22 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ GIT_USEREMAIL ?= [email protected]
K8S_VERSION ?= v1.26.2
LOG_TAIL ?= -1
CAPI_VERSION ?= v1.1.4
CAPI_NAMESPACE ?= capi-kubeadm-bootstrap-system
CAPO_NAMESPACE ?= cluster-api-provider-outscale-system
CAPI_NAMESPACE ?= capi-kubeadm-bootstrap-system
CAPO_NAMESPACE ?= cluster-api-provider-outscale-system
# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
ENVTEST_K8S_VERSION = 1.23
MINIMUM_KUBEBUILDERTOOL_VERSION=1.24.1
Expand All @@ -44,7 +44,7 @@ MINIMUM_CLUSTERCTL_VERSION=1.4.4
MIN_GO_VERSION=1.18.7
MINIMUM_TILT_VERSION=0.25.3
MINIMUM_PACKER_VERSION=1.8.1
MINIMUM_CONTROLLER_GEN_VERSION=0.8.0
MINIMUM_CONTROLLER_GEN_VERSION=0.8.0
MINIMUM_GH_VERSION=2.12.1
MINIMUM_KIND_USE_VERSION=v0.14.0
MINIMUM_ENVTEST_VERSION=1.23.3
Expand Down Expand Up @@ -134,7 +134,7 @@ vet: ## Run go vet against code.
go vet ./...

.PHONY: format
format: gofmt gospace yamlspace yamlfmt
format: gofmt gospace yamlspace yamlfmt

gofmt: ## Run gofmt
find . -name "*.go" | grep -v "\/vendor\/" | xargs gofmt -s -w
Expand All @@ -156,7 +156,7 @@ checkfmt: ## check gofmt
./check-gofmt

.PHONY: unit-test
unit-test:
unit-test:
go test -v -coverprofile=covers.out ./controllers
go tool cover -func=covers.out -o covers.txt
go tool cover -html=covers.out -o covers.html
Expand All @@ -173,7 +173,7 @@ testenv: cloud-init-secret
USE_EXISTING_CLUSTER=true OSC_REGION=${OSC_REGION} IMG_UPGRADE_FROM=${IMG_UPGRADE_FROM} go test -v -coverprofile=covers.out ./testenv/ -ginkgo.v -ginkgo.progress -test.v -test.timeout 30m

.PHONY: testclean
testclean:
testclean:
USE_EXISTING_CLUSTER=true go test -v -coverprofile=covers.out ./testclean/ -clusterToClean=${ClusterToClean} -ginkgo.v -ginkgo.progress -test.v

.PHONY: e2e-conf-file
Expand All @@ -190,7 +190,7 @@ e2etestexistingcluster: envsubst e2e-conf-class-file ccm-file

.PHONY: e2etestkind
e2etestkind: envsubst e2e-conf-class-file ccm-file
USE_EXISTING_CLUSTER=false IMG=${IMG} OSC_SUBREGION_NAME=${OSC_SUBREGION_NAME} IMG_UPGRADE_FROM=${IMG_UPGRADE_FROM} IMG_UPGRADE_TO=${IMG_UPGRADE_TO} go test -v -coverprofile=covers.out ./test/e2e -test.timeout 180m -e2e.use-existing-cluster=false -ginkgo.v -ginkgo.skip=".*feature.*|.*conformance.*|.*basic.*" -ginkgo.focus=".*first_upgrade.*" -e2e.validate-stack=false -ginkgo.progress -test.v -e2e.artifacts-folder=${PWD}/artifact -e2e.use-cni=true -e2e.use-ccm=true -e2e.config=$(E2E_CONF_CLASS_FILE)
USE_EXISTING_CLUSTER=false IMG=${IMG} OSC_SUBREGION_NAME=${OSC_SUBREGION_NAME} IMG_UPGRADE_FROM=${IMG_UPGRADE_FROM} IMG_UPGRADE_TO=${IMG_UPGRADE_TO} go test -v -coverprofile=covers.out ./test/e2e -test.timeout 180m -e2e.use-existing-cluster=false -ginkgo.v -ginkgo.skip=".*feature.*|.*conformance.*|.*basic.*" -ginkgo.focus=".*first_upgrade.*" -e2e.validate-stack=false -ginkgo.progress -test.v -e2e.artifacts-folder=${PWD}/artifact -e2e.use-cni=true -e2e.use-ccm=true -e2e.config=$(E2E_CONF_CLASS_FILE)

.PHONY: e2econformance
e2econformance: envsubst e2e-conf-class-file ccm-file
Expand Down Expand Up @@ -247,7 +247,7 @@ docker-build: # Build docker image with the manager

.PHONY: docker-buildx
docker-buildx: # Build docker image with the manager
docker buildx build --build-arg VERSION=$(VERSION) --load -t ${IMG} .
docker buildx build --platform=linux/amd64 --build-arg VERSION=$(VERSION) --load -t ${IMG} .

.PHONY: docker-build-dev
docker-build-dev: ## Generate and Build docker image with the manager
Expand Down Expand Up @@ -285,7 +285,7 @@ ifndef KUSTOMIZE
$(LOCAL_KUSTOMIZE) build config/default | $(ENVSUBST) | kubectl apply -f -
else
cd config/default && $(KUSTOMIZE) edit set image controller=${IMG}
$(KUSTOMIZE) build config/default | $(ENVSUBST) | kubectl apply -f -
$(KUSTOMIZE) build config/default | $(ENVSUBST) | kubectl apply -f -
endif

.PHONY: credential
Expand All @@ -295,7 +295,7 @@ credential: ## Set Credentials

.PHONY: clusterclass
clusterclass: envsubst ## Set Clusterclass
@cat ./example/cluster-class.yaml | $(ENVSUBST)| kubectl apply -f -
@cat ./example/cluster-class.yaml | $(ENVSUBST)| kubectl apply -f -

.PHONY: logs-capo
logs-capo: ## Get logs capo
Expand Down Expand Up @@ -357,7 +357,7 @@ release_dir:
mkdir -p $(RELEASE_DIR)/

.PHONY: clean-release
clean-release:
clean-release:
rm -rf $(RELEASE_DIR)

.PHONY: release
Expand All @@ -374,11 +374,11 @@ else
$(KUSTOMIZE) build config/default | $(ENVSUBST) > out/infrastructure-components.yaml
endif
.PHONY: release-templates
release-templates:
release-templates:
cp templates/cluster-template* $(RELEASE_DIR)/

.PHONY: release-binary
release-binary:
.PHONY: release-binary
release-binary:
docker run \
--rm \
-e CGO_ENABLED=0 \
Expand All @@ -391,7 +391,7 @@ release-binary:
-o $(RELEASE_DIR)/$(notdir $(RELEASE_BINARY))-$(GOOS)-$(GOARCH) $(RELEASE_BINARY)

.PHONY: release-tag
release-tag:
release-tag:
docker tag $(IMG) $(IMG_RELEASE)
docker push $(IMG_RELEASE)

Expand All @@ -404,13 +404,13 @@ check-release-tag: ## Check if the release tag is set
@if [ -z "${RELEASE_TAG}" ]; then echo "RELEASE_TAG is not set"; exit 1; fi

.PHONY: check-github-token
check-github-token:
check-github-token:
@if [ -z "${SECRET_GITHUB_TOKEN}" ]; then echo "GITHUB_TOKEN is not set"; exit 1; fi

.PHONY: gh-login
gh-login: gh check-github-token
cat <<< "${SECRET_GITHUB_TOKEN}" | $(GH) auth login --with-token

GH = $(shell pwd)/bin/gh

.PHONY: release-changelog
Expand All @@ -424,7 +424,7 @@ create-gh-release: gh
CONTROLLER_GEN = $(shell pwd)/bin/controller-gen
.PHONY: controller-gen
controller-gen: ## Download controller-gen
GOPATH=$(GET_GOPATH) MINIMUM_CONTROLLER_GEN_VERSION=${MINIMUM_CONTROLLER_GEN_VERSION} ./hack/ensure-controller-gen.sh
GOPATH=$(GET_GOPATH) MINIMUM_CONTROLLER_GEN_VERSION=${MINIMUM_CONTROLLER_GEN_VERSION} ./hack/ensure-controller-gen.sh

LOCAL_CLUSTERCTL ?= $(shell pwd)/bin/clusterctl
.PHONY: install-clusterctl
Expand Down Expand Up @@ -457,7 +457,7 @@ install-yamlfmt: ## donwload yaml fmt

.PHONY: install-gh
install-gh: ## Download gh
GOPATH=$(GET_GOPATH) MINIMUM_GH_VERSION=$(MINIMUM_GH_VERSION) ./hack/ensure-gh.sh
GOPATH=$(GET_GOPATH) MINIMUM_GH_VERSION=$(MINIMUM_GH_VERSION) ./hack/ensure-gh.sh

.PHONY: install-kind
install-kind: ## Download kind
Expand Down Expand Up @@ -518,15 +518,15 @@ mockgen: ## Download mockgen locally if necessary.
ENVSUBST = $(shell pwd)/bin/envsubst
.PHONY: envsubst
envsubst: ## Download envsubst
GOPATH=${GET_GOPATH} ./hack/ensure-envsubst.sh
GOPATH=${GET_GOPATH} ./hack/ensure-envsubst.sh

GH = $(shell pwd)/bin/gh
.PHONY: gh
gh: ## Download gh
GOPATH=${GET_GOPATH} MINIMUM_GH_VERSION=$(MINIMUM_GH_VERSION) ./hack/ensure-gh.sh


install-dev-prerequisites: ## Install clusterctl, controller-gen, envsubst, envtest, gh, go, helm, kind, kubectl, kustomize, packer, til

install-dev-prerequisites: ## Install clusterctl, controller-gen, envsubst, envtest, gh, go, helm, kind, kubectl, kustomize, packer, til
@echo "Start install all depencies"
$(MAKE) install-clusterctl
$(MAKE) controller-gen
Expand Down
10 changes: 10 additions & 0 deletions api/v1beta1/oscmachine_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,16 @@ func (m *OscMachine) ValidateUpdate(oldRaw runtime.Object) error {
)
}

oscMachineLog.Info("validate update old userData", "old tags", old.Spec.Node.Vm.Tags)
oscMachineLog.Info("validate update userData", "tags", m.Spec.Node.Vm.Tags)

if len(old.Spec.Node.Vm.Tags) > 0 && !reflect.DeepEqual(m.Spec.Node.Vm.Tags, old.Spec.Node.Vm.Tags) {
allErrs = append(allErrs,
field.Invalid(field.NewPath("spec", "userData"),
m.Spec.Node.Vm.SubregionName, "field is immutable"),
)
}

oscMachineLog.Info("validate update old subnetName", "old subnetName", old.Spec.Node.Vm.SubnetName)
oscMachineLog.Info("validate update subnetName", "subnetName", m.Spec.Node.Vm.SubnetName)

Expand Down
3 changes: 2 additions & 1 deletion api/v1beta1/oscmachinetemplate_webhook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ func TestOscMachineTemplate_ValidateCreate(t *testing.T) {
KeypairName: "test-webhook",
DeviceName: "/dev/xvdb",
VmType: "tinav3.c2r4p2",
Tags: map[string]string{"key1": "value1"},
},
},
},
Expand Down Expand Up @@ -321,7 +322,7 @@ func TestOscMachineTemplate_ValidateUpdate(t *testing.T) {
},
},
},
expValidateUpdateErr: fmt.Errorf("OscMachineTemplate.infrastructure.cluster.x-k8s.io \"webhook-test\" is invalid: OscMachineTemplate.spec.template.spec: Invalid value: v1beta1.OscMachineTemplate{TypeMeta:v1.TypeMeta{Kind:\"\", APIVersion:\"\"}, ObjectMeta:v1.ObjectMeta{Name:\"webhook-test\", GenerateName:\"\", Namespace:\"default\", SelfLink:\"\", UID:\"\", ResourceVersion:\"\", Generation:0, CreationTimestamp:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletionTimestamp:<nil>, DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string(nil), ManagedFields:[]v1.ManagedFieldsEntry(nil)}, Spec:v1beta1.OscMachineTemplateSpec{Template:v1beta1.OscMachineTemplateResource{ObjectMeta:v1beta1.ObjectMeta{Labels:map[string]string(nil), Annotations:map[string]string(nil)}, Spec:v1beta1.OscMachineSpec{ProviderID:(*string)(nil), Node:v1beta1.OscNode{Vm:v1beta1.OscVm{Name:\"\", ImageId:\"ami-00000000\", KeypairName:\"test-webhook-2\", VmType:\"tinav3.c2r4p2\", VolumeName:\"\", VolumeDeviceName:\"\", DeviceName:\"/dev/xvda\", SubnetName:\"\", RootDisk:v1beta1.OscRootDisk{RootDiskIops:0, RootDiskSize:0, RootDiskType:\"\"}, LoadBalancerName:\"\", PublicIpName:\"\", PublicIp:false, SubregionName:\"\", PrivateIps:[]v1beta1.OscPrivateIpElement(nil), SecurityGroupNames:[]v1beta1.OscSecurityGroupElement(nil), ResourceId:\"\", Role:\"\", ClusterName:\"\", Replica:0}, Image:v1beta1.OscImage{Name:\"\", ResourceId:\"\"}, Volumes:[]*v1beta1.OscVolume(nil), KeyPair:v1beta1.OscKeypair{Name:\"\", PublicKey:\"\", ResourceId:\"\", ClusterName:\"\", DeleteKeypair:false}, ClusterName:\"\"}}}}, Status:v1beta1.OscMachineTemplateStatus{Capacity:v1.ResourceList(nil), Conditions:v1beta1.Conditions(nil)}}: OscMachineTemplate spec.template.spec field is immutable."),
expValidateUpdateErr: fmt.Errorf("OscMachineTemplate.infrastructure.cluster.x-k8s.io \"webhook-test\" is invalid: OscMachineTemplate.spec.template.spec: Invalid value: v1beta1.OscMachineTemplate{TypeMeta:v1.TypeMeta{Kind:\"\", APIVersion:\"\"}, ObjectMeta:v1.ObjectMeta{Name:\"webhook-test\", GenerateName:\"\", Namespace:\"default\", SelfLink:\"\", UID:\"\", ResourceVersion:\"\", Generation:0, CreationTimestamp:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletionTimestamp:<nil>, DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string(nil), ManagedFields:[]v1.ManagedFieldsEntry(nil)}, Spec:v1beta1.OscMachineTemplateSpec{Template:v1beta1.OscMachineTemplateResource{ObjectMeta:v1beta1.ObjectMeta{Labels:map[string]string(nil), Annotations:map[string]string(nil)}, Spec:v1beta1.OscMachineSpec{ProviderID:(*string)(nil), Node:v1beta1.OscNode{Vm:v1beta1.OscVm{Name:\"\", ImageId:\"ami-00000000\", KeypairName:\"test-webhook-2\", VmType:\"tinav3.c2r4p2\", VolumeName:\"\", VolumeDeviceName:\"\", DeviceName:\"/dev/xvda\", SubnetName:\"\", RootDisk:v1beta1.OscRootDisk{RootDiskIops:0, RootDiskSize:0, RootDiskType:\"\"}, LoadBalancerName:\"\", PublicIpName:\"\", PublicIp:false, SubregionName:\"\", PrivateIps:[]v1beta1.OscPrivateIpElement(nil), SecurityGroupNames:[]v1beta1.OscSecurityGroupElement(nil), ResourceId:\"\", Role:\"\", ClusterName:\"\", Replica:0, Tags:map[string]string(nil)}, Image:v1beta1.OscImage{Name:\"\", ResourceId:\"\"}, Volumes:[]*v1beta1.OscVolume(nil), KeyPair:v1beta1.OscKeypair{Name:\"\", PublicKey:\"\", ResourceId:\"\", ClusterName:\"\", DeleteKeypair:false}, ClusterName:\"\"}}}}, Status:v1beta1.OscMachineTemplateStatus{Capacity:v1.ResourceList(nil), Conditions:v1beta1.Conditions(nil)}}: OscMachineTemplate spec.template.spec field is immutable."),
},
}
for _, mtc := range machineTestCases {
Expand Down
1 change: 1 addition & 0 deletions api/v1beta1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,7 @@ type OscVm struct {
Role string `json:"role,omitempty"`
ClusterName string `json:"clusterName,omitempty"`
Replica int32 `json:"replica,omitempty"`
Tags map[string]string `json:"tags,omitempty"`
}

type OscBastion struct {
Expand Down
7 changes: 7 additions & 0 deletions api/v1beta1/zz_generated.deepcopy.go

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

4 changes: 4 additions & 0 deletions cloud/scope/machinetemplate.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"context"
"errors"
"fmt"

"github.com/go-logr/logr"
infrastructurev1beta1 "github.com/outscale-dev/cluster-api-provider-outscale.git/api/v1beta1"
corev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -103,6 +104,9 @@ func (m *MachineTemplateScope) PatchObject() error {
func (m *MachineTemplateScope) GetVmType() string {
return m.OscMachineTemplate.Spec.Template.Spec.Node.Vm.VmType
}
func (m *MachineTemplateScope) GetTags() map[string]string {
return m.OscMachineTemplate.Spec.Template.Spec.Node.Vm.Tags
}

func (m *MachineTemplateScope) GetReplica() int32 {
return m.OscMachineTemplate.Spec.Template.Spec.Node.Vm.Replica
Expand Down
8 changes: 4 additions & 4 deletions cloud/services/compute/mock_compute/vm_mock.go

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

10 changes: 6 additions & 4 deletions cloud/services/compute/vm.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
infrastructurev1beta1 "github.com/outscale-dev/cluster-api-provider-outscale.git/api/v1beta1"
"github.com/outscale-dev/cluster-api-provider-outscale.git/cloud/scope"
tag "github.com/outscale-dev/cluster-api-provider-outscale.git/cloud/tag"
"github.com/outscale-dev/cluster-api-provider-outscale.git/cloud/utils"
"github.com/outscale-dev/cluster-api-provider-outscale.git/util/reconciler"
osc "github.com/outscale/osc-sdk-go/v2"
corev1 "k8s.io/api/core/v1"
Expand All @@ -40,7 +41,7 @@ import (

//go:generate ../../../bin/mockgen -destination mock_compute/vm_mock.go -package mock_compute -source ./vm.go
type OscVmInterface interface {
CreateVm(machineScope *scope.MachineScope, spec *infrastructurev1beta1.OscVm, subnetId string, securityGroupIds []string, privateIps []string, vmName string) (*osc.Vm, error)
CreateVm(machineScope *scope.MachineScope, spec *infrastructurev1beta1.OscVm, subnetId string, securityGroupIds []string, privateIps []string, vmName string, tags map[string]string) (*osc.Vm, error)
CreateVmUserData(userData string, spec *infrastructurev1beta1.OscBastion, subnetId string, securityGroupIds []string, privateIps []string, vmName string, imageId string) (*osc.Vm, error)
DeleteVm(vmId string) error
GetVm(vmId string) (*osc.Vm, error)
Expand All @@ -62,7 +63,7 @@ func ValidateIpAddrInCidr(ipAddr string, cidr string) (string, error) {
}

// CreateVm create machine vm
func (s *Service) CreateVm(machineScope *scope.MachineScope, spec *infrastructurev1beta1.OscVm, subnetId string, securityGroupIds []string, privateIps []string, vmName string) (*osc.Vm, error) {
func (s *Service) CreateVm(machineScope *scope.MachineScope, spec *infrastructurev1beta1.OscVm, subnetId string, securityGroupIds []string, privateIps []string, vmName string, tags map[string]string) (*osc.Vm, error) {
imageId := spec.ImageId
keypairName := spec.KeypairName
vmType := spec.VmType
Expand All @@ -79,7 +80,8 @@ func (s *Service) CreateVm(machineScope *scope.MachineScope, spec *infrastructur
if err != nil {
return nil, fmt.Errorf("%w failed to decode bootstrap data", err)
}
bootstrapDataEnc := b64.StdEncoding.EncodeToString([]byte(bootstrapData))
mergedUserData := utils.ConvertsTagsToUserDataOutscaleSection(tags) + bootstrapData
mergedUserDataEnc := b64.StdEncoding.EncodeToString([]byte(mergedUserData))
rootDisk := osc.BlockDeviceMappingVmCreation{
Bsu: &osc.BsuToCreate{
VolumeType: &rootDiskType,
Expand All @@ -97,7 +99,7 @@ func (s *Service) CreateVm(machineScope *scope.MachineScope, spec *infrastructur
VmType: &vmType,
SubnetId: &subnetId,
SecurityGroupIds: &securityGroupIds,
UserData: &bootstrapDataEnc,
UserData: &mergedUserDataEnc,
BlockDeviceMappings: &[]osc.BlockDeviceMappingVmCreation{
rootDisk,
},
Expand Down
36 changes: 36 additions & 0 deletions cloud/utils/utils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
Copyright YEAR 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 utils

import (
"bytes"
"fmt"
)

func ConvertsTagsToUserDataOutscaleSection(tags map[string]string) string {
if len(tags) == 0 {
return ""
}
b := new(bytes.Buffer)
fmt.Fprintln(b, "-----BEGIN OUTSCALE SECTION-----")
fmt.Fprintln(b, "filter_private_section=true")
for key, value := range tags {
fmt.Fprintf(b, "%s=%s\n", key, value)
}
fmt.Fprintln(b, "-----END OUTSCALE SECTION-----")
return b.String()
}
34 changes: 34 additions & 0 deletions cloud/utils/utils_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
Copyright YEAR 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 utils

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestConvertsTagsToUserDataOutscaleSection(t *testing.T) {
assert.Equal(t, "", ConvertsTagsToUserDataOutscaleSection(map[string]string{}))

expected := `-----BEGIN OUTSCALE SECTION-----
filter_private_section=true
key1=value1
-----END OUTSCALE SECTION-----
`
assert.Equal(t, expected, ConvertsTagsToUserDataOutscaleSection(map[string]string{"key1": "value1"}))
}
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.14.1-0.20240115102117-74ee87047478
controller-gen.kubebuilder.io/version: v0.15.0
name: oscclusters.infrastructure.cluster.x-k8s.io
spec:
group: infrastructure.cluster.x-k8s.io
Expand Down
Loading

0 comments on commit a0d8690

Please sign in to comment.