func()

in pkg/fake/virtualmachinesapi.go [93:155]


func (c *VirtualMachinesAPI) BeginCreateOrUpdate(_ context.Context, resourceGroupName string, vmName string, parameters armcompute.VirtualMachine, options *armcompute.VirtualMachinesClientBeginCreateOrUpdateOptions) (*runtime.Poller[armcompute.VirtualMachinesClientCreateOrUpdateResponse], error) {
	// gather input parameters (may get rid of this with multiple mocked function signatures to reflect common patterns)
	input := &VirtualMachineCreateOrUpdateInput{
		ResourceGroupName: resourceGroupName,
		VMName:            vmName,
		VM:                parameters,
		Options:           options,
	}
	// BeginCreateOrUpdate should fail, if the vm exists in the cache, and we are attempting to change properties for zone

	return c.VirtualMachineCreateOrUpdateBehavior.Invoke(input, func(input *VirtualMachineCreateOrUpdateInput) (*armcompute.VirtualMachinesClientCreateOrUpdateResponse, error) {
		//if input.ResourceGroupName == "" {
		//	return nil, errors.New("ResourceGroupName is required")
		//}
		// TODO: may have to clone ...
		// TODO: subscription ID?
		vm := input.VM
		id := utils.MkVMID(input.ResourceGroupName, input.VMName)
		vm.ID = to.StringPtr(id)

		// Check store for existing vm by name
		existingVM, ok := c.Instances.Load(id)
		if ok {
			incomingZone := vm.Zones[0] // Note: this assumes at least 1 zone and only one zone is put on our vm
			existingZone := existingVM.(armcompute.VirtualMachine).Zones[0]
			if incomingZone != existingZone {
				// Currently only returning for zones, but osProfile.customData will also return this error
				errCode := "PropertyChangeNotAllowed"
				msg := `Creating virtual machine "aks-default-4984v" failed: PUT https://management.azure.com/subscriptions/****/resourceGroups/****/providers/Microsoft.Compute/virtualMachines/aks-default-4984v
--------------------------------------------------------------------------------
RESPONSE 409: 409 Conflict
ERROR CODE: PropertyChangeNotAllowed
--------------------------------------------------------------------------------
{
  "error": {
    "code": "PropertyChangeNotAllowed",
    "message": "Changing property 'zones' is not allowed.",
    "target": "zones"
  }
}
--------------------------------------------------------------------------------`
				return nil, &azcore.ResponseError{
					ErrorCode: errCode,
					RawResponse: &http.Response{
						Body: createSDKErrorBody(errCode, msg),
					},
				}
			}
			// Use existing vm rather than restoring
			return &armcompute.VirtualMachinesClientCreateOrUpdateResponse{VirtualMachine: existingVM.(armcompute.VirtualMachine)}, nil
		}

		vm.Name = to.StringPtr(input.VMName)
		if vm.Properties == nil {
			vm.Properties = &armcompute.VirtualMachineProperties{}
		}
		if vm.Properties.TimeCreated == nil {
			vm.Properties.TimeCreated = lo.ToPtr(time.Now()) // TODO: use simulated time?
		}
		c.Instances.Store(id, vm)
		return &armcompute.VirtualMachinesClientCreateOrUpdateResponse{VirtualMachine: vm}, nil
	})
}