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

Getting resource custom attributes/fields should be as easy as setting them #3187

Open
rickatnight11 opened this issue Jul 24, 2023 · 10 comments

Comments

@rickatnight11
Copy link

Is your feature request related to a problem? Please describe.
I'm developing an app to manage VMs (i.e. stop, start, reboot) in a hybrid environment based on custom attributes (to match similar behavior on AWS and Azure hosts using tags). Setting VM tags on a VirtualMachine object is as easy as:

vm.SetCustomValue(ctx, "some-custom-attribute", "some-value")

....whereas getting the current values requires a complicated lookup from the ManagedObjectReference via a CustomFieldManager like:

m, err := object.GetCustomFieldsManager(client.Client)
paths := make(map[types.ManagedObjectReference]string)
var refs []types.ManagedObjectReference
for _, vm := range vms {
	refs = append(refs, vm.Reference())
	paths[vm.Reference()] = vm.InventoryPath
}
var entities []mo.ManagedEntity
err = property.DefaultCollector(client.Client).Retrieve(ctx, refs, []string{"name", "customValue"}, &entities)
matches := func(key int32) bool {
	return true
}
field, err := m.Field(ctx)
vmtagmap := map[string]map[string]string{}
for _, entity := range entities {
	vmtagmap[entity.Name] = map[string]string{}
	for i := range entity.CustomValue {
		val := entity.CustomValue[i].(*types.CustomFieldStringValue)
		if !matches(val.Key) {
			continue
		}
		vmtagmap[entity.Name][field.ByKey(val.Key).Name] = val.Value
	}
}

Describe the solution you'd like
It would be amazingly convenient for the VirtualMachine object (and other similar resource objects), itself, to have a function that returns a list of key-value custom attributes/fields, like so:

vm.CustomValues // returns map[string]string of key/values
vm.GetCustomValue(keyname) // returns string of value

In this way custom attributes would actually behave like attributes of the resource they're supposed to be attached to, rather than a lookup for a totally separate resource.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
My use-case only needs this for VMs, but I imagine all resources (or perhaps generically just Common) would greatly benefit.

@github-actions
Copy link
Contributor

Howdy 🖐   rickatnight11 ! Thank you for your interest in this project. We value your feedback and will respond soon.

If you want to contribute to this project, please make yourself familiar with the CONTRIBUTION guidelines.

@github-actions
Copy link
Contributor

This issue is stale because it has been open for 90 days with no
activity. It will automatically close after 30 more days of
inactivity. Mark as fresh by adding the comment /remove-lifecycle stale.

@rickatnight11
Copy link
Author

/remove-lifecycle stale

@rickatnight11
Copy link
Author

/remove-lifecycle stale

Copy link
Contributor

This issue is stale because it has been open for 90 days with no
activity. It will automatically close after 30 more days of
inactivity. Mark as fresh by adding the comment /remove-lifecycle stale.

@rickatnight11
Copy link
Author

Not stale.

@rickatnight11
Copy link
Author

/remove-lifecycle stale

@rickatnight11
Copy link
Author

/remove-lifecycle stale

Copy link
Contributor

This issue is stale because it has been open for 90 days with no
activity. It will automatically close after 30 more days of
inactivity. Mark as fresh by adding the comment /remove-lifecycle stale.

@rickatnight11
Copy link
Author

/remove-lifecycle stale

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant