Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

implement machine controller #21

Merged
merged 110 commits into from
Jan 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
e1190f9
add api resources and tests
lubedacht Jan 3, 2024
b56a505
adds test and license header
lubedacht Jan 8, 2024
2b86e68
satisfy sonarcloud
lubedacht Jan 8, 2024
2cbc010
add tilt settings
lubedacht Jan 8, 2024
2a60b29
add type for enum values
lubedacht Jan 8, 2024
ddbe510
Implement LAN provisioning (#22)
gfariasalves-ionos Jan 9, 2024
0358f12
update boilerplate license header and files
lubedacht Jan 9, 2024
9c14e76
update manifests
lubedacht Jan 9, 2024
88d422e
fix license header in file
lubedacht Jan 9, 2024
4ff0574
run tidy
lubedacht Jan 9, 2024
5c0e5f2
tidy after rebase
lubedacht Jan 9, 2024
9cfe071
removed pkg folder
lubedacht Jan 9, 2024
0e924e5
Refactor LAN Provisioning
gfariasalves-ionos Jan 10, 2024
09be88b
updated lan creation logic
lubedacht Jan 10, 2024
e2bdee6
Refactor LAN deletion reconciliation
gfariasalves-ionos Jan 11, 2024
e05cd01
remove comment
lubedacht Jan 11, 2024
f5b6462
fix typo
lubedacht Jan 11, 2024
274c3c4
adds linter fixes
lubedacht Jan 11, 2024
f4844bd
update go.sum
lubedacht Jan 11, 2024
16f84e6
additional linter fixes
lubedacht Jan 11, 2024
1dd8e33
Make the linter happy
gfariasalves-ionos Jan 11, 2024
f46c5c3
Make the method switch A E S T H E T I C
gfariasalves-ionos Jan 11, 2024
30b3210
Remove break from empty switch case
gfariasalves-ionos Jan 11, 2024
d9640bd
add revive rule to enforce LAN as acronym
lubedacht Jan 11, 2024
a5fef56
Updates from PR
lubedacht Jan 12, 2024
3f1d056
make boot disk required
lubedacht Jan 12, 2024
01cd5ca
tests, tests and more tests for MachineController types
gfariasalves-ionos Jan 12, 2024
12625c9
test SSH keys
lubedacht Jan 15, 2024
8a0bfa7
recreate manifests
lubedacht Jan 15, 2024
ded89ce
Naming
lubedacht Jan 15, 2024
b9d5f76
linting fixes and compiler error fix
lubedacht Jan 15, 2024
0663b42
fixed IONOS naming
lubedacht Jan 15, 2024
5b3e358
update comment
lubedacht Jan 15, 2024
f3efe5c
add timeout context and comment
lubedacht Jan 15, 2024
4045d51
fix url naming
lubedacht Jan 15, 2024
78709a8
constant naming
lubedacht Jan 15, 2024
816ba3a
renamed API function
lubedacht Jan 15, 2024
643db98
update comments
lubedacht Jan 15, 2024
1ed92cb
unexport function
lubedacht Jan 15, 2024
2fc84c3
unexport api function
lubedacht Jan 15, 2024
d4ac419
lan naming
lubedacht Jan 15, 2024
ce06e61
renamed function to better indicate the purpose
lubedacht Jan 15, 2024
11f51a1
aded default requeue constant
lubedacht Jan 15, 2024
ae0ee97
renamed struct field
lubedacht Jan 15, 2024
529c303
add license header
lubedacht Jan 15, 2024
d19605b
Implement Machine Scope tests
gfariasalves-ionos Jan 15, 2024
87e6767
lint-fix machine_test.go
gfariasalves-ionos Jan 15, 2024
b14ecde
add copyright to machine_test.go
gfariasalves-ionos Jan 15, 2024
182923b
add copyright to machine_test.go (2)
gfariasalves-ionos Jan 15, 2024
6bf54b2
fix license
lubedacht Jan 15, 2024
92dab43
update some tests
gfariasalves-ionos Jan 15, 2024
2328d04
change api function to not return a pointer to a slice
lubedacht Jan 15, 2024
c62e1fa
fixed incorrect initialism naming
lubedacht Jan 15, 2024
ced5cd2
regroup interface function
lubedacht Jan 15, 2024
5d65472
consistent docs
lubedacht Jan 15, 2024
955536c
check for location header in delete function
lubedacht Jan 15, 2024
6a6380f
use template text for error
lubedacht Jan 15, 2024
8092523
inverted comparison
lubedacht Jan 15, 2024
e74e0a8
improve loop
lubedacht Jan 15, 2024
1abb85d
added additional check for multiple LANs of the same name
lubedacht Jan 15, 2024
a9a3ee1
use correct request path
lubedacht Jan 15, 2024
849d9f9
check Targets slice
lubedacht Jan 15, 2024
f03ee4f
call before loop
lubedacht Jan 15, 2024
b7c2732
update logging messages
lubedacht Jan 15, 2024
e05b05c
update logger names
lubedacht Jan 15, 2024
5091316
fix typo
lubedacht Jan 15, 2024
5d1ac9d
wrapped log line into error
lubedacht Jan 15, 2024
1b7ab42
added importas for ionos sdk
lubedacht Jan 15, 2024
a0b76fa
adds tests and updates to API type
lubedacht Jan 16, 2024
d5b638b
unify naming of data center
lubedacht Jan 16, 2024
22f15bb
update manifests
lubedacht Jan 16, 2024
46bb118
logs to uppercase
lubedacht Jan 16, 2024
05dad0f
fix search replace
lubedacht Jan 16, 2024
9ae83d8
more updates
lubedacht Jan 16, 2024
6183238
updates
lubedacht Jan 16, 2024
1c1413f
tidy go.mod
lubedacht Jan 16, 2024
f0366a9
remove duplicate block
lubedacht Jan 16, 2024
1f18ca9
add ptr functions to avoid using k8s utils package
lubedacht Jan 16, 2024
7fca15e
add tests for ptr package
lubedacht Jan 16, 2024
2feff25
linter fixes
lubedacht Jan 16, 2024
bc352a7
add copyright header
lubedacht Jan 16, 2024
78e4231
fix LAN spelling
lubedacht Jan 16, 2024
baba954
remove type overwrite
lubedacht Jan 16, 2024
5c09980
wording update
lubedacht Jan 16, 2024
a7682b3
add test for unique IPs. Update naming
lubedacht Jan 16, 2024
7fca9be
remove test
lubedacht Jan 16, 2024
82af074
update comment
lubedacht Jan 16, 2024
d817e00
Add tests for required fields
piepmatz Jan 16, 2024
273b86f
Improve semantics and structure in API tests a bit
piepmatz Jan 16, 2024
c8aef1b
Move condition tests ouf of validation context
piepmatz Jan 16, 2024
441a5ef
Satisfy the linter
piepmatz Jan 16, 2024
5f69738
redefine network in spec
lubedacht Jan 17, 2024
383b3f4
rename CurrentRequest
lubedacht Jan 17, 2024
1283424
add status test
lubedacht Jan 17, 2024
0f28126
tidy
lubedacht Jan 17, 2024
442a3b1
use len check instead of nil
lubedacht Jan 17, 2024
18e4419
Remove UpdateLAN for now
lubedacht Jan 17, 2024
a58cb86
add tests for cluster status
lubedacht Jan 17, 2024
ededc36
linter be mad bro
lubedacht Jan 17, 2024
589418f
Merge branch 'main' of github.com:ionos-cloud/cluster-api-provider-io…
lubedacht Jan 19, 2024
26a25eb
Implement unit tests for network (LAN) service (#26)
gfariasalves-ionos Jan 19, 2024
703ba4f
patch cluster with owned ready condition
lubedacht Jan 22, 2024
245def9
adds gci to linters
lubedacht Jan 22, 2024
8d6c454
run gci linter
lubedacht Jan 22, 2024
4e30a8e
make use of proper grammar
lubedacht Jan 22, 2024
7476303
remove IONOS
lubedacht Jan 22, 2024
11ed938
enhance error logic in getClusterScope
lubedacht Jan 22, 2024
052f313
mimimimi
lubedacht Jan 22, 2024
3e3224a
Refactor request queue inspection (#33)
piepmatz Jan 23, 2024
3b3321c
Unify "datacenter" spelling
piepmatz Jan 23, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,6 @@ Dockerfile.cross
*.swp
*.swo
*~

# test path for local test programs
/cmd/test/**
23 changes: 23 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ linters:
- dogsled
- errcheck
- exportloopref
- gci
- ginkgolinter
- goconst
- gocritic
- gocyclo
Expand Down Expand Up @@ -34,6 +36,22 @@ linters:
- whitespace

linters-settings:
revive:
rules:
- name: "var-naming"
arguments:
- [] # first list is an allow list. All initialisms placed here will be ignored
- ["LAN"] # second list is a deny list. These rules will be enforced
severity: error
gci:
sections:
- standard
- default
- prefix(github.com/ionos-cloud/cluster-api-provider-ionoscloud)
- blank
- dot


goimports:
local-prefixes: github.com/ionos-cloud/cluster-api-provider-ionoscloud/
ifshort:
Expand Down Expand Up @@ -61,6 +79,8 @@ linters-settings:
# Own module
- pkg: github.com/ionos-cloud/cluster-api-provider-ionoscloud/api/v1alpha1
alias: infrav1
- pkg: github.com/ionos-cloud/sdk-go/v6
alias: sdk
loggercheck:
require-string-key: true
no-printf-like: true
Expand All @@ -83,6 +103,9 @@ issues:
- (Expect directory permissions to be 0750 or less|Expect file permissions to be 0600 or less)
- (G104|G307)
exclude-rules:
- linters:
- gci
path: main\.go
- linters:
- gosec
text: "G108: Profiling endpoint is automatically exposed on /debug/pprof"
Expand Down
2 changes: 1 addition & 1 deletion .mockery.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ packages:
configs:
- filename: "mock_{{ .InterfaceName | snakecase }}.go"
dir: "{{.InterfaceDir}}/clienttest"
outpkg: "client_test"
outpkg: "client_test"
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ To get started with developing, please see [our development docs](./docs/Develop

## License

Copyright 2023 IONOS Cloud.
Copyright 2024 IONOS Cloud.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
2 changes: 1 addition & 1 deletion api/v1alpha1/groupversion_info.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright 2023 IONOS Cloud.
Copyright 2024 IONOS Cloud.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
17 changes: 15 additions & 2 deletions api/v1alpha1/ionoscloudcluster_types.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright 2023 IONOS Cloud.
Copyright 2024 IONOS Cloud.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand All @@ -23,7 +23,7 @@ import (

const (
// ClusterFinalizer allows cleanup of resources, which are
// associated with the IonosCloudCluster before removing it from the apiserver.
// associated with the IonosCloudCluster before removing it from the API server.
ClusterFinalizer = "ionoscloudcluster.infrastructure.cluster.x-k8s.io"

// IonosCloudClusterReady is the condition for the IonosCloudCluster, which indicates that the cluster is ready.
Expand Down Expand Up @@ -54,6 +54,10 @@ type IonosCloudClusterStatus struct {
// Conditions defines current service state of the IonosCloudCluster.
// +optional
Conditions clusterv1.Conditions `json:"conditions,omitempty"`

// CurrentRequestByDatacenter maps data center IDs to a pending provisioning request made during reconciliation.
// +optional
CurrentRequestByDatacenter map[string]ProvisioningRequest `json:"currentRequest,omitempty"`
}

//+kubebuilder:object:root=true
Expand Down Expand Up @@ -93,3 +97,12 @@ func (i *IonosCloudCluster) GetConditions() clusterv1.Conditions {
func (i *IonosCloudCluster) SetConditions(conditions clusterv1.Conditions) {
i.Status.Conditions = conditions
}

// SetCurrentRequest sets the current provisioning request for the given data center.
// This function makes sure that the map is initialized before setting the request.
func (i *IonosCloudCluster) SetCurrentRequest(datacenterID string, request ProvisioningRequest) {
if i.Status.CurrentRequestByDatacenter == nil {
i.Status.CurrentRequestByDatacenter = map[string]ProvisioningRequest{}
}
i.Status.CurrentRequestByDatacenter[datacenterID] = request
}
51 changes: 44 additions & 7 deletions api/v1alpha1/ionoscloudcluster_types_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright 2023 IONOS Cloud.
Copyright 2024 IONOS Cloud.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand All @@ -20,20 +20,22 @@ import (
"context"
"testing"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
"sigs.k8s.io/cluster-api/util/conditions"
"sigs.k8s.io/controller-runtime/pkg/client"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

func TestIonosCloudCluster_Conditions(t *testing.T) {
conditions := clusterv1.Conditions{{Type: "type"}}
conds := clusterv1.Conditions{{Type: "type"}}
cluster := &IonosCloudCluster{}

cluster.SetConditions(conditions)
require.Equal(t, conditions, cluster.GetConditions())
cluster.SetConditions(conds)
require.Equal(t, conds, cluster.GetConditions())
}

func defaultCluster() *IonosCloudCluster {
Expand All @@ -55,7 +57,7 @@ func defaultCluster() *IonosCloudCluster {
var _ = Describe("IonosCloudCluster", func() {
AfterEach(func() {
err := k8sClient.Delete(context.Background(), defaultCluster())
Expect(client.IgnoreNotFound(err)).To(Succeed())
Expect(client.IgnoreNotFound(err)).ToNot(HaveOccurred())
})

Context("Create", func() {
Expand All @@ -73,4 +75,39 @@ var _ = Describe("IonosCloudCluster", func() {
Expect(k8sClient.Update(context.Background(), cluster)).Should(MatchError(ContainSubstring("contractNumber is immutable")))
})
})
Context("Status", func() {
It("should correctly get and set the status", func() {
By("initially having an empty status")

cluster := defaultCluster()
Expect(k8sClient.Create(context.Background(), cluster)).To(Succeed())

key := client.ObjectKey{Namespace: cluster.Namespace, Name: cluster.Name}
fetched := &IonosCloudCluster{}
Expect(k8sClient.Get(context.Background(), key, fetched)).To(Succeed())
Expect(fetched.Status.Ready).To(BeFalse())
Expect(fetched.Status.CurrentRequestByDatacenter).To(BeEmpty())
Expect(fetched.Status.Conditions).To(BeEmpty())

By("retrieving the cluster and setting the status")
fetched.Status.Ready = true
wantProvisionRequest := ProvisioningRequest{
Method: "POST",
RequestPath: "/path/to/resource",
State: RequestStatusQueued,
}
fetched.SetCurrentRequest("123", wantProvisionRequest)
conditions.MarkTrue(fetched, clusterv1.ReadyCondition)

By("updating the cluster status")
Expect(k8sClient.Status().Update(context.Background(), fetched)).To(Succeed())

Expect(k8sClient.Get(context.Background(), key, fetched)).To(Succeed())
Expect(fetched.Status.Ready).To(BeTrue())
Expect(fetched.Status.CurrentRequestByDatacenter).To(HaveLen(1))
Expect(fetched.Status.CurrentRequestByDatacenter["123"]).To(Equal(wantProvisionRequest))
Expect(fetched.Status.Conditions).To(HaveLen(1))
Expect(conditions.IsTrue(fetched, clusterv1.ReadyCondition)).To(BeTrue())
})
})
})
151 changes: 149 additions & 2 deletions api/v1alpha1/ionoscloudmachine_types.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright 2023 IONOS Cloud.
Copyright 2024 IONOS Cloud.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand All @@ -22,12 +22,144 @@ import (
"sigs.k8s.io/cluster-api/errors"
)

const (
// IonosCloudMachineType is the named type for the API object.
IonosCloudMachineType = "IonosCloudMachine"

// MachineFinalizer is the finalizer for the IonosCloudMachine resources.
// It will prevent the deletion of the resource until it was removed by the controller
// to ensure that related cloud resources will be deleted before the IonosCloudMachine resource
// will be removed from the API server.
MachineFinalizer = "ionoscloudmachine.infrastructure.cluster.x-k8s.io"

// MachineProvisionedCondition documents the status of the provisioning of a IonosCloudMachine and
// the underlying VM.
MachineProvisionedCondition clusterv1.ConditionType = "MachineProvisioned"

// WaitingForClusterInfrastructureReason (Severity=Info) indicates that the IonosCloudMachine is currently
// waiting for the cluster infrastructure to become ready.
WaitingForClusterInfrastructureReason = "WaitingForClusterInfrastructure"

// WaitingForBootstrapDataReason (Severity=Info) indicates that the bootstrap provider has not yet finished
// creating the bootstrap data secret and store it in the Cluster API Machine.
WaitingForBootstrapDataReason = "WaitingForBootstrapData"
)

// VolumeDiskType specifies the type of hard disk.
type VolumeDiskType string

const (
// VolumeDiskTypeHDD defines the disk type HDD.
VolumeDiskTypeHDD VolumeDiskType = "HDD"
// VolumeDiskTypeSSDStandard defines the standard SSD disk type.
// This is the same as VolumeDiskTypeSSD.
VolumeDiskTypeSSDStandard VolumeDiskType = "SSD Standard"
// VolumeDiskTypeSSDPremium defines the premium SSD disk type.
VolumeDiskTypeSSDPremium VolumeDiskType = "SSD Premium"
)

// AvailabilityZone is the availability zone where different cloud resources are created in.
type AvailabilityZone string

const (
// AvailabilityZoneAuto automatically selects an availability zone.
AvailabilityZoneAuto AvailabilityZone = "AUTO"
// AvailabilityZoneOne zone 1.
AvailabilityZoneOne AvailabilityZone = "ZONE_1"
// AvailabilityZoneTwo zone 2.
AvailabilityZoneTwo AvailabilityZone = "ZONE_2"
// AvailabilityZoneThree zone 3.
AvailabilityZoneThree AvailabilityZone = "ZONE_3"
)

// IonosCloudMachineSpec defines the desired state of IonosCloudMachine.
type IonosCloudMachineSpec struct {
// ProviderID is the IONOS Cloud provider ID
// will be in the format ionos://ee090ff2-1eef-48ec-a246-a51a33aa4f3a
// +optional
ProviderID string `json:"providerId,omitempty"`
ProviderID string `json:"providerID,omitempty"`

// DatacenterID is the ID of the data center where the machine should be created in.
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="datacenterID is immutable"
// +kubebuilder:validation:Format=uuid
DatacenterID string `json:"datacenterID"`
piepmatz marked this conversation as resolved.
Show resolved Hide resolved

// NumCores defines the number of cores for the VM.
// +kubebuilder:validation:Minimum=1
piepmatz marked this conversation as resolved.
Show resolved Hide resolved
// +kubebuilder:default=1
// +optional
NumCores int32 `json:"numCores,omitempty"`
piepmatz marked this conversation as resolved.
Show resolved Hide resolved

// AvailabilityZone is the availability zone in which the VM should be provisioned.
// +kubebuilder:validation:Enum=AUTO;ZONE_1;ZONE_2
// +kubebuilder:default=AUTO
// +optional
AvailabilityZone AvailabilityZone `json:"availabilityZone,omitempty"`

// MemoryMB is the memory size for the VM in MB.
// Size must be specified in multiples of 256 MB with a minimum of 1024 MB
// which is required as we are using hot-pluggable RAM by default.
// +kubebuilder:validation:MultipleOf=1024
// +kubebuilder:validation:Minimum=2048
// +kubebuilder:default=3072
// +optional
MemoryMB int32 `json:"memoryMB,omitempty"`

// CPUFamily defines the CPU architecture, which will be used for this VM.
// Not all CPU architectures are available in all data centers.
// +kubebuilder:example=AMD_OPTERON
// +kubebuilder:validation:MinLength=1
CPUFamily string `json:"cpuFamily"`
piepmatz marked this conversation as resolved.
Show resolved Hide resolved
avorima marked this conversation as resolved.
Show resolved Hide resolved

// Disk defines the boot volume of the VM.
Disk *Volume `json:"disk"`

// AdditionalNetworks defines the additional network configurations for the VM.
// NOTE(lubedacht): We currently only support networks with DHCP enabled.
// +optional
AdditionalNetworks Networks `json:"additionalNetworks,omitempty"`
}

// Networks contains a list of network configs.
type Networks []Network

// Network contains a network config.
type Network struct {
// NetworkID represents an ID an existing LAN in the data center.
// This LAN will be excluded from the deletion process.
// +kubebuilder:validation:Minimum=1
NetworkID int32 `json:"networkID"`
}

// Volume is the physical storage on the machine.
type Volume struct {
// Name is the name of the volume
// +optional
Name string `json:"name,omitempty"`

// DiskType defines the type of the hard drive.
// +kubebuilder:validation:Enum=HDD;SSD Standard;SSD Premium
// +kubebuilder:default=HDD
// +optional
DiskType VolumeDiskType `json:"diskType,omitempty"`

// SizeGB defines the size of the volume in GB
// +kubebuilder:validation:Minimum=10
// +kubebuilder:default=20
// +optional
SizeGB int `json:"sizeGB,omitempty"`

// AvailabilityZone is the availability zone where the volume will be created.
// +kubebuilder:validation:Enum=AUTO;ZONE_1;ZONE_2;ZONE_3
// +kubebuilder:default=AUTO
// +optional
AvailabilityZone AvailabilityZone `json:"availabilityZone,omitempty"`

// SSHKeys contains a set of public SSH keys which will be added to the
// list of authorized keys.
// +listType=set
piepmatz marked this conversation as resolved.
Show resolved Hide resolved
// +optional
SSHKeys []string `json:"sshKeys,omitempty"`
}

// IonosCloudMachineStatus defines the observed state of IonosCloudMachine.
Expand Down Expand Up @@ -77,6 +209,11 @@ type IonosCloudMachineStatus struct {
// Conditions defines current service state of the IonosCloudMachine.
// +optional
Conditions clusterv1.Conditions `json:"conditions,omitempty"`

// CurrentRequest shows the current provisioning request for any
// cloud resource that is being provisioned.
// +optional
CurrentRequest *ProvisioningRequest `json:"currentRequest,omitempty"`
piepmatz marked this conversation as resolved.
Show resolved Hide resolved
}

//+kubebuilder:object:root=true
Expand All @@ -100,6 +237,16 @@ type IonosCloudMachineList struct {
Items []IonosCloudMachine `json:"items"`
}

// GetConditions returns the observations of the operational state of the IonosCloudMachine resource.
func (m *IonosCloudMachine) GetConditions() clusterv1.Conditions {
return m.Status.Conditions
}

// SetConditions sets the underlying service state of the IonosCloudMachine to the predescribed clusterv1.Conditions.
func (m *IonosCloudMachine) SetConditions(conditions clusterv1.Conditions) {
m.Status.Conditions = conditions
}

func init() {
SchemeBuilder.Register(&IonosCloudMachine{}, &IonosCloudMachineList{})
}
Loading
Loading