[ovirt-devel] Unable to start vm on specific host via ruby sdk

Juan Hernández jhernand at redhat.com
Fri Feb 17 07:35:37 UTC 2017


On 02/17/2017 05:53 AM, Marc Young wrote:
> Using the ruby sdk I'm unable to start a VM on a specific host.
> 
> According to the API docs at api/v4/model#types/vm_placement_policy :
> 
> 
>     Name Type
>     ----------------
>     hosts Host[]
> 
> 
> No matter what I specify, I run into this same bug:
> https://bugzilla.redhat.com/show_bug.cgi?id=1249521
> 
>         65:           require 'pry'
>         66:           binding.pry
>         67:
>      => 68:           machine.start(
>         69:             use_cloud_init: true,
>         70:             vm: vm_configuration
>         71:           )
>         72:
>         73:           @app.call(env)
>     [1] pry(#<VagrantPlugins::OVirtProvider::Action::StartVM>)>
>     vm_configuration[:placement_policy] = { :hosts => [{ :host =>
>     'server.test.local' }], :affinity => 'pinned' }
>     [2] pry(#<VagrantPlugins::OVirtProvider::Action::StartVM>)>
>     vm_configuration
>     => {:initialization=>
>       {:host_name=>"test",
>        :nic_configurations=>[{:name=>"eth0", :on_boot=>true,
>     :boot_protocol=>"static", :ip=>{:version=>"v4",
>     :address=>"192.168.2.200", :gateway=>"192.168.2.1"}}],
>        :custom_script=>
>         "write_files:\n  - content: |\n      wat\n    path:
>     /tmp/something.txt\n    permissions: '0644'\nnetwork-interfaces: |\n
>      auto eth0\n  iface eth0 inet static\n    address 192.168.2.201\n  
>      network 192.168.2.0\n    netmask 255.255.255.0\n    gateway
>     192.168.2.1\n    dns-nameservers 192.168.2.113 192.168.2.1\n"},
>      :placement_policy=>{:hosts=>[{:host=>"server.test.local"}],
>     :affinity=>"pinned"}}
>     ==> default: An error occured. Recovering..
>     ==> default: Halting VM...
>     ==> default: Waiting for VM to shutdown...
>     ==> default: Removing VM...
>     /home/myoung/.rvm/gems/ruby-2.2.3/gems/ovirt-engine-sdk-4.1.2/lib/ovirtsdk4/service.rb:52:in
>     `raise_error': Fault reason is "Incomplete parameters". Fault detail
>     is "Host [id|name] required for
>     validateAndUpdateHostsInPlacementPolicy". HTTP response code is 400.
>     (OvirtSDK4::Error)
> 
> 
> 
> The same goes with giving an object instead of a hash object
> 
>     => 68:           machine.start(
>        69:             use_cloud_init: true,
>        70:             vm: vm_configuration
>        71:           )
>        72:
>        73:           @app.call(env)
>     [1] pry(#<VagrantPlugins::OVirtProvider::Action::StartVM>)>
>     hosts_service = env[:connection].system_service.hosts_service
>     [2] pry(#<VagrantPlugins::OVirtProvider::Action::StartVM>)> host =
>     hosts_service.list(search: 'name=server.test.local')[0]
>     [3] pry(#<VagrantPlugins::OVirtProvider::Action::StartVM>)> host.status
>     => "up"
>     [4] pry(#<VagrantPlugins::OVirtProvider::Action::StartVM>)>
>     vm_configuration[:placement_policy] = { :hosts => [{ :host => host }]}
>     ==> default: An error occured. Recovering..
>     ==> default: Halting VM...
>     ==> default: Waiting for VM to shutdown...
>     ==> default: Removing VM...
>     /home/myoung/.rvm/gems/ruby-2.2.3/gems/ovirt-engine-sdk-4.1.2/lib/ovirtsdk4/service.rb:52:in
>     `raise_error': Fault reason is "Incomplete parameters". Fault detail
>     is "Host [id|name] required for
>     validateAndUpdateHostsInPlacementPolicy". HTTP response code is 400.
>     (OvirtSDK4::Error)
>     from
>     /home/myoung/.rvm/gems/ruby-2.2.3/gems/ovirt-engine-sdk-4.1.2/lib/ovirtsdk4/service.rb:85:in
>     `check_action'
>     from
>     /home/myoung/.rvm/gems/ruby-2.2.3/gems/ovirt-engine-sdk-4.1.2/lib/ovirtsdk4/services.rb:29460:in
>     `start'
> 

The host is indicated using an object of type 'OvirtSDK4::Host', with
the 'name' attribute set to the host name or the 'id' attribute set to
the host id. So you need to create the 'vm_configuration' like this:

  vm_configuration = OvirtSDK4::Vm.new(
    placement_policy: {
      hosts: [
        {
          name: 'myhost'
        }
      ]
    }
  )

Unfortunately the Ruby doesn't provide a good mechanism to check the
types of arguments, so the error message generated isn't very helpful.
We are working on improving that. See this bug:

  https://bugzilla.redhat.com/1378113
  sdk should raise an exception when unknown parameter is used

When that is fixed you will receive an exception with a message like this:

  The type of the 'host' attribute should be 'OvirtSDK4::Host'
  but it is 'String'.

Remember that you have the Ruby SDK reference available here:

  http://www.rubydoc.info/gems/ovirt-engine-sdk

The expected types of parameters and attributes is documented there. For
example, the definition of the 'VmPlacementPolicy.hosts' attribute is here:


http://www.rubydoc.info/gems/ovirt-engine-sdk/OvirtSDK4/VmPlacementPolicy#hosts-instance_method

There you can see that the expected type is Array<Host>.




More information about the Devel mailing list