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? %>
- >
-
- tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
-
-
-
-
-
- <%= debug puppet_node_script(request) %>
- <%= debug puppet_name_script(request) %>
-
-
-
-
-
-
- <% 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? %>
+
+ Show Request
+
+ <% end %>
+
@@ -116,7 +125,18 @@ end %>
- Users
+
+
+ Users
+ <%# Button that shows the Puppet Script modal %>
+ <% if @vm.config.present? && current_user.admin? %>
+
+ <%= fa_icon('code', text: 'Show Puppet Scripts') %>
+
+ <% end %>
+
+
<% (@vm.users + @vm.sudo_users + @vm.responsible_users).uniq.each do |user| %>
@@ -135,3 +155,46 @@ 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 %>
+
+
+
+
<%= @vm.config.node_script %>
+
+
<%# card %>
+
+ <%# 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