I believe I have found out how to do this through the service templates. I would have loved to do this with the VM_Provisioning calls, but it sets everything to auto-placement, It appears you can still try do do this with provisioning based on a post from pemcg, but I did not want to make it complicated and go down the path of making a customization method in the state machine.
Dialog variables seem to be the vehicle that can traverse across the service-template to the provisioning state. As long as you can find the mapping of the ids for each placement item like VM folder, cluster you can set it with just the ID. It seems to be working.
Heres an example if anyone is trying to do this via APIs.
“dialog_service_name”: “SNOW Requested - Bens-API-Test18”,
“dialog_cores_per_socket” : “3”,
“dialog_vm_memory” : “5120”,
“dialog_vm_description” : “A new API method for provisioning and placement”,
“dialog_placement_ds_name” : 4000000000007,
“dialog_placement_dc_name” : 4000000000047,
“dialog_placement_folder_name” : 4000000000007,
“dialog_placement_cluster_name” : 4000000000002,
“dialog_placement_rp_name” : 4000000000002
In case you are wondering how to get these IDs for the items you can traverse the api tree and find it.
Example for datastores:
GET call for https://cloudformsdev.domain.local/api/data_stores?expand=resources&attributes=name,id
You can also see all of the field names by doing a simple GET call to the service template
Anyway, I hope this helps someone. I probably spent about 5 hours getting to this point.