-
Notifications
You must be signed in to change notification settings - Fork 52
SPLAT-2410: Introduce Cluster API for OpenShift Installations on vSphere #455
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
base: main
Are you sure you want to change the base?
Conversation
|
Pipeline controller notification For optional jobs, comment This repository is configured in: LGTM mode |
|
@AnnaZivkovic: This pull request references SPLAT-2410 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
📝 WalkthroughWalkthroughAdds vSphere platform support across the migration tool: registers vSphere scheme, extends controllers to recognize and handle VSphere infra, implements bidirectional MAPI↔CAPI vSphere conversions and providerSpec parsing/serialization, adds v1beta2 condition helpers, and introduces extensive unit and fuzz tests for vSphere paths. Changes
Sequence Diagram(s)sequenceDiagram
participant Admin as Administrator
participant CAPI as CAPI (VSphereMachine / Template)
participant MigCtrl as Migration Controller
participant C2M as CAPI→MAPI Converter
participant MAPI as MAPI (Machine / ProviderSpec)
participant Cluster as Target Cluster
Admin->>CAPI: Create/Modify CAPI VSphere resources
CAPI->>MigCtrl: Controller watch / reconcile
MigCtrl->>C2M: FromMachineAndVSphereMachineAndVSphereCluster(...)
C2M->>C2M: Parse CAPV spec (networks, disks, clone, workspace)
C2M->>MAPI: Emit MAPI Machine + ProviderSpec
MigCtrl->>Cluster: Apply MAPI Machine
Cluster->>Admin: Provisioning outcome
sequenceDiagram
participant Admin as Administrator
participant Cluster as MAPI (Machine with vSphere ProviderSpec)
participant SyncCtrl as Sync Controller
participant Parser as ProviderSpec Parser
participant M2C as MAPI→CAPI Converter
participant CAPI as CAPI (VSphereMachine / Template)
Admin->>Cluster: Create MAPI Machine with vSphere ProviderSpec
Cluster->>SyncCtrl: Controller reconcile
SyncCtrl->>Parser: ProviderSpecFromRawExtension(...)
Parser->>M2C: vSphere provider parsed
M2C->>M2C: Build VSphereMachine and Template, validate
M2C->>CAPI: Return CAPI Machine + Template
SyncCtrl->>CAPI: Create/Update CAPI resources
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 golangci-lint (2.5.0)Error: can't load config: unsupported version of the configuration: "" See https://golangci-lint.run/docs/product/migration-guide for migration instructions Comment |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
@AnnaZivkovic: This pull request references SPLAT-2410 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
🤖 Fix all issues with AI agents
In `@pkg/controllers/machinesetsync/machineset_sync_controller.go`:
- Around line 395-400: The loop that appends pointers uses &template (range
variable) which causes pointer aliasing so every entry in outdatedTemplates
points to the same item; change the iteration to index-based access (e.g., for i
:= range list.Items { tmpl := &list.Items[i]; if tmpl.GetName() !=
newInfraMachineTemplateName { outdatedTemplates = append(outdatedTemplates,
tmpl) } }) for the VSphereMachineTemplateList case and make the identical change
in the AWS, IBMPowerVS, and OpenStack cases so you take the address of the slice
element (list.Items[i]) instead of the range variable.
In `@pkg/conversion/mapi2capi/vsphere.go`:
- Around line 130-135: The code dereferences v.infrastructure in the error path;
change the block to compute a nil-safe infraName before calling field.Invalid
(e.g. infraName := ""; if v.infrastructure != nil { infraName =
v.infrastructure.Status.InfrastructureName }) and then call errs = append(errs,
field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"),
infraName, "infrastructure cannot be nil and
infrastructure.Status.InfrastructureName cannot be empty")); keep the existing
else branch that sets capiMachine.Spec.ClusterName and
capiMachine.Labels[clusterv1.ClusterNameLabel] unchanged.
- Around line 197-203: The code dereferences v.infrastructure without checking
for nil when building the field.Invalid error and when assigning cluster fields;
change the logic to first check nil before accessing Status.InfrastructureName
(e.g., evaluate infraName only after confirming v.infrastructure != nil) and use
that safe value for the field.Invalid call and in the assignments to
capiMachineSet.Spec.Template.Spec.ClusterName, capiMachineSet.Spec.ClusterName,
and capiMachineSet.Labels[clusterv1.ClusterNameLabel]; ensure the nil branch
appends the error and the non-nil branch performs the assignments.
In `@pkg/util/conditions.go`:
- Around line 147-159: The docstring for GetConditionStatusFromInfraObject
contradicts the implementation: the code (and inline comment) call
GetConditionStatus (v1beta1) first, then fall back to GetV1Beta2ConditionStatus
(v1beta2); update the function comment to state it tries v1beta1 first (AWS,
Azure, GCP, etc.) and then falls back to v1beta2 (vSphere/newer providers), and
adjust any inline comment to match this behavior so documentation and
implementation are consistent.
🧹 Nitpick comments (4)
pkg/conversion/capi2mapi/vsphere_test.go (1)
348-399: Consider expanding MachineSet test coverage.The MachineSet conversion test table has only a single base configuration entry, while the Machine conversion tests cover many scenarios (clone modes, data disks, network configurations, etc.). Since
ToMachineSetinternally calls the Machine conversion logic, the core paths are tested, but adding a few more MachineSet-specific scenarios (e.g., with different replica counts, failure domains, or template variations) could improve confidence in the integration.pkg/conversion/capi2mapi/vsphere_fuzz_test.go (1)
142-189: Consider extracting shared spec normalization logic.The normalization logic in the
VSphereMachineSpecfuzzer (lines 142-189) andVSphereMachineTemplateSpecfuzzer (lines 210-254) is nearly identical. The only difference is that the template fuzzer accesses fields viaspec.Template.Spec.*instead ofspec.*.While acceptable for fuzz tests, extracting a shared helper function could reduce maintenance burden if fields need to be added or removed in the future.
Also applies to: 210-254
pkg/conversion/capi2mapi/vsphere.go (1)
202-206: Remove commented-out code artifacts.These lines appear to be leftover development artifacts that should be cleaned up before merging:
- Line 202-203: Commented TODO about delete policy
- Line 205: Incomplete comment about labels
🧹 Proposed fix
mapiMachineSet.Spec.Template.ObjectMeta.Annotations = mapiMachine.ObjectMeta.Annotations mapiMachineSet.Spec.Template.ObjectMeta.Labels = mapiMachine.ObjectMeta.Labels - //// todo: jcallen: afaik the default delete policy is empty - //mapiMachineSet.Spec.DeletePolicy = "" - - //mapiMachineSet.Spec.Template.ObjectMeta.Labels[] - return mapiMachineSet, warnings, nilpkg/conversion/mapi2capi/vsphere.go (1)
399-408: Consider warning on unknown clone mode values.The function silently defaults to
FullClonefor any unrecognized clone mode value. While defaulting is reasonable, this could mask configuration errors or unexpected values.Consider logging a warning or returning it in the warnings slice when an unexpected value is encountered.
💡 Example approach
// To add warning capability, change the function signature: func convertMAPICloneModeToCAPI(mapiMode mapiv1beta1.CloneMode) (vspherev1.CloneMode, []string) { switch mapiMode { case mapiv1beta1.FullClone: return vspherev1.FullClone, nil case mapiv1beta1.LinkedClone: return vspherev1.LinkedClone, nil case "": return vspherev1.FullClone, nil default: return vspherev1.FullClone, []string{fmt.Sprintf("unknown clone mode %q, defaulting to FullClone", mapiMode)} } }
| case *vspherev1.VSphereMachineTemplateList: | ||
| for _, template := range list.Items { | ||
| if template.GetName() != newInfraMachineTemplateName { | ||
| outdatedTemplates = append(outdatedTemplates, &template) | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
# First, let's check the file and the specific lines mentioned
head -n 410 pkg/controllers/machinesetsync/machineset_sync_controller.go | tail -n 20Repository: openshift/cluster-capi-operator
Length of output: 942
🏁 Script executed:
# Let's also get more context around those lines to understand the full function
sed -n '380,410p' pkg/controllers/machinesetsync/machineset_sync_controller.goRepository: openshift/cluster-capi-operator
Length of output: 1320
🏁 Script executed:
# Search for similar patterns with other platform types (aws, azure, etc.)
rg -A 5 "for _, .* := range list\.Items" pkg/controllers/machinesetsync/ -A 3Repository: openshift/cluster-capi-operator
Length of output: 1715
🏁 Script executed:
# Let's check what outdatedTemplates is used for to understand the impact
rg "outdatedTemplates" pkg/controllers/machinesetsync/machineset_sync_controller.go -B 2 -A 2Repository: openshift/cluster-capi-operator
Length of output: 2316
Fix pointer aliasing bug affecting all platform branches
Taking the address of a range variable (&template) causes all appended pointers to reference the same memory location. Once the loop completes, every pointer in outdatedTemplates points to the last item in the slice, breaking template lifecycle management. This issue affects all platform cases (AWS, IBMPowerVS, OpenStack, VSphere).
Use index-based iteration instead:
Proposed fix for all platforms
- case *vspherev1.VSphereMachineTemplateList:
- for _, template := range list.Items {
- if template.GetName() != newInfraMachineTemplateName {
- outdatedTemplates = append(outdatedTemplates, &template)
- }
- }
+ case *vspherev1.VSphereMachineTemplateList:
+ for i := range list.Items {
+ template := &list.Items[i]
+ if template.GetName() != newInfraMachineTemplateName {
+ outdatedTemplates = append(outdatedTemplates, template)
+ }
+ }Apply the same pattern to AWS, IBMPowerVS, and OpenStack cases.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| case *vspherev1.VSphereMachineTemplateList: | |
| for _, template := range list.Items { | |
| if template.GetName() != newInfraMachineTemplateName { | |
| outdatedTemplates = append(outdatedTemplates, &template) | |
| } | |
| } | |
| case *vspherev1.VSphereMachineTemplateList: | |
| for i := range list.Items { | |
| template := &list.Items[i] | |
| if template.GetName() != newInfraMachineTemplateName { | |
| outdatedTemplates = append(outdatedTemplates, template) | |
| } | |
| } |
🤖 Prompt for AI Agents
In `@pkg/controllers/machinesetsync/machineset_sync_controller.go` around lines
395 - 400, The loop that appends pointers uses &template (range variable) which
causes pointer aliasing so every entry in outdatedTemplates points to the same
item; change the iteration to index-based access (e.g., for i := range
list.Items { tmpl := &list.Items[i]; if tmpl.GetName() !=
newInfraMachineTemplateName { outdatedTemplates = append(outdatedTemplates,
tmpl) } }) for the VSphereMachineTemplateList case and make the identical change
in the AWS, IBMPowerVS, and OpenStack cases so you take the address of the slice
element (list.Items[i]) instead of the range variable.
| if v.infrastructure == nil || v.infrastructure.Status.InfrastructureName == "" { | ||
| errs = append(errs, field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"), v.infrastructure.Status.InfrastructureName, "infrastructure cannot be nil and infrastructure.Status.InfrastructureName cannot be empty")) | ||
| } else { | ||
| capiMachine.Spec.ClusterName = v.infrastructure.Status.InfrastructureName | ||
| capiMachine.Labels[clusterv1.ClusterNameLabel] = v.infrastructure.Status.InfrastructureName | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Potential nil pointer dereference in error path.
If v.infrastructure is nil, the condition on line 130 checks v.infrastructure == nil, but then the error message on line 131 accesses v.infrastructure.Status.InfrastructureName, which would cause a panic.
🐛 Proposed fix
// Populate the CAPI Machine ClusterName from the OCP Infrastructure object
- if v.infrastructure == nil || v.infrastructure.Status.InfrastructureName == "" {
- errs = append(errs, field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"), v.infrastructure.Status.InfrastructureName, "infrastructure cannot be nil and infrastructure.Status.InfrastructureName cannot be empty"))
+ if v.infrastructure == nil {
+ errs = append(errs, field.Invalid(field.NewPath("infrastructure"), nil, "infrastructure cannot be nil"))
+ } else if v.infrastructure.Status.InfrastructureName == "" {
+ errs = append(errs, field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"), "", "infrastructure.Status.InfrastructureName cannot be empty"))
} else {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| if v.infrastructure == nil || v.infrastructure.Status.InfrastructureName == "" { | |
| errs = append(errs, field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"), v.infrastructure.Status.InfrastructureName, "infrastructure cannot be nil and infrastructure.Status.InfrastructureName cannot be empty")) | |
| } else { | |
| capiMachine.Spec.ClusterName = v.infrastructure.Status.InfrastructureName | |
| capiMachine.Labels[clusterv1.ClusterNameLabel] = v.infrastructure.Status.InfrastructureName | |
| } | |
| if v.infrastructure == nil { | |
| errs = append(errs, field.Invalid(field.NewPath("infrastructure"), nil, "infrastructure cannot be nil")) | |
| } else if v.infrastructure.Status.InfrastructureName == "" { | |
| errs = append(errs, field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"), "", "infrastructure.Status.InfrastructureName cannot be empty")) | |
| } else { | |
| capiMachine.Spec.ClusterName = v.infrastructure.Status.InfrastructureName | |
| capiMachine.Labels[clusterv1.ClusterNameLabel] = v.infrastructure.Status.InfrastructureName | |
| } |
🤖 Prompt for AI Agents
In `@pkg/conversion/mapi2capi/vsphere.go` around lines 130 - 135, The code
dereferences v.infrastructure in the error path; change the block to compute a
nil-safe infraName before calling field.Invalid (e.g. infraName := ""; if
v.infrastructure != nil { infraName = v.infrastructure.Status.InfrastructureName
}) and then call errs = append(errs,
field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"),
infraName, "infrastructure cannot be nil and
infrastructure.Status.InfrastructureName cannot be empty")); keep the existing
else branch that sets capiMachine.Spec.ClusterName and
capiMachine.Labels[clusterv1.ClusterNameLabel] unchanged.
| if v.infrastructure == nil || v.infrastructure.Status.InfrastructureName == "" { | ||
| errors = append(errors, field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"), v.infrastructure.Status.InfrastructureName, "infrastructure cannot be nil and infrastructure.Status.InfrastructureName cannot be empty")) | ||
| } else { | ||
| capiMachineSet.Spec.Template.Spec.ClusterName = v.infrastructure.Status.InfrastructureName | ||
| capiMachineSet.Spec.ClusterName = v.infrastructure.Status.InfrastructureName | ||
| capiMachineSet.Labels[clusterv1.ClusterNameLabel] = v.infrastructure.Status.InfrastructureName | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same nil pointer dereference issue.
The same pattern from toMachineAndInfrastructureMachine is repeated here - if v.infrastructure is nil, line 198 will panic when accessing v.infrastructure.Status.InfrastructureName.
🐛 Proposed fix
- if v.infrastructure == nil || v.infrastructure.Status.InfrastructureName == "" {
- errors = append(errors, field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"), v.infrastructure.Status.InfrastructureName, "infrastructure cannot be nil and infrastructure.Status.InfrastructureName cannot be empty"))
+ if v.infrastructure == nil {
+ errors = append(errors, field.Invalid(field.NewPath("infrastructure"), nil, "infrastructure cannot be nil"))
+ } else if v.infrastructure.Status.InfrastructureName == "" {
+ errors = append(errors, field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"), "", "infrastructure.Status.InfrastructureName cannot be empty"))
} else {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| if v.infrastructure == nil || v.infrastructure.Status.InfrastructureName == "" { | |
| errors = append(errors, field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"), v.infrastructure.Status.InfrastructureName, "infrastructure cannot be nil and infrastructure.Status.InfrastructureName cannot be empty")) | |
| } else { | |
| capiMachineSet.Spec.Template.Spec.ClusterName = v.infrastructure.Status.InfrastructureName | |
| capiMachineSet.Spec.ClusterName = v.infrastructure.Status.InfrastructureName | |
| capiMachineSet.Labels[clusterv1.ClusterNameLabel] = v.infrastructure.Status.InfrastructureName | |
| } | |
| if v.infrastructure == nil { | |
| errors = append(errors, field.Invalid(field.NewPath("infrastructure"), nil, "infrastructure cannot be nil")) | |
| } else if v.infrastructure.Status.InfrastructureName == "" { | |
| errors = append(errors, field.Invalid(field.NewPath("infrastructure", "status", "infrastructureName"), "", "infrastructure.Status.InfrastructureName cannot be empty")) | |
| } else { | |
| capiMachineSet.Spec.Template.Spec.ClusterName = v.infrastructure.Status.InfrastructureName | |
| capiMachineSet.Spec.ClusterName = v.infrastructure.Status.InfrastructureName | |
| capiMachineSet.Labels[clusterv1.ClusterNameLabel] = v.infrastructure.Status.InfrastructureName | |
| } |
🤖 Prompt for AI Agents
In `@pkg/conversion/mapi2capi/vsphere.go` around lines 197 - 203, The code
dereferences v.infrastructure without checking for nil when building the
field.Invalid error and when assigning cluster fields; change the logic to first
check nil before accessing Status.InfrastructureName (e.g., evaluate infraName
only after confirming v.infrastructure != nil) and use that safe value for the
field.Invalid call and in the assignments to
capiMachineSet.Spec.Template.Spec.ClusterName, capiMachineSet.Spec.ClusterName,
and capiMachineSet.Labels[clusterv1.ClusterNameLabel]; ensure the nil branch
appends the error and the non-nil branch performs the assignments.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am unsure if I should fix these 3 code rabbit suggestions because they deviate from the established pattern we use elsewhere
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Let me search the codebase to understand the established pattern you're referring to.
🏁 Script executed:
#!/bin/bash
# Search for similar infrastructure nil checks in the codebase
rg -n -C3 'infrastructure.*==.*nil.*infrastructure\.Status\.InfrastructureName' --type=go
# Also search for similar patterns with field.Invalid and infrastructure
rg -n -C3 'field\.Invalid.*infrastructure.*InfrastructureName' --type=go
Length of output: 13559
@AnnaZivkovic You're absolutely right to be concerned about consistency! The search results confirm that this exact pattern exists across all provider implementations in the codebase:
- AWS (aws.go): Lines 145, 213
- OpenStack (openstack.go): Lines 123, 189
- PowerVS (powervs.go): Lines 119, 180
- vSphere (vsphere.go): Lines 131, 200 ← your file
All use the identical pattern:
if m.infrastructure == nil || m.infrastructure.Status.InfrastructureName == "" {
errs = append(errs, field.Invalid(field.NewPath(...), m.infrastructure.Status.InfrastructureName, "..."))
}The technical issue: While the if condition itself is safe (Go's short-circuit evaluation prevents evaluating the second condition if the first is true), the problem is in the field.Invalid call—its second parameter m.infrastructure.Status.InfrastructureName is always evaluated, which would panic if infrastructure is nil.
Your options:
-
Leave as-is for consistency ✅ — This maintains the established pattern. If this hasn't caused issues in the other providers, it's unlikely to cause issues here either (infrastructure is likely never nil in practice).
-
Fix everywhere — If you want to address this, it should be done systematically across all 4 providers (8 locations total), not just in vSphere. This would be better handled as a separate follow-up issue/PR to maintain a clean git history.
Given that this is an established pattern across the codebase and you're adding vSphere support, I'd recommend keeping it consistent with the existing providers for this PR. If you're concerned about the potential issue, consider opening a follow-up issue to address it systematically across all providers.
This enables bidirectional conversion between vSphere Machine API Machines/MachineSets and Cluster API Machines/MachineTemplates, including comprehensive fuzz and unit tests.
a0cd7fd to
4a280fc
Compare
|
@AnnaZivkovic: This pull request references SPLAT-2410 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
Add functions to handle v1beta2 conditions (used by vSphere provider) while maintaining backward compatibility with v1beta1 conditions (used by AWS, Azure, GCP providers).
4a280fc to
b7f603d
Compare
|
@AnnaZivkovic: This pull request references SPLAT-2410 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
| //////// Conversion helpers | ||
|
|
||
| // convertMAPINetworkSpecToCAPI converts MAPI NetworkSpec to CAPI NetworkSpec. | ||
| func convertMAPINetworkSpecToCAPI(fldPath *field.Path, mapiNetwork mapiv1beta1.NetworkSpec) (vspherev1.NetworkSpec, []string, field.ErrorList) { //nolint:unparam |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@vr4manta
do you know if capv allows extra vars like we do in mapi?
tbh I am not sure I expect static to be solved in dev preview
|
/test e2e-vsphere-capi-techpreview |
|
/test lint pod something something failed |
|
@AnnaZivkovic: all tests passed! Full PR test history. Your PR dashboard. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
Enables vSphere support in the Machine API to Cluster API conversion framework. It implements bidirectional conversion between vSphere Machine API resources (Machines/MachineSets) and Cluster API resources (Machines/MachineTemplates), including support for vSphere-specific v1beta2 conditions.
Changes
Summary by CodeRabbit
New Features
Bug Fixes
Tests