diff --git a/app/controllers/vms_controller.rb b/app/controllers/vms_controller.rb index f1bd2365..ddf02112 100644 --- a/app/controllers/vms_controller.rb +++ b/app/controllers/vms_controller.rb @@ -19,7 +19,9 @@ def index filter_vm_categories current_user unless current_user.admin? end - def show; end + def show + @vm_request = Request.find_by_name params[:id] + end def edit_config @vm.ensure_config diff --git a/app/models/app_setting.rb b/app/models/app_setting.rb index 093d9951..d5425b18 100644 --- a/app/models/app_setting.rb +++ b/app/models/app_setting.rb @@ -25,6 +25,10 @@ def self.instance @instance end + def github_base_file_url + "https://github.com/#{github_user_name}/#{git_repository_name}/blob/#{git_branch}" + end + private def apply_settings diff --git a/app/models/virtual_machine_config.rb b/app/models/virtual_machine_config.rb index 524a3a30..24d52877 100644 --- a/app/models/virtual_machine_config.rb +++ b/app/models/virtual_machine_config.rb @@ -38,6 +38,10 @@ def users def all_users (users + sudo_users + responsible_users).uniq end + + def node_script + Puppetscript.node_script(name, (sudo_users + responsible_users).uniq, all_users) + end private @@ -72,10 +76,6 @@ def commit_message(git_writer) end end - def node_script - Puppetscript.node_script(name, (sudo_users + responsible_users).uniq, all_users) - end - def write_puppetscripts(git_writer, name_script, node_script) git_writer.write_file(Puppetscript.class_file_name(name), name_script) git_writer.write_file(Puppetscript.node_file_name(name), node_script) diff --git a/app/views/application/_modal.html.erb b/app/views/application/_modal.html.erb new file mode 100644 index 00000000..907fe171 --- /dev/null +++ b/app/views/application/_modal.html.erb @@ -0,0 +1,16 @@ +<%# Partial params: id, dialog_class, title %> + \ No newline at end of file diff --git a/app/views/requests/_detail.html.erb b/app/views/requests/_detail.html.erb new file mode 100644 index 00000000..0bfd101b --- /dev/null +++ b/app/views/requests/_detail.html.erb @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VM Name<%= request.name %>
CPU Cores<%= request.cpu_cores %>
RAM<%= request.ram_gb %> GB
Storage<%= request.storage_gb %> GB
Operating System<%= request.operating_system %>
Port Forwarding + Enabled: <%= t request.port_forwarding %>
+ <%= request.application_name %> <%= request.port %> +
Description<%= request.description %>
Comment<%= request.comment %>
Status + <%= request.status %>
+ <% if request.rejected? %> + Rejection Information: <%= request.rejection_information %> + <% end %> +
Responsible users + <% request.responsible_users.each do |user| %> +

<%= user.email %>

+ <% end %> +
Users with sudo rights + <% request.sudo_user_assignments.each do |assignment| %> +

<%= assignment.user.email %>

+ <% end %> +
Users + <% request.non_sudo_user_assignments.each do |assignment| %> +

<%= assignment.user.email %>

+ <% end %> +
Request Date + <%= I18n.l request.created_at, format: :long %> (<%= time_ago_in_words request.created_at %> ago) +
+ diff --git a/app/views/requests/index.html.erb b/app/views/requests/index.html.erb index 5282a29b..31257ac6 100644 --- a/app/views/requests/index.html.erb +++ b/app/views/requests/index.html.erb @@ -5,12 +5,12 @@ title: 'New VM request', :data => { toggle: 'tooltip', placement: 'bottom' }, class: "btn btn-primary float-right mt-3" %> - <% if current_user.admin? %> - <%= link_to "Templates", request_templates_path, - class: "btn btn-primary float-right mt-3 mr-3" %> - <%= link_to 'Operating Systems', operating_systems_path, - class: 'btn btn-primary float-right mt-3 mr-3' %> - <% end %> + <% if current_user.admin? %> + <%= link_to "Templates", request_templates_path, + class: "btn btn-primary float-right mt-3 mr-3" %> + <%= link_to 'Operating Systems', operating_systems_path, + class: 'btn btn-primary float-right mt-3 mr-3' %> + <% end %>

Pending requests

@@ -58,7 +58,6 @@ Application Name Comment Status - Actions @@ -79,34 +78,6 @@ :data => { toggle: 'tooltip', placement: 'right' }, class: "round #{request.accepted? ? 'bg-success' : 'bg-warning'}" %> - - <% if request.accepted? %> - > - - - <% end %> - <% end %> <%# @resolved_requests&.each %> diff --git a/app/views/requests/show.html.erb b/app/views/requests/show.html.erb index 99487255..3e72067e 100644 --- a/app/views/requests/show.html.erb +++ b/app/views/requests/show.html.erb @@ -1,92 +1,5 @@

Request Information

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VM Name<%= @request.name %>
CPU cores<%= @request.cpu_cores %>
RAM in GB:<%= @request.ram_gb %>
Storage in GB:<%= @request.storage_gb %>
Operating System<%= @request.operating_system %>
Port<%= @request.port %>
Application Name<%= @request.application_name %>
Description<%= @request.description %>
Comment<%= @request.comment %>
Status<%= @request.status %>
Responsible users - <% @request.responsible_users.each do |user| %> -

<%= user.email %>

- <% end %> -
Users with sudo rights - <% @request.sudo_user_assignments.each do |assignment| %> -

<%= assignment.user.email %>

- <% end %> -
Users - <% @request.non_sudo_user_assignments.each do |assignment| %> -

<%= assignment.user.email %>

- <% end %> -
- -<% if @request.rejected? %> -

- Rejection Information: - <%= @request.rejection_information %> -

-<% end %> +<%= render 'detail', request: @request %> <%= link_to 'Back', requests_path, class: "btn btn-secondary" %> \ No newline at end of file diff --git a/app/views/vms/show.html.erb b/app/views/vms/show.html.erb index efc2b3c4..3e958b75 100644 --- a/app/views/vms/show.html.erb +++ b/app/views/vms/show.html.erb @@ -75,7 +75,7 @@ end %>
Host: <%= link_to @vm.host_name, controller: "hosts", action: "show", id: @vm.host_name unless @vm.nil? %>
-
Project: <%= @vm.project.nil? ? 'No project found!' : @vm.project.name %>
+
Project: <%= @vm.project.nil? ? 'No project' : @vm.project.name %>
<% @@ -107,6 +107,15 @@ end %>

Description

<%= simple_format(@vm&.config&.description) %> +
+ VM created by HART: <%= t @vm_request.present? %> + <% if @vm_request.present? %> + + <% end %> +
@@ -116,7 +125,18 @@ end %> - + <% (@vm.users + @vm.sudo_users + @vm.responsible_users).uniq.each do |user| %> @@ -135,3 +155,46 @@ end %>

Users

+

+ Users + <%# Button that shows the Puppet Script modal %> + <% if @vm.config.present? && current_user.admin? %> + + <% end %> +

+
+ +<% if @vm.config.present? && current_user.admin? %> + <%# Modal for Puppet Script display %> + <%= render 'application/modal', {title: 'Puppet Scripts', id: 'puppetscript', dialog_class: 'modal-lg'} do %> +
+
+ Generated Node Script
+ + <%= Puppetscript.node_file_name(@vm.name) %> + <%= link_to "(in '#{AppSetting.instance.git_repository_name}' GitHub repository)", + AppSetting.instance.github_base_file_url + Puppetscript.node_file_name(@vm.name) %> + +
+
+
<%= @vm.config.node_script %>
+
+
<%# card %> +
+
+ Generated Name Script
+ + <%= Puppetscript.class_file_name(@vm.name) %> + <%= link_to "(in '#{AppSetting.instance.git_repository_name}' GitHub repository)", + AppSetting.instance.github_base_file_url + Puppetscript.class_file_name(@vm.name) %> + +
<%# card-header %> +
+
<%= Puppetscript.name_script @vm.name %>
+
+
<%# card %> + + <% end %> +<% end %> + +<% if @vm_request.present? %> + <%# Modal for displaying associated request %> + <%= render 'application/modal', {title: "#{@vm_request.name} VM Request", id: 'vm_request', dialog_class: 'modal-lg'} do %> + <%= render "requests/detail", request: @vm_request %> + <% end %> +<% end %> \ No newline at end of file diff --git a/spec/views/vms/show.html.erb_spec.rb b/spec/views/vms/show.html.erb_spec.rb index 1eeaf0a7..92038896 100644 --- a/spec/views/vms/show.html.erb_spec.rb +++ b/spec/views/vms/show.html.erb_spec.rb @@ -34,7 +34,7 @@ end it 'shows status when online' do - expect(rendered).to include 'online' + expect(rendered).to include vm_on.status.to_s end it 'shows vm OS' do @@ -87,14 +87,17 @@ end it 'shows status' do - expect(rendered).to include 'offline' + expect(rendered).to include vm_on.status.to_s end end context 'when the current user is not a root user' do it 'does not have any links to manage power state' do - expect(rendered).not_to have_link 'Power On' - expect(rendered).not_to have_link 'Power Off' + expect(rendered).not_to have_link href: change_power_state_vm_path(vm_off.name) + end + + it 'does not have links to Puppet Scripts on GitHub' do + expect(rendered).to_not have_css 'a[href*="github.com"]' end end @@ -103,11 +106,15 @@ context 'when powered on' do it 'has power off links' do - expect(rendered).to have_link 'Suspend VM' - expect(rendered).to have_link 'Shutdown Guest OS' - expect(rendered).to have_link 'Restart Guest OS' - expect(rendered).to have_link 'Reset' - expect(rendered).to have_link 'Power Off' + expect(rendered).to have_link href: suspend_vm_vm_path(vm_on.name) + expect(rendered).to have_link href: shutdown_guest_os_vm_path(vm_on.name) + expect(rendered).to have_link href: reboot_guest_os_vm_path(vm_on.name) + expect(rendered).to have_link href: reset_vm_vm_path(vm_on.name) + expect(rendered).to have_link 'Power Off', href: change_power_state_vm_path(vm_on.name) + end + + it 'has links to Puppet Scripts on GitHub' do + expect(rendered).to have_css 'a[href*="github.com"]', minimum: 1 end end @@ -118,7 +125,7 @@ end it 'has power on link' do - expect(rendered).to have_link('Power On') + expect(rendered).to have_link 'Power On', href: change_power_state_vm_path(vm_off.name) end end end @@ -130,34 +137,28 @@ end it 'has a link to edit information' do - expect(rendered).to have_link 'Edit' + expect(rendered).to have_link href: edit_vm_path(vm_on.name) end context 'when powered on' do it 'has power off links' do - expect(rendered).to have_link 'Suspend VM' - expect(rendered).to have_link 'Shutdown Guest OS' - expect(rendered).to have_link 'Restart Guest OS' - expect(rendered).to have_link 'Reset' - expect(rendered).to have_link 'Power Off' + expect(rendered).to have_link href: suspend_vm_vm_path(vm_on.name) + expect(rendered).to have_link href: shutdown_guest_os_vm_path(vm_on.name) + expect(rendered).to have_link href: reboot_guest_os_vm_path(vm_on.name) + expect(rendered).to have_link href: reset_vm_vm_path(vm_on.name) + expect(rendered).to have_link 'Power Off', href: change_power_state_vm_path(vm_on.name) end it 'demands confirmation on critical actions' do - expect(rendered).to have_selector("a[href='#{url_for(controller: :vms, action: 'suspend_vm', id: vm_on.name)}'][data-confirm='Are you sure?']") - expect(rendered).to have_selector( - "a[href='#{url_for(controller: :vms, action: 'shutdown_guest_os', id: vm_on.name)}'][data-confirm='Are you sure?']" - ) - expect(rendered).to have_selector("a[href='#{url_for(controller: :vms, - action: 'reboot_guest_os', - id: vm_on.name)}'][data-confirm='Are you sure?']") - expect(rendered).to have_selector("a[href='#{url_for(controller: :vms, action: 'reset_vm', id: vm_on.name)}'][data-confirm='Are you sure?']") - expect(rendered).to have_selector( - "a[href='#{url_for(controller: :vms, action: 'change_power_state', id: vm_on.name)}'][data-confirm='Are you sure?']" - ) + expect(rendered).to have_selector("a[href='#{suspend_vm_vm_path(vm_on.name)}'][data-confirm]") + expect(rendered).to have_selector("a[href='#{shutdown_guest_os_vm_path(vm_on.name)}'][data-confirm]") + expect(rendered).to have_selector("a[href='#{reboot_guest_os_vm_path(vm_on.name)}'][data-confirm]") + expect(rendered).to have_selector("a[href='#{reset_vm_vm_path(vm_on.name)}'][data-confirm]") + expect(rendered).to have_selector("a[href='#{change_power_state_vm_path(vm_on.name)}'][data-confirm]") end it 'has no power on link' do - expect(rendered).not_to have_link 'Power On' + expect(rendered).to_not have_link 'Power On', href: change_power_state_vm_path(vm_on.name) end end @@ -168,16 +169,16 @@ end it 'has power on link' do - expect(rendered).to have_link('Power On') + expect(rendered).to have_link 'Power On', href: change_power_state_vm_path(vm_off.name) end it 'has no power off links' do rendered = render - expect(rendered).not_to have_link 'Suspend VM' - expect(rendered).not_to have_link 'Shutdown Guest OS' - expect(rendered).not_to have_link 'Restart Guest OS' - expect(rendered).not_to have_link 'Reset' - expect(rendered).not_to have_link 'Power Off' + expect(rendered).to_not have_link href: suspend_vm_vm_path(vm_off.name) + expect(rendered).to_not have_link href: shutdown_guest_os_vm_path(vm_off.name) + expect(rendered).to_not have_link href: reboot_guest_os_vm_path(vm_off.name) + expect(rendered).to_not have_link href: reset_vm_vm_path(vm_off.name) + expect(rendered).to_not have_link 'Power Off', href: change_power_state_vm_path(vm_off.name) end end @@ -189,33 +190,17 @@ it 'displays info that they are not installed' do rendered = render - expect(rendered).not_to have_link 'Shutdown Guest OS' - expect(rendered).not_to have_link 'Restart Guest OS' - expect(rendered).to have_link 'Suspend VM' - expect(rendered).to have_link 'Reset' - expect(rendered).to have_link 'Power Off' + expect(rendered).to_not have_link href: shutdown_guest_os_vm_path(vm_on_without_tools.name) + expect(rendered).to_not have_link href: reboot_guest_os_vm_path(vm_on_without_tools.name) + expect(rendered).to have_link href: suspend_vm_vm_path(vm_on_without_tools.name) + expect(rendered).to have_link href: reset_vm_vm_path(vm_on_without_tools.name) + expect(rendered).to have_link 'Power Off', href: change_power_state_vm_path(vm_on_without_tools.name) end it 'demands confirmation on critical actions' do - expect(rendered).to have_selector( - "a[href='#{url_for(controller: :vms, action: 'suspend_vm', id: vm_on_without_tools.name)}'][data-confirm='Are you sure?']" - ) - expect(rendered).to have_selector( - "a[href='#{url_for(controller: :vms, action: 'reset_vm', id: vm_on_without_tools.name)}'][data-confirm='Are you sure?']" - ) - expect(rendered).to have_selector( - "a[href='#{url_for(controller: :vms, action: 'change_power_state', id: vm_on_without_tools.name)}'][data-confirm='Are you sure?']" - ) - end - end - - context 'when vm_are_tools are installed' do - it 'displays info' do - expect(rendered).to have_link 'Suspend VM' - expect(rendered).to have_link 'Shutdown Guest OS' - expect(rendered).to have_link 'Restart Guest OS' - expect(rendered).to have_link 'Reset' - expect(rendered).to have_link 'Power Off' + expect(rendered).to have_selector("a[href='#{suspend_vm_vm_path(vm_on_without_tools.name)}'][data-confirm]") + expect(rendered).to have_selector("a[href='#{reset_vm_vm_path(vm_on_without_tools.name)}'][data-confirm]") + expect(rendered).to have_selector("a[href='#{change_power_state_vm_path(vm_on_without_tools.name)}'][data-confirm]") end end end