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

✨ Add ability to add new data disks to VM during clone process #3214

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

vr4manta
Copy link

@vr4manta vr4manta commented Oct 3, 2024

What this PR does / why we need it:
Add API changes that adds the ability to add new data disks to VMs during the cloning process. These new disks are not present in the vSphere VM Template.

Which issue(s) this PR fixes (optional, in fixes #<issue number>(, fixes #<issue_number>, ...) format, will close the issue(s) when PR gets merged):
Fixes #3213

@k8s-ci-robot k8s-ci-robot added do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. labels Oct 3, 2024
@k8s-ci-robot
Copy link
Contributor

Welcome @vr4manta!

It looks like this is your first PR to kubernetes-sigs/cluster-api-provider-vsphere 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-sigs/cluster-api-provider-vsphere has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robot k8s-ci-robot added the needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. label Oct 3, 2024
@k8s-ci-robot
Copy link
Contributor

Hi @vr4manta. Thanks for your PR.

I'm waiting for a kubernetes-sigs member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should join the org to skip this step.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

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 kubernetes-sigs/prow repository.

@k8s-ci-robot k8s-ci-robot added the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Oct 3, 2024
@chrischdi
Copy link
Member

/ok-to-test

@k8s-ci-robot k8s-ci-robot added ok-to-test Indicates a non-member PR verified by an org member that is safe to test. and removed needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. labels Oct 4, 2024
@chrischdi
Copy link
Member

/test help

@k8s-ci-robot
Copy link
Contributor

@chrischdi: The specified target(s) for /test were not found.
The following commands are available to trigger required jobs:

  • /test pull-cluster-api-provider-vsphere-e2e-vcsim-govmomi-main
  • /test pull-cluster-api-provider-vsphere-e2e-vcsim-supervisor-main
  • /test pull-cluster-api-provider-vsphere-test-main
  • /test pull-cluster-api-provider-vsphere-verify-main

The following commands are available to trigger optional jobs:

  • /test pull-cluster-api-provider-vsphere-apidiff-main

Use /test all to run the following jobs that were automatically triggered:

  • pull-cluster-api-provider-vsphere-apidiff-main
  • pull-cluster-api-provider-vsphere-test-main
  • pull-cluster-api-provider-vsphere-verify-main

In response to this:

/test help

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 kubernetes-sigs/prow repository.

@chrischdi
Copy link
Member

/test pull-cluster-api-provider-vsphere-e2e-vcsim-govmomi-main
/test pull-cluster-api-provider-vsphere-e2e-vcsim-supervisor-main

Copy link
Member

@neolit123 neolit123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please ping once this is ready for review.

@vr4manta vr4manta force-pushed the multi_disk branch 7 times, most recently from 9c0f201 to 1636c16 Compare October 17, 2024 18:13
@vr4manta
Copy link
Author

/test pull-cluster-api-provider-vsphere-e2e-vcsim-govmomi-main

@vr4manta vr4manta marked this pull request as ready for review October 17, 2024 19:38
@k8s-ci-robot k8s-ci-robot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Oct 17, 2024
@vr4manta
Copy link
Author

@neolit123
This is ready to start reviewing.

@vr4manta vr4manta changed the title ✨ [WIP] Add ability to add new data disks to VM during clone process ✨ Add ability to add new data disks to VM during clone process Oct 23, 2024
@chrischdi
Copy link
Member

cc @lubronzhan @neolit123 @rikatz , this one should be ready for review (xref CAPV office hours) :-) Thanks @vr4manta for driving this!

@vr4manta
Copy link
Author

/assign @neolit123 @lubronzhan

Copy link
Member

@neolit123 neolit123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the PR @vr4manta
overall seems fine. i've added a few comments around the API and docs/code-comments here and there.

apis/v1beta1/types.go Outdated Show resolved Hide resolved
apis/v1beta1/types.go Outdated Show resolved Hide resolved
apis/v1beta1/types.go Outdated Show resolved Hide resolved
docs/proposal/20241003-data-disk-support.md Outdated Show resolved Hide resolved
docs/proposal/20241003-data-disk-support.md Show resolved Hide resolved
pkg/services/govmomi/vcenter/clone.go Outdated Show resolved Hide resolved
Comment on lines 462 to 479
units := make([]bool, 30)

for i := 0; i < int(offset); i++ {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is the significance of 30 here?
offset is of type int32, isn't doing len(offset) returning an error here?

invalid argument: offset (variable of type int32) for built-in len

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

they are doing this though:

	units := make([]bool, 30)

	for i := 0; i < offset; i++ {
		units[i] = true
	}

i think len(offset) would trigger a compiler error.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think what we are wanting to do here is two things.

1.) create an array that is the max number of units any controller can hold (or maybe the one we are targeting, but not sure how to figure that). I think I read that vSphere for some controllers max is 16, but I think special cases are much much higher. We can adjust what the default array size is here to the max of any, but will leave future issues popping up where we now exceeded that controller.
2.) The loop using offset is just gonna prefill the array up to the offset point as true as to prevent us from assigning an index below that for the current disk we are attempting to add / create. This loop seems to match both govmomi and this function. The govmomi is doing len(offset) because their function is using int32 as type for offset, but mine is just int.

The main function that calls this one, we default the starting point to 0 (which should always be the primary disk). After that, its any additional disks in the vSphere OVA template or previously added data disks. If we have more disks being added then supported, I do want to make sure that something triggers a failure. We could add a check here to error out if offset is > 30 and state it exceeds the max unit number.

I am happy for any suggestions. This is probably a weak spot, but for the average user of adding 1-5 extra disks (i'm just guessing 5 is max we want to add for each node for OS usage that is not included w/ any of the PVs) I think 30 is an ok number to default with initially. What do you think?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

create an array that is the max number of units any controller can hold

aren't there exported constants for that? would the govmomi maintainers know?

i think adding a few comment in the code to clarify the choices of 30 and the rest of the logic will clarify the picture for readers. but we should avoid panics if arrays are accessed out of bounds.

my main point was that the code as is cannot work. please try this:
https://go.dev/play/p/fWud2MEYR0d

Copy link
Author

@vr4manta vr4manta Oct 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I'll update the file w/ comments on the max. I'll make 30 a const that we reference to also aid in that clarity. I'll also look at that logic fix.

For my future reference, 30 is max and its documented here (30 for SATA, 16 for SCSI): Doc

According to available information, a VMware vSphere virtual machine can typically support up to four storage controllers (like SATA, SCSI, or NVMe), with each controller allowing for a maximum of 30 virtual disks per controller, depending on the controller type and vSphere version; meaning the maximum number of virtual disks per VM could be around 120 across all controllers.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think docs.vmware.com might be going down in a few days due to broadcom docs migration, but you can still link that URL and a quote from it. if someone needs the original page they can use web archived version.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah good point. I'll see if I can find the broadcom equivelent. I keep forgetting that things are in flux with these sites.

pkg/services/govmomi/vcenter/clone.go Outdated Show resolved Hide resolved
pkg/services/govmomi/vcenter/clone.go Outdated Show resolved Hide resolved
}

// assignUnitNumber assigns a controller unit number to a device.
func assignUnitNumber(ctx context.Context, device types.BaseVirtualDevice, existingDevices object.VirtualDeviceList, newDevices []types.BaseVirtualDeviceConfigSpec, controller types.BaseVirtualController, offset int32) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can this function be unit tested explicitly?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure. I'll work on making some tests for this method.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added some tests around this method. I think its covering most scenarios.

@k8s-ci-robot
Copy link
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please ask for approval from neolit123. For more information see the Kubernetes Code Review Process.

The full list of commands accepted by this bot can be found here.

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@vr4manta vr4manta force-pushed the multi_disk branch 3 times, most recently from e3c9be0 to 78a0873 Compare October 29, 2024 14:37
@k8s-ci-robot k8s-ci-robot added size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. and removed size/L Denotes a PR that changes 100-499 lines, ignoring generated files. labels Oct 29, 2024
@vr4manta vr4manta force-pushed the multi_disk branch 2 times, most recently from 770f802 to 6649b60 Compare November 4, 2024 14:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. ok-to-test Indicates a non-member PR verified by an org member that is safe to test. size/XL Denotes a PR that changes 500-999 lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add data disks not present in VM template to VM during cloning
5 participants