From 75d7a14b6e23f382e89e20abc2a90918d30a1ff7 Mon Sep 17 00:00:00 2001 From: ArnauGabrielAtienza Date: Wed, 25 Feb 2026 17:32:03 +0100 Subject: [PATCH 1/6] sunstone views role Signed-off-by: ArnauGabrielAtienza --- roles/sunstone_view/defaults/main.yml | 20 ++++++++++++++ roles/sunstone_view/tasks/main.yml | 40 +++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 roles/sunstone_view/defaults/main.yml create mode 100644 roles/sunstone_view/tasks/main.yml diff --git a/roles/sunstone_view/defaults/main.yml b/roles/sunstone_view/defaults/main.yml new file mode 100644 index 0000000..d7643cf --- /dev/null +++ b/roles/sunstone_view/defaults/main.yml @@ -0,0 +1,20 @@ +--- +# Identifier for the view (e.g., custom_view) +sunstone_view_name: custom_view + +# Display name for the view +sunstone_view_label: Custom + +# Description for the view +sunstone_view_description: Custom view description + +# List of groups to add this view to +sunstone_view_groups: + - oneadmin + +# Folder name in inventory/views/ to copy from +sunstone_view_source_folder: custom_view + +# Destination paths on the frontend +sunstone_views_config_file: /etc/one/fireedge/sunstone/views/sunstone-views.yaml +sunstone_views_base_dir: /etc/one/fireedge/sunstone/views/ diff --git a/roles/sunstone_view/tasks/main.yml b/roles/sunstone_view/tasks/main.yml new file mode 100644 index 0000000..9f43a69 --- /dev/null +++ b/roles/sunstone_view/tasks/main.yml @@ -0,0 +1,40 @@ +--- +- name: Copy view folder + ansible.builtin.copy: + src: "{{ inventory_dir }}/views/{{ sunstone_view_source_folder }}/" + dest: "{{ sunstone_views_base_dir }}{{ sunstone_view_name }}/" + mode: u=rw,g=r,o=r + +- name: Update views definition in sunstone-views.yaml + opennebula.deploy.cfgtool: + dest: "{{ sunstone_views_config_file }}" + parser: Yaml + actions: + - put: + path: [views, "{{ sunstone_view_name }}"] + value: + name: "{{ sunstone_view_label }}" + description: "{{ sunstone_view_description }}" + +- name: Add view to groups in sunstone-views.yaml + opennebula.deploy.cfgtool: + dest: "{{ sunstone_views_config_file }}" + parser: Yaml + actions: + - get: + path: [groups, "{{ item }}"] + register: _groups_cfg + loop: "{{ sunstone_view_groups }}" + changed_when: false + +- name: Update group views list + opennebula.deploy.cfgtool: + dest: "{{ sunstone_views_config_file }}" + parser: Yaml + actions: + - put: + path: [groups, "{{ item.item }}", 0] + value: "{{ sunstone_view_name }}" + loop: "{{ _groups_cfg.results }}" + # item.values[0] is the list of views for the group + when: sunstone_view_name not in item['values'][0] From d3149e05f0a5053b3c1f591d47c204e3e961524d Mon Sep 17 00:00:00 2001 From: ArnauGabrielAtienza Date: Thu, 16 Apr 2026 10:20:09 +0200 Subject: [PATCH 2/6] changed views into task Signed-off-by: ArnauGabrielAtienza --- roles/gui/defaults/main.yml | 4 ++ roles/gui/tasks/main.yml | 4 ++ roles/gui/tasks/sunstone_views.yml | 54 +++++++++++++++++++++++++++ roles/sunstone_view/defaults/main.yml | 20 ---------- roles/sunstone_view/tasks/main.yml | 40 -------------------- 5 files changed, 62 insertions(+), 60 deletions(-) create mode 100644 roles/gui/tasks/sunstone_views.yml delete mode 100644 roles/sunstone_view/defaults/main.yml delete mode 100644 roles/sunstone_view/tasks/main.yml diff --git a/roles/gui/defaults/main.yml b/roles/gui/defaults/main.yml index 80c061c..924fd3e 100644 --- a/roles/gui/defaults/main.yml +++ b/roles/gui/defaults/main.yml @@ -5,3 +5,7 @@ ssl_defaults: web_server: apache # could be nginx key: /etc/ssl/private/opennebula-key.pem certchain: /etc/ssl/certs/opennebula-certchain.pem + +sunstone_views: [] +sunstone_views_config_file: /etc/one/fireedge/sunstone/views/sunstone-views.yaml +sunstone_views_base_dir: /etc/one/fireedge/sunstone/views/ diff --git a/roles/gui/tasks/main.yml b/roles/gui/tasks/main.yml index 4ae4a8c..1fb840f 100644 --- a/roles/gui/tasks/main.yml +++ b/roles/gui/tasks/main.yml @@ -52,3 +52,7 @@ ansible.builtin.include_tasks: file: "{{ role_path }}/tasks/{{ ssl.web_server }}.yml" when: ssl is defined + +- name: Deploy Sunstone Views + ansible.builtin.include_tasks: + file: "{{ role_path }}/tasks/sunstone_views.yml" diff --git a/roles/gui/tasks/sunstone_views.yml b/roles/gui/tasks/sunstone_views.yml new file mode 100644 index 0000000..fcb55e9 --- /dev/null +++ b/roles/gui/tasks/sunstone_views.yml @@ -0,0 +1,54 @@ +- name: Prepare sunstone views list + ansible.builtin.set_fact: + _sunstone_views: "{{ sunstone_views | default([]) }}" + +- name: Build view-group pairs + ansible.builtin.set_fact: + _view_group_pairs: "{{ _view_group_pairs | default([]) + [[item.0, item.1]] }}" + loop: "{{ _sunstone_views | subelements('groups') }}" + when: _sunstone_views | length > 0 + +- name: Copy view folder + ansible.builtin.copy: + src: "{{ inventory_dir }}/views/{{ item.source_folder }}/" + dest: "{{ sunstone_views_base_dir }}{{ item.name }}/" + mode: u=rw,g=r,o=r + loop: "{{ _sunstone_views }}" + when: _sunstone_views | length > 0 + +- name: Update views definition in sunstone-views.yaml + opennebula.deploy.cfgtool: + dest: "{{ sunstone_views_config_file }}" + parser: Yaml + actions: + - put: + path: [views, "{{ item.name }}"] + value: + name: "{{ item.label }}" + description: "{{ item.description }}" + loop: "{{ _sunstone_views }}" + when: _sunstone_views | length > 0 + +- name: Add view to groups in sunstone-views.yaml + opennebula.deploy.cfgtool: + dest: "{{ sunstone_views_config_file }}" + parser: Yaml + actions: + - get: + path: [groups, "{{ item[1] }}"] + register: _groups_cfg + loop: "{{ _view_group_pairs | default([]) }}" + changed_when: false + when: _sunstone_views | length > 0 + +- name: Update group views list + opennebula.deploy.cfgtool: + dest: "{{ sunstone_views_config_file }}" + parser: Yaml + actions: + - put: + path: [groups, "{{ item.item[1] }}", 0] + value: "{{ item.item[0].name }}" + loop: "{{ _groups_cfg.results | default([]) }}" + # item.values[0] is the list of views for the group + when: item.item[0].name not in item['values'][0] and _sunstone_views | length > 0 \ No newline at end of file diff --git a/roles/sunstone_view/defaults/main.yml b/roles/sunstone_view/defaults/main.yml deleted file mode 100644 index d7643cf..0000000 --- a/roles/sunstone_view/defaults/main.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -# Identifier for the view (e.g., custom_view) -sunstone_view_name: custom_view - -# Display name for the view -sunstone_view_label: Custom - -# Description for the view -sunstone_view_description: Custom view description - -# List of groups to add this view to -sunstone_view_groups: - - oneadmin - -# Folder name in inventory/views/ to copy from -sunstone_view_source_folder: custom_view - -# Destination paths on the frontend -sunstone_views_config_file: /etc/one/fireedge/sunstone/views/sunstone-views.yaml -sunstone_views_base_dir: /etc/one/fireedge/sunstone/views/ diff --git a/roles/sunstone_view/tasks/main.yml b/roles/sunstone_view/tasks/main.yml deleted file mode 100644 index 9f43a69..0000000 --- a/roles/sunstone_view/tasks/main.yml +++ /dev/null @@ -1,40 +0,0 @@ ---- -- name: Copy view folder - ansible.builtin.copy: - src: "{{ inventory_dir }}/views/{{ sunstone_view_source_folder }}/" - dest: "{{ sunstone_views_base_dir }}{{ sunstone_view_name }}/" - mode: u=rw,g=r,o=r - -- name: Update views definition in sunstone-views.yaml - opennebula.deploy.cfgtool: - dest: "{{ sunstone_views_config_file }}" - parser: Yaml - actions: - - put: - path: [views, "{{ sunstone_view_name }}"] - value: - name: "{{ sunstone_view_label }}" - description: "{{ sunstone_view_description }}" - -- name: Add view to groups in sunstone-views.yaml - opennebula.deploy.cfgtool: - dest: "{{ sunstone_views_config_file }}" - parser: Yaml - actions: - - get: - path: [groups, "{{ item }}"] - register: _groups_cfg - loop: "{{ sunstone_view_groups }}" - changed_when: false - -- name: Update group views list - opennebula.deploy.cfgtool: - dest: "{{ sunstone_views_config_file }}" - parser: Yaml - actions: - - put: - path: [groups, "{{ item.item }}", 0] - value: "{{ sunstone_view_name }}" - loop: "{{ _groups_cfg.results }}" - # item.values[0] is the list of views for the group - when: sunstone_view_name not in item['values'][0] From 3cd2baf9d324e2ca324ecd167bd27b7f0a7a9073 Mon Sep 17 00:00:00 2001 From: ArnauGabrielAtienza Date: Thu, 16 Apr 2026 10:23:10 +0200 Subject: [PATCH 3/6] add example Signed-off-by: ArnauGabrielAtienza --- roles/gui/defaults/main.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/roles/gui/defaults/main.yml b/roles/gui/defaults/main.yml index 924fd3e..c1fee36 100644 --- a/roles/gui/defaults/main.yml +++ b/roles/gui/defaults/main.yml @@ -7,5 +7,14 @@ ssl_defaults: certchain: /etc/ssl/certs/opennebula-certchain.pem sunstone_views: [] +# Example: +# sunstone_views: +# - name: example_view +# label: "Custom view" +# description: "A custom view for users" +# groups: +# - oneadmin +# - users +# source_folder: one-deploy/views/example_view sunstone_views_config_file: /etc/one/fireedge/sunstone/views/sunstone-views.yaml sunstone_views_base_dir: /etc/one/fireedge/sunstone/views/ From 362251dc3a47e536c9830039c2a153915bc6ee49 Mon Sep 17 00:00:00 2001 From: ArnauGabrielAtienza Date: Thu, 16 Apr 2026 10:27:00 +0200 Subject: [PATCH 4/6] Remove redundant code Signed-off-by: ArnauGabrielAtienza --- roles/gui/tasks/sunstone_views.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/roles/gui/tasks/sunstone_views.yml b/roles/gui/tasks/sunstone_views.yml index fcb55e9..41da1a7 100644 --- a/roles/gui/tasks/sunstone_views.yml +++ b/roles/gui/tasks/sunstone_views.yml @@ -1,20 +1,16 @@ -- name: Prepare sunstone views list - ansible.builtin.set_fact: - _sunstone_views: "{{ sunstone_views | default([]) }}" - - name: Build view-group pairs ansible.builtin.set_fact: _view_group_pairs: "{{ _view_group_pairs | default([]) + [[item.0, item.1]] }}" - loop: "{{ _sunstone_views | subelements('groups') }}" - when: _sunstone_views | length > 0 + loop: "{{ sunstone_views | default([]) | subelements('groups') }}" + when: sunstone_views | default([]) | length > 0 - name: Copy view folder ansible.builtin.copy: src: "{{ inventory_dir }}/views/{{ item.source_folder }}/" dest: "{{ sunstone_views_base_dir }}{{ item.name }}/" mode: u=rw,g=r,o=r - loop: "{{ _sunstone_views }}" - when: _sunstone_views | length > 0 + loop: "{{ sunstone_views | default([]) }}" + when: sunstone_views | default([]) | length > 0 - name: Update views definition in sunstone-views.yaml opennebula.deploy.cfgtool: @@ -26,8 +22,8 @@ value: name: "{{ item.label }}" description: "{{ item.description }}" - loop: "{{ _sunstone_views }}" - when: _sunstone_views | length > 0 + loop: "{{ sunstone_views | default([]) }}" + when: sunstone_views | default([]) | length > 0 - name: Add view to groups in sunstone-views.yaml opennebula.deploy.cfgtool: @@ -39,7 +35,7 @@ register: _groups_cfg loop: "{{ _view_group_pairs | default([]) }}" changed_when: false - when: _sunstone_views | length > 0 + when: sunstone_views | default([]) | length > 0 - name: Update group views list opennebula.deploy.cfgtool: @@ -51,4 +47,4 @@ value: "{{ item.item[0].name }}" loop: "{{ _groups_cfg.results | default([]) }}" # item.values[0] is the list of views for the group - when: item.item[0].name not in item['values'][0] and _sunstone_views | length > 0 \ No newline at end of file + when: item.item[0].name not in item['values'][0] and sunstone_views | default([]) | length > 0 \ No newline at end of file From 6ec576f9f889b2a5bd257a69dec2afbf86fb5815 Mon Sep 17 00:00:00 2001 From: Michal Opala Date: Tue, 21 Apr 2026 21:06:30 +0200 Subject: [PATCH 5/6] M #-: Refactor sunstone_views.yml - Improve performance by reducing number of task loops - Update .gitignore - Make various coding-style fixes Signed-off-by: Michal Opala --- .gitignore | 1 + roles/gui/defaults/main.yml | 2 +- roles/gui/tasks/sunstone_views.yml | 111 ++++++++++++++++------------- 3 files changed, 65 insertions(+), 49 deletions(-) diff --git a/.gitignore b/.gitignore index f996d49..e8bfa39 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ __pycache__/ /ansible_collections/* !/ansible_collections/opennebula/deploy /inventory/.one-deploy/ +/inventory/*/ /inventory/*.yml !/inventory/example.yml !/inventory/local.yml diff --git a/roles/gui/defaults/main.yml b/roles/gui/defaults/main.yml index c1fee36..cb5849f 100644 --- a/roles/gui/defaults/main.yml +++ b/roles/gui/defaults/main.yml @@ -16,5 +16,5 @@ sunstone_views: [] # - oneadmin # - users # source_folder: one-deploy/views/example_view -sunstone_views_config_file: /etc/one/fireedge/sunstone/views/sunstone-views.yaml sunstone_views_base_dir: /etc/one/fireedge/sunstone/views/ +sunstone_views_config_file: "{{ sunstone_views_base_dir }}/sunstone-views.yaml" diff --git a/roles/gui/tasks/sunstone_views.yml b/roles/gui/tasks/sunstone_views.yml index 41da1a7..a6080d5 100644 --- a/roles/gui/tasks/sunstone_views.yml +++ b/roles/gui/tasks/sunstone_views.yml @@ -1,50 +1,65 @@ -- name: Build view-group pairs - ansible.builtin.set_fact: - _view_group_pairs: "{{ _view_group_pairs | default([]) + [[item.0, item.1]] }}" - loop: "{{ sunstone_views | default([]) | subelements('groups') }}" - when: sunstone_views | default([]) | length > 0 +--- +- when: _input | count > 0 + vars: + _input: >- + {{ sunstone_views | d([]) }} + _values_loaded: >- + {{ cfgtool_groups_and_views['values'] }} + _groups_loaded: >- + {{ _values_loaded.0.0 }} + _views_loaded: >- + {{ _values_loaded.1.0 }} + _groups_updated: >- + {%- set output = _groups_loaded -%} + {%- for v in _input -%} + {%- for g in v.groups -%} + {{- + output.update({ g: (output[g] | d([]) + [v.name]) | unique }) + -}} + {%- endfor -%} + {%- endfor -%} + {{- output -}} + _views_updated: >- + {%- set output = _views_loaded -%} + {%- for v in _input -%} + {{- + output.update({ v.name: { "name": v.label, "description": v.description } }) + -}} + {%- endfor -%} + {{- output -}} + block: + - name: Copy custom Sunstone views from inventory + ansible.builtin.copy: + dest: "{{ _dest | normpath }}/" # / is strictly required here + src: "{{ _src | normpath }}/" # / is strictly required here + mode: u=rw,go=r + vars: + _dest: >- + {{ sunstone_views_base_dir }}/{{ item.name }} + _src: >- + {{ inventory_dir }}/views/{{ item.source_folder }} + loop: "{{ _input }}" + loop_control: { label: "{{ item.name }}" } -- name: Copy view folder - ansible.builtin.copy: - src: "{{ inventory_dir }}/views/{{ item.source_folder }}/" - dest: "{{ sunstone_views_base_dir }}{{ item.name }}/" - mode: u=rw,g=r,o=r - loop: "{{ sunstone_views | default([]) }}" - when: sunstone_views | default([]) | length > 0 + - name: Read 'groups' and 'views' from sunstone-views.yaml + opennebula.deploy.cfgtool: + dest: "{{ sunstone_views_config_file }}" + parser: Yaml + actions: + - get: + path: [groups] + - get: + path: [views] + register: cfgtool_groups_and_views -- name: Update views definition in sunstone-views.yaml - opennebula.deploy.cfgtool: - dest: "{{ sunstone_views_config_file }}" - parser: Yaml - actions: - - put: - path: [views, "{{ item.name }}"] - value: - name: "{{ item.label }}" - description: "{{ item.description }}" - loop: "{{ sunstone_views | default([]) }}" - when: sunstone_views | default([]) | length > 0 - -- name: Add view to groups in sunstone-views.yaml - opennebula.deploy.cfgtool: - dest: "{{ sunstone_views_config_file }}" - parser: Yaml - actions: - - get: - path: [groups, "{{ item[1] }}"] - register: _groups_cfg - loop: "{{ _view_group_pairs | default([]) }}" - changed_when: false - when: sunstone_views | default([]) | length > 0 - -- name: Update group views list - opennebula.deploy.cfgtool: - dest: "{{ sunstone_views_config_file }}" - parser: Yaml - actions: - - put: - path: [groups, "{{ item.item[1] }}", 0] - value: "{{ item.item[0].name }}" - loop: "{{ _groups_cfg.results | default([]) }}" - # item.values[0] is the list of views for the group - when: item.item[0].name not in item['values'][0] and sunstone_views | default([]) | length > 0 \ No newline at end of file + - name: Write updated 'groups' and 'views' into sunstone-views.yaml + opennebula.deploy.cfgtool: + dest: "{{ sunstone_views_config_file }}" + parser: Yaml + actions: + - put: + path: [groups] + value: "{{ _groups_updated }}" + - put: + path: [views] + value: "{{ _views_updated }}" From e21567aa825eb908180e8a044e72a72bf1eaf13d Mon Sep 17 00:00:00 2001 From: Michal Opala Date: Wed, 22 Apr 2026 19:33:50 +0200 Subject: [PATCH 6/6] M #-: Fix .gitignore Signed-off-by: Michal Opala --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e8bfa39..4f74143 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ __pycache__/ /ansible_collections/* !/ansible_collections/opennebula/deploy /inventory/.one-deploy/ -/inventory/*/ +/inventory/views/ /inventory/*.yml !/inventory/example.yml !/inventory/local.yml