Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
751c461
initial-commit
atulv7 Oct 1, 2025
173895a
rev image registry
atulv7 Oct 1, 2025
f0476c7
fix: lint
atulv7 Oct 2, 2025
501c40c
fix: v1beta2 MachineList
atulv7 Oct 2, 2025
ebf1f8b
fix: feature tests: Failed phase removed
atulv7 Oct 2, 2025
10cbb5b
revert: build e2e
atulv7 Oct 2, 2025
32c9526
test data v1.7.0
atulv7 Oct 3, 2025
e3ecd2d
rev
atulv7 Oct 3, 2025
2f673aa
fix: lint
atulv7 Oct 4, 2025
55c73ce
Merge branch 'main' into issue/av-test
atulv7 Oct 4, 2025
6ca1462
Merge branch 'main' into issue/av-test
atulv7 Oct 7, 2025
442bc2e
merge fix
atulv7 Oct 7, 2025
05ac7c8
Merge remote-tracking branch 'origin/main' into issue/av-test
atulv7 Nov 5, 2025
12068ad
fix: merge issues
atulv7 Nov 5, 2025
b60125d
fix: merge issues
atulv7 Nov 5, 2025
518ef1d
fix: lint
atulv7 Nov 5, 2025
9db742f
Merge branch 'main' into issue/av-test
atulv7 Nov 6, 2025
e15bc07
Merge branch 'main' into issue/av-test
atulv7 Nov 10, 2025
07e731d
fix: added getter and setter for v1beta2 conditions
atulv7 Nov 17, 2025
1f121e3
fix: panic on deleting v1beta2 condition
atulv7 Nov 17, 2025
5cfa548
fix: e2e bumps
atulv7 Nov 18, 2025
74b8e21
fix: e2e kubelet args from map to array
atulv7 Nov 18, 2025
1fad815
fix: fmt makefile
atulv7 Nov 18, 2025
25c5447
fix: array dec
atulv7 Nov 18, 2025
02fadb9
fix: added reasons for conditiontrue v1beta2
atulv7 Nov 18, 2025
efd37a1
revert: build label
atulv7 Nov 18, 2025
6d2b22c
fix: lint
atulv7 Nov 18, 2025
c50c278
Merge branch 'main' into issue/av-test
atulv7 Nov 18, 2025
9ffe558
Merge branch 'main' into issue/av-test
atulv7 Nov 24, 2025
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
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ endif

# PLATFORMS is a list of platforms to build for.
PLATFORMS ?= linux/amd64,linux/arm64,linux/arm
PLATFORMS_E2E ?= linux/amd64
PLATFORMS_E2E ?= linux/amd64,linux/arm64,linux/arm

# KIND_CLUSTER_NAME is the name of the kind cluster to use.
KIND_CLUSTER_NAME ?= capi-test
Expand Down Expand Up @@ -290,8 +290,8 @@ undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/confi
.PHONY: cluster-e2e-templates
cluster-e2e-templates: cluster-e2e-templates-v1beta1 cluster-e2e-templates-v171 ## Generate cluster templates for all versions

cluster-e2e-templates-v171: ## Generate cluster templates for CAPX v1.7.1
kustomize build $(NUTANIX_E2E_TEMPLATES)/v1.7.1/cluster-template --load-restrictor LoadRestrictionsNone > $(NUTANIX_E2E_TEMPLATES)/v1.7.1/cluster-template.yaml
cluster-e2e-templates-v171: ## Generate cluster templates for CAPX v1.7.2
kustomize build $(NUTANIX_E2E_TEMPLATES)/v1.7.2/cluster-template --load-restrictor LoadRestrictionsNone > $(NUTANIX_E2E_TEMPLATES)/v1.7.2/cluster-template.yaml

cluster-e2e-templates-v1beta1: ## Generate cluster templates for v1beta1
kustomize build $(NUTANIX_E2E_TEMPLATES)/v1beta1/cluster-template --load-restrictor LoadRestrictionsNone > $(NUTANIX_E2E_TEMPLATES)/v1beta1/cluster-template.yaml
Expand Down
29 changes: 17 additions & 12 deletions api/v1beta1/conditions.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@ limitations under the License.

package v1beta1

import capiv1 "sigs.k8s.io/cluster-api/api/v1beta1"
import capiv1beta1 "sigs.k8s.io/cluster-api/api/core/v1beta1" //nolint:staticcheck // suppress complaining on Deprecated package

const (
Succeeded = "Succeeded"

DeletionFailed = "DeletionFailed"

VolumeGroupDetachFailed = "VolumeGroupDetachFailed"
Expand All @@ -28,17 +30,20 @@ const (
const (
// FailureDomainSafeForDeletionCondition indicates whether the failure domain object is safe for deletion,
// ie., when it is not used or referenced by other resources
FailureDomainSafeForDeletionCondition capiv1.ConditionType = "FailureDomainSafeForDeletion"
FailureDomainSafeForDeletionCondition capiv1beta1.ConditionType = "FailureDomainSafeForDeletion"

// FailureDomainInUseReason indicates that the failure domain is used by
// Machines and/or referenced by cluster
FailureDomainInUseReason = "FailureDomainInUse"

// NoFailureDomainsConfiguredCondition indicates no failure domains have been configured
NoFailureDomainsConfiguredCondition capiv1.ConditionType = "NoFailureDomainsConfigured"
NoFailureDomainsConfiguredCondition capiv1beta1.ConditionType = "NoFailureDomainsConfigured"

// FailureDomainsValidatedCondition indicates whether the failure domains are configured correctly or not.
FailureDomainsValidatedCondition capiv1.ConditionType = "FailureDomainsValidated"
FailureDomainsValidatedCondition capiv1beta1.ConditionType = "FailureDomainsValidated"

// FailureDomainsValidatedCondition indicates that the failure domains are being validated.
FailureDomainsValidationInProgressReason = "FailureDomainsValidationInProgress"

// FailureDomainsMisconfiguredReason (Severity=Warning) indicates that some of the failure domains
// are misconfigured.
Expand All @@ -47,16 +52,16 @@ const (

const (
// ClusterCategoryCreatedCondition indicates the status of the category linked to the NutanixCluster
ClusterCategoryCreatedCondition capiv1.ConditionType = "ClusterCategoryCreated"
ClusterCategoryCreatedCondition capiv1beta1.ConditionType = "ClusterCategoryCreated"

ClusterCategoryCreationFailed = "ClusterCategoryCreationFailed"
)

const (
// PrismCentralClientCondition indicates the status of the client used to connect to Prism Central
PrismCentralClientCondition capiv1.ConditionType = "PrismClientInit"
PrismCentralV4ClientCondition capiv1.ConditionType = "PrismClientV4Init"
PrismCentralConvergedV4ClientCondition capiv1.ConditionType = "PrismClientConvergedV4Init"
PrismCentralClientCondition capiv1beta1.ConditionType = "PrismClientInit"
PrismCentralV4ClientCondition capiv1beta1.ConditionType = "PrismClientV4Init"
PrismCentralConvergedV4ClientCondition capiv1beta1.ConditionType = "PrismClientConvergedV4Init"

PrismCentralClientInitializationFailed = "PrismClientInitFailed"
PrismCentralV4ClientInitializationFailed = "PrismClientV4InitFailed"
Expand All @@ -65,12 +70,12 @@ const (

const (
// VMProvisionedCondition shows the status of the VM provisioning process
VMProvisionedCondition capiv1.ConditionType = "VMProvisioned"
VMProvisionedCondition capiv1beta1.ConditionType = "VMProvisioned"

VMProvisionedTaskFailed = "FailedVMTask"

// VMAddressesAssignedCondition shows the status of the process of assigning the VM addresses
VMAddressesAssignedCondition capiv1.ConditionType = "VMAddressesAssigned"
VMAddressesAssignedCondition capiv1beta1.ConditionType = "VMAddressesAssigned"

VMAddressesFailed = "VMAddressesFailed"
VMBootTypeInvalid = "VMBootTypeInvalid"
Expand All @@ -81,14 +86,14 @@ const (

const (
// VMAddressesAssignedCondition shows the status of the process of assigning the VMs to a project
ProjectAssignedCondition capiv1.ConditionType = "ProjectAssigned"
ProjectAssignedCondition capiv1beta1.ConditionType = "ProjectAssigned"

ProjectAssignationFailed = "ProjectAssignationFailed"
)

const (
// CredentialRefSecretOwnerSetCondition shows the status of setting the Owner
CredentialRefSecretOwnerSetCondition capiv1.ConditionType = "CredentialRefSecretOwnerSet"
CredentialRefSecretOwnerSetCondition capiv1beta1.ConditionType = "CredentialRefSecretOwnerSet"

CredentialRefSecretOwnerSetFailed = "CredentialRefSecretOwnerSetFailed"
TrustBundleSecretOwnerSetCondition = "TrustBundleSecretOwnerSet"
Expand Down
44 changes: 38 additions & 6 deletions api/v1beta1/nutanixcluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (
credentialTypes "github.com/nutanix-cloud-native/prism-go-client/environment/credentials"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
capiv1 "sigs.k8s.io/cluster-api/api/v1beta1"
capiv1beta1 "sigs.k8s.io/cluster-api/api/core/v1beta1" //nolint:staticcheck // suppress complaining on Deprecated package
)

const (
Expand Down Expand Up @@ -52,7 +52,7 @@ type NutanixClusterSpec struct {
// ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.
// host can be either DNS name or ip address
// +optional
ControlPlaneEndpoint capiv1.APIEndpoint `json:"controlPlaneEndpoint"`
ControlPlaneEndpoint capiv1beta1.APIEndpoint `json:"controlPlaneEndpoint"`

// prismCentral holds the endpoint address and port to access the Nutanix Prism Central.
// When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy.
Expand Down Expand Up @@ -90,11 +90,11 @@ type NutanixClusterStatus struct {

// failureDomains are a list of failure domains configured in the
// cluster's spec and validated by the cluster controller.
FailureDomains capiv1.FailureDomains `json:"failureDomains,omitempty"`
FailureDomains capiv1beta1.FailureDomains `json:"failureDomains,omitempty"`

// Conditions defines current service state of the NutanixCluster.
// +optional
Conditions capiv1.Conditions `json:"conditions,omitempty"`
Conditions capiv1beta1.Conditions `json:"conditions,omitempty"`

// Will be set in case of failure of Cluster instance
// +optional
Expand All @@ -103,6 +103,22 @@ type NutanixClusterStatus struct {
// Will be set in case of failure of Cluster instance
// +optional
FailureMessage *string `json:"failureMessage,omitempty"`

// v1beta2 groups all the fields that will be added or modified in NutanixCluster's status with the V1Beta2 version.
// +optional
V1Beta2 *NutanixClusterV1Beta2Status `json:"v1beta2,omitempty"`
}

// NutanixClusterV1Beta2Status groups all the fields that will be added or modified in NutanixClusterStatus with the V1Beta2 version.
// See https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more context.
type NutanixClusterV1Beta2Status struct {
// conditions represents the observations of a NutanixCluster's current state.
// Known condition types are Ready, FailureDomainsReady, VCenterAvailable, ClusterModulesReady and Paused.
// +optional
// +listType=map
// +listMapKey=type
// +kubebuilder:validation:MaxItems=32
Conditions []metav1.Condition `json:"conditions,omitempty"`
}

// +kubebuilder:object:root=true
Expand Down Expand Up @@ -156,15 +172,31 @@ type NutanixFailureDomainConfig struct {
}

// GetConditions returns the set of conditions for this object.
func (ncl *NutanixCluster) GetConditions() capiv1.Conditions {
func (ncl *NutanixCluster) GetConditions() capiv1beta1.Conditions {
return ncl.Status.Conditions
}

// SetConditions sets the conditions on this object.
func (ncl *NutanixCluster) SetConditions(conditions capiv1.Conditions) {
func (ncl *NutanixCluster) SetConditions(conditions capiv1beta1.Conditions) {
ncl.Status.Conditions = conditions
}

// GetV1Beta2Conditions returns the set of v1beta2 conditions for this object.
func (ncl *NutanixCluster) GetV1Beta2Conditions() []metav1.Condition {
if ncl.Status.V1Beta2 == nil {
return nil
}
return ncl.Status.V1Beta2.Conditions
}

// SetV1Beta2Conditions sets the v1beta2 conditions on this object.
func (ncl *NutanixCluster) SetV1Beta2Conditions(conditions []metav1.Condition) {
if ncl.Status.V1Beta2 == nil {
ncl.Status.V1Beta2 = &NutanixClusterV1Beta2Status{}
}
ncl.Status.V1Beta2.Conditions = conditions
}

func (ncl *NutanixCluster) GetPrismCentralCredentialRef() (*credentialTypes.NutanixCredentialReference, error) {
prismCentralInfo := ncl.Spec.PrismCentral
if prismCentralInfo == nil {
Expand Down
34 changes: 33 additions & 1 deletion api/v1beta1/nutanixfailuredomain_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ package v1beta1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
capiv1 "sigs.k8s.io/cluster-api/api/v1beta1"
capiv1 "sigs.k8s.io/cluster-api/api/core/v1beta1" //nolint:staticcheck // suppress complaining on Deprecated package
)

const (
Expand Down Expand Up @@ -52,6 +52,22 @@ type NutanixFailureDomainStatus struct {
// conditions represent the latest states of the failure domain.
// +optional
Conditions []capiv1.Condition `json:"conditions,omitempty"`

// v1beta2 groups all the fields that will be added or modified in NutanixCluster's status with the V1Beta2 version.
// +optional
V1Beta2 *NutanixFailureDomainV1Beta2Status `json:"v1beta2,omitempty"`
}

// NutanixFailureDomainV1Beta2Status groups all the fields that will be added or modified in NutanixClusterStatus with the V1Beta2 version.
// See https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more context.
type NutanixFailureDomainV1Beta2Status struct {
// conditions represents the observations of a NutanixFailureDomain's current state.
// Known condition types are Ready, FailureDomainsReady, VCenterAvailable, ClusterModulesReady and Paused.
// +optional
// +listType=map
// +listMapKey=type
// +kubebuilder:validation:MaxItems=32
Conditions []metav1.Condition `json:"conditions,omitempty"`
}

// +kubebuilder:object:root=true
Expand Down Expand Up @@ -79,6 +95,22 @@ func (nfd *NutanixFailureDomain) SetConditions(conditions capiv1.Conditions) {
nfd.Status.Conditions = conditions
}

// GetV1Beta2Conditions returns the set of conditions for this object.
func (ncl *NutanixFailureDomain) GetV1Beta2Conditions() []metav1.Condition {
if ncl.Status.V1Beta2 == nil {
return nil
}
return ncl.Status.V1Beta2.Conditions
}

// SetV1Beta2Conditions sets the v1beta2 conditions on this object.
func (ncl *NutanixFailureDomain) SetV1Beta2Conditions(conditions []metav1.Condition) {
if ncl.Status.V1Beta2 == nil {
ncl.Status.V1Beta2 = &NutanixFailureDomainV1Beta2Status{}
}
ncl.Status.V1Beta2.Conditions = conditions
}

// +kubebuilder:object:root=true

// NutanixFailureDomainList contains a list of NutanixFailureDomain
Expand Down
34 changes: 33 additions & 1 deletion api/v1beta1/nutanixmachine_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import (
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
capiv1 "sigs.k8s.io/cluster-api/api/v1beta1"
capiv1 "sigs.k8s.io/cluster-api/api/core/v1beta1" //nolint:staticcheck // suppress complaining on Deprecated package
)

// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
Expand Down Expand Up @@ -281,6 +281,22 @@ type NutanixMachineStatus struct {
// failureDomain is the name of the failure domain where this Machine has been placed in.
// +optional
FailureDomain *string `json:"failureDomain,omitempty"`

// v1beta2 groups all the fields that will be added or modified in NutanixMachine's status with the V1Beta2 version.
// +optional
V1Beta2 *NutanixMachineV1Beta2Status `json:"v1beta2,omitempty"`
}

// NutanixMachineV1Beta2Status groups all the fields that will be added or modified in NutanixClusterStatus with the V1Beta2 version.
// See https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more context.
type NutanixMachineV1Beta2Status struct {
// conditions represents the observations of a NutanixMachine's current state.
// Known condition types are Ready, FailureDomainsReady, VCenterAvailable, ClusterModulesReady and Paused.
// +optional
// +listType=map
// +listMapKey=type
// +kubebuilder:validation:MaxItems=32
Conditions []metav1.Condition `json:"conditions,omitempty"`
}

// +kubebuilder:object:root=true
Expand Down Expand Up @@ -310,6 +326,22 @@ func (nm *NutanixMachine) SetConditions(conditions capiv1.Conditions) {
nm.Status.Conditions = conditions
}

// GetV1Beta2Conditions returns the set of conditions for this object.
func (ncl *NutanixMachine) GetV1Beta2Conditions() []metav1.Condition {
if ncl.Status.V1Beta2 == nil {
return nil
}
return ncl.Status.V1Beta2.Conditions
}

// SetV1Beta2Conditions sets the v1beta2 conditions on this object.
func (ncl *NutanixMachine) SetV1Beta2Conditions(conditions []metav1.Condition) {
if ncl.Status.V1Beta2 == nil {
ncl.Status.V1Beta2 = &NutanixMachineV1Beta2Status{}
}
ncl.Status.V1Beta2.Conditions = conditions
}

//+kubebuilder:object:root=true

// NutanixMachineList contains a list of NutanixMachine
Expand Down
2 changes: 1 addition & 1 deletion api/v1beta1/nutanixmachinetemplate_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ package v1beta1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
capiv1 "sigs.k8s.io/cluster-api/api/v1beta1"
capiv1 "sigs.k8s.io/cluster-api/api/core/v1beta1" //nolint:staticcheck // suppress complaining on Deprecated package
)

// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
Expand Down
2 changes: 1 addition & 1 deletion api/v1beta1/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"k8s.io/client-go/kubernetes/scheme"
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta1" //nolint:staticcheck // suppress complaining on Deprecated package
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/envtest"
logf "sigs.k8s.io/controller-runtime/pkg/log"
Expand Down
Loading
Loading