Hi, sorry for the really long lurk.
I’ve returned to this project and encountered my problem again however now I’ve solved it. Yet I’m puzzled by why the solution works. I’ll show my code and my error. It turns out adding a line for 'label': {{ vm.label }}
solves my issue but I’m unclear why.
This is the output
$ sudo qubesctl state.highstate
[ERROR ] An exception occurred in this state: Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/salt/state.py", line 2153, in call
ret = self.states[cdata["full"]](
File "/usr/lib/python3.8/site-packages/salt/loader.py", line 2087, in wrapper
return f(*args, **kwargs)
File "/var/cache/salt/minion/extmods/states/ext_state_qvm.py", line 293, in prefs
return _state_action('qvm.prefs', name, *varargs, **kwargs)
File "/var/cache/salt/minion/extmods/states/ext_state_qvm.py", line 137, in _state_action
status = __salt__[_action](*varargs, **kwargs)
File "/var/cache/salt/minion/extmods/modules/ext_module_qvm.py", line 876, in prefs
elif args.vm.property_is_default(dest):
File "/usr/lib/python3.8/site-packages/qubesadmin/base.py", line 163, in property_is_default
property_str = self.qubesd_call(
File "/usr/lib/python3.8/site-packages/qubesadmin/base.py", line 76, in qubesd_call
return self.app.qubesd_call(dest, method, arg, payload,
File "/usr/lib/python3.8/site-packages/qubesadmin/app.py", line 765, in qubesd_call
return self._parse_qubesd_response(return_data)
File "/usr/lib/python3.8/site-packages/qubesadmin/base.py", line 111, in _parse_qubesd_response
raise exc_class(format_string, *args)
qubesadmin.exc.QubesNoSuchPropertyError: Invalid property 'template' of salt-standalone
local:
----------
ID: topd-always-passes
Function: test.succeed_without_changes
Name: foo
Result: True
Comment: Success!
Started: 18:07:44.996164
Duration: 0.624 ms
Changes:
----------
ID: Check if salt-standalone exists
Function: cmd.run
Name: qvm-check salt-standalone || echo "__QUBE_NOT_FOUND__"
Result: True
Comment: Command "qvm-check salt-standalone || echo "__QUBE_NOT_FOUND__"" run
Started: 18:07:44.997450
Duration: 146.018 ms
Changes:
----------
pid:
41338
retcode:
0
stderr:
qvm-check: salt-standalone: exists
stdout:
----------
ID: Create salt-standalone
Function: qvm.present
Name: salt-standalone
Result: True
Comment: [SKIP] A VM with the name 'salt-standalone' already exists. None
Started: 18:07:45.181341
Duration: 275.344 ms
Changes:
----------
ID: Configure salt-standalone
Function: qvm.prefs
Name: salt-standalone
Result: False
Comment: An exception occurred in this state: Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/salt/state.py", line 2153, in call
ret = self.states[cdata["full"]](
File "/usr/lib/python3.8/site-packages/salt/loader.py", line 2087, in wrapper
return f(*args, **kwargs)
File "/var/cache/salt/minion/extmods/states/ext_state_qvm.py", line 293, in prefs
return _state_action('qvm.prefs', name, *varargs, **kwargs)
File "/var/cache/salt/minion/extmods/states/ext_state_qvm.py", line 137, in _state_action
status = __salt__[_action](*varargs, **kwargs)
File "/var/cache/salt/minion/extmods/modules/ext_module_qvm.py", line 876, in prefs
elif args.vm.property_is_default(dest):
File "/usr/lib/python3.8/site-packages/qubesadmin/base.py", line 163, in property_is_default
property_str = self.qubesd_call(
File "/usr/lib/python3.8/site-packages/qubesadmin/base.py", line 76, in qubesd_call
return self.app.qubesd_call(dest, method, arg, payload,
File "/usr/lib/python3.8/site-packages/qubesadmin/app.py", line 765, in qubesd_call
return self._parse_qubesd_response(return_data)
File "/usr/lib/python3.8/site-packages/qubesadmin/base.py", line 111, in _parse_qubesd_response
raise exc_class(format_string, *args)
qubesadmin.exc.QubesNoSuchPropertyError: Invalid property 'template' of salt-standalone
Started: 18:07:45.458052
Duration: 80.143 ms
Changes:
----------
ID: Check if salt-no-netvm exists
Function: cmd.run
Name: qvm-check salt-no-netvm || echo "__QUBE_NOT_FOUND__"
Result: True
Comment: Command "qvm-check salt-no-netvm || echo "__QUBE_NOT_FOUND__"" run
Started: 18:07:45.538369
Duration: 132.424 ms
Changes:
----------
pid:
41360
retcode:
0
stderr:
qvm-check: salt-no-netvm: exists
stdout:
----------
ID: Create salt-no-netvm
Function: qvm.present
Name: salt-no-netvm
Result: True
Comment: [SKIP] A VM with the name 'salt-no-netvm' already exists. None
Started: 18:07:45.671382
Duration: 272.96 ms
Changes:
----------
ID: Configure salt-no-netvm
Function: qvm.prefs
Name: salt-no-netvm
Result: True
Comment: [SKIP] netvm : None None
Started: 18:07:45.945568
Duration: 48.539 ms
Changes:
Summary for local
------------
Succeeded: 6 (changed=2)
Failed: 1
------------
Total states run: 7
Total run time: 956.052 ms
DOM0 configuration failed, not continuing
This is the code I’m running:
{% set fedora_app_vms = [
{
'name': 'salt-standalone',
'label': 'red',
'template': 'fedora-36',
'type': 'standalone'
},
{
'name': 'salt-no-netvm',
'label': 'blue',
'template': 'debian-11',
'netvm': 'none'
},
] %}
{% for vm in fedora_app_vms %}
Check if {{ vm.name }} exists:
cmd.run:
- name: qvm-check {{ vm.name }} || echo "__QUBE_NOT_FOUND__"
- shell: /bin/bash
- output: qube_exists_result
- changes_dict: {'qube_exists_result': '{{ vm.name }}'}
Create {{ vm.name }}:
qvm.present:
- name: {{ vm.name }}
- label: {{ vm.label }}
- mem: 2000
- vcpus: 4
{% if 'template' in vm %}
- template: {{ vm.template }}
{% endif %}
{% if 'type' in vm and vm.type == 'standalone' %}
- flags:
- standalone
{% endif %}
Configure {{ vm.name }}:
qvm.prefs:
- name: {{ vm.name }}
{% if 'netvm' in vm %}
- netvm: {{ vm.netvm }}
{% endif %}
- onchanges:
- cmd: Check if {{ vm.name}} exists
{% endfor %}
Adding a line to the configuration function(?) so it looks like this:
Configure {{ vm.name }}:
qvm.prefs:
- name: {{ vm.name }}
- label: {{ vm.label }}
{% if 'netvm' in vm %}
- netvm: {{ vm.netvm }}
{% endif %}
- onchanges:
- cmd: Check if {{ vm.name}} exists
magically solves the problem. Why?