From c4dcc51e04ccc946d511af955b3a678309f4a744 Mon Sep 17 00:00:00 2001 From: Hilda Stastna Date: Thu, 5 Dec 2019 12:57:57 +0100 Subject: [PATCH 1/2] Allow performing operations on Instances of a Network Router Issue: https://github.com/ManageIQ/manageiq-ui-classic/issues/6309 --- app/controllers/network_router_controller.rb | 14 +- config/routes.rb | 2 + .../network_router_controller_spec.rb | 167 ++++++++++++++++-- 3 files changed, 151 insertions(+), 32 deletions(-) diff --git a/app/controllers/network_router_controller.rb b/app/controllers/network_router_controller.rb index 3066d084d16..5fd2c47efea 100644 --- a/app/controllers/network_router_controller.rb +++ b/app/controllers/network_router_controller.rb @@ -23,14 +23,6 @@ def button @refresh_div = "main_div" case params[:pressed] - when "cloud_subnet_tag" - return tag("CloudSubnet") - when "custom_button" - custom_buttons - when 'instance_compare' - comparemiq - when "instance_tag" - return tag("VmOrTemplate") when "network_router_add_interface" javascript_redirect(:action => "add_interface_select", :id => checked_item_id) when "network_router_edit" @@ -39,12 +31,8 @@ def button javascript_redirect(:action => "new") when "network_router_remove_interface" javascript_redirect(:action => "remove_interface_select", :id => checked_item_id) - when "network_router_tag" - return tag("NetworkRouter") - when "floating_ip_tag" - return tag("FloatingIp") else - render_flash + super end end diff --git a/config/routes.rb b/config/routes.rb index 41c763ad26b..edfbc5b12b9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1791,6 +1791,7 @@ edit index new + protect remove_interface_select show show_list @@ -1804,6 +1805,7 @@ create form_field_changed listnav_search_selected + protect quick_search remove_interface remove_interface_select diff --git a/spec/controllers/network_router_controller_spec.rb b/spec/controllers/network_router_controller_spec.rb index cc5e2412adb..3f320abd474 100644 --- a/spec/controllers/network_router_controller_spec.rb +++ b/spec/controllers/network_router_controller_spec.rb @@ -58,12 +58,11 @@ login_as FactoryBot.create(:user, :features => %w(none)) end - subject do - get :show, :params => {:id => @router.id} - end + subject { get :show, :params => {:id => @router.id} } context "render listnav partial" do render_views + it do is_expected.to have_http_status 200 is_expected.to render_template(:partial => "layouts/listnav/_network_router") @@ -317,41 +316,171 @@ end describe '#button' do + let(:router) { FactoryBot.create(:network_router) } + before { controller.params = params } - context 'tagging instances from a list of instances, accessed from the details page of a network router' do - let(:params) { {:pressed => "instance_tag"} } + context 'tagging Instances in a nested list' do + let(:params) { {:pressed => 'instance_tag'} } - it 'calls tag method for tagging instances' do - expect(controller).to receive(:tag).with("VmOrTemplate") + it 'calls tag method' do + expect(controller).to receive(:tag).with(VmOrTemplate) controller.send(:button) end end - context 'tagging cloud subnets from a list of subnets, accessed from the details page of a network router' do - let(:params) { {:pressed => "cloud_subnet_tag"} } + %w[cloud_subnet floating_ip network_router security_group].each do |item| + context "tagging #{item.camelize}" do + let(:params) { {:pressed => "#{item}_tag"} } + + it 'calls tag method' do + expect(controller).to receive(:tag).with(item.camelize.safe_constantize) + controller.send(:button) + end + end + end + + context 'comparing Instances displayed in a nested list' do + let(:params) { {:pressed => 'instance_compare'} } - it 'calls tag method for tagging cloud subnets' do - expect(controller).to receive(:tag).with("CloudSubnet") + it 'calls comparemiq to compare Instances' do + expect(controller).to receive(:comparemiq) controller.send(:button) end end - context 'tagging floating ips from a list of floating ips, accessed from the details page of a network router' do - let(:params) { {:pressed => "floating_ip_tag"} } + context 'adding Interface to Router' do + let(:params) { {:pressed => 'network_router_add_interface', :id => router.id.to_s} } - it 'calls tag method for tagging floating ips' do - expect(controller).to receive(:tag).with("FloatingIp") + it 'redirects to add_interface_select' do + expect(controller).to receive(:javascript_redirect).with(:action => 'add_interface_select', :id => router.id.to_s) + controller.send(:button) + end + end + context 'removing Interface from Router' do + let(:params) { {:pressed => 'network_router_remove_interface', :id => router.id.to_s} } + + it 'redirects to remove_interface_select' do + expect(controller).to receive(:javascript_redirect).with(:action => 'remove_interface_select', :id => router.id.to_s) controller.send(:button) end end - context 'comparing Instances displayed in a nested list' do - let(:params) { {:pressed => 'instance_compare'} } + context 'editing Network Router' do + let(:params) { {:pressed => 'network_router_edit', :id => router.id.to_s} } - it 'calls comparemiq to compare Instances' do - expect(controller).to receive(:comparemiq) + it 'redirects to edit method' do + expect(controller).to receive(:javascript_redirect).with(:action => 'edit', :id => router.id.to_s) + controller.send(:button) + end + end + + context 'adding new Network Router' do + let(:params) { {:pressed => 'network_router_new'} } + + it 'redirects to new method' do + expect(controller).to receive(:javascript_redirect).with(:action => 'new') + controller.send(:button) + end + end + + context 'custom buttons' do + let(:params) { {:pressed => 'custom_button'} } + + it 'calls custom_buttons method' do + expect(controller).to receive(:custom_buttons) + controller.send(:button) + end + end + + %w[delete evacuate pause refresh reset resize retire scan shelve start stop suspend terminate].each do |action| + context "#{action} for selected Instances displayed in a nested list" do + let(:params) { {:pressed => "instance_#{action}"} } + + it "calls #{action + 'vms'} method" do + allow(controller).to receive(:show) + allow(controller).to receive(:performed?).and_return(true) + expect(controller).to receive((action + 'vms').to_sym) + controller.send(:button) + end + end + end + + context 'editing Instance displayed in a nested list' do + let(:params) { {:pressed => 'instance_edit'} } + + it 'calls edit_record method' do + allow(controller).to receive(:render_or_redirect_partial) + expect(controller).to receive(:edit_record) + controller.send(:button) + end + end + + context 'setting Ownership for Instances in a nested list' do + let(:params) { {:pressed => 'instance_ownership'} } + + it 'calls set_ownership' do + expect(controller).to receive(:set_ownership) + controller.send(:button) + end + end + + context 'managing policies for Instances displayed in a nested list' do + let(:params) { {:pressed => 'instance_protect'} } + + it 'calls assign_policies method' do + expect(controller).to receive(:assign_policies).with(VmOrTemplate) + controller.send(:button) + end + end + + context 'policy simulation for Instances displayed in a nested list' do + let(:params) { {:pressed => 'instance_policy_sim'} } + + it 'calls polsimvms method' do + expect(controller).to receive(:polsimvms) + controller.send(:button) + end + end + + context 'provisioning Instances displayed in a nested list' do + let(:params) { {:pressed => 'instance_miq_request_new'} } + + it 'calls prov_redirect' do + allow(controller).to receive(:render_or_redirect_partial) + expect(controller).to receive(:prov_redirect) + controller.send(:button) + end + end + + context 'retirement for Instances displayed in a nested list' do + let(:params) { {:pressed => 'instance_retire_now'} } + + it 'calls retirevms_now' do + allow(controller).to receive(:show) + allow(controller).to receive(:performed?).and_return(true) + expect(controller).to receive(:retirevms_now) + controller.send(:button) + end + end + + context 'Live Migrate of Instances displayed in a nested list' do + let(:params) { {:pressed => 'instance_live_migrate'} } + + it 'calls livemigratevms' do + expect(controller).to receive(:livemigratevms) + controller.send(:button) + end + end + + context 'Soft Reboot of Instances displayed in a nested list' do + let(:params) { {:pressed => 'instance_guest_restart'} } + + it 'calls guestreboot' do + allow(controller).to receive(:show) + allow(controller).to receive(:performed?).and_return(true) + expect(controller).to receive(:guestreboot) controller.send(:button) end end From ee25758c3e6c8afa41c21b791083b208080eac04 Mon Sep 17 00:00:00 2001 From: Hilda Stastna Date: Fri, 13 Dec 2019 14:14:43 +0100 Subject: [PATCH 2/2] Make Check Compliance work for Instances of a Network Router --- .../application_controller/ci_processing.rb | 2 +- .../network_router_controller_spec.rb | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller/ci_processing.rb b/app/controllers/application_controller/ci_processing.rb index ca7ff288b7a..5e72833bd62 100644 --- a/app/controllers/application_controller/ci_processing.rb +++ b/app/controllers/application_controller/ci_processing.rb @@ -636,7 +636,7 @@ def testable_action(action) case controller when 'ems_cluster' ems_cluster_untestable_actions.exclude?(action) - when 'auth_key_pair_cloud', 'availability_zone', 'cloud_network', 'cloud_tenant', 'ems_cloud', 'ems_infra', 'flavor', 'host', 'host_aggregate', 'resource_pool', 'storage', 'vm_cloud' + when 'auth_key_pair_cloud', 'availability_zone', 'cloud_network', 'cloud_tenant', 'ems_cloud', 'ems_infra', 'flavor', 'host', 'host_aggregate', 'network_router', 'resource_pool', 'storage', 'vm_cloud' other_untestable_actions.exclude?(action) when 'vm_infra' vm_infra_untestable_actions.exclude?(action) diff --git a/spec/controllers/network_router_controller_spec.rb b/spec/controllers/network_router_controller_spec.rb index 3f320abd474..7373a984cb2 100644 --- a/spec/controllers/network_router_controller_spec.rb +++ b/spec/controllers/network_router_controller_spec.rb @@ -484,5 +484,35 @@ controller.send(:button) end end + + context 'Check Compliance of Instances displayed in a nested list' do + let(:params) { {:miq_grid_checks => vm_instance.id.to_s, :pressed => 'instance_check_compliance', :id => router.id.to_s, :controller => 'network_router'} } + let(:vm_instance) { FactoryBot.create(:vm_or_template) } + + before { allow(controller).to receive(:performed?).and_return(true) } + + it 'calls check_compliance_vms' do + allow(controller).to receive(:show) + expect(controller).to receive(:check_compliance_vms) + controller.send(:button) + end + + context 'Instance with VM Compliance policy assigned' do + let(:policy) { FactoryBot.create(:miq_policy, :mode => 'compliance', :towhat => 'Vm', :active => true) } + + before do + EvmSpecHelper.create_guid_miq_server_zone + allow(controller).to receive(:assert_privileges) + allow(MiqPolicy).to receive(:policy_for_event?).and_return(true) + allow(controller).to receive(:drop_breadcrumb) + vm_instance.add_policy(policy) + end + + it 'initiates Check Compliance action' do + controller.send(:button) + expect(controller.instance_variable_get(:@flash_array)).to eq([{:message => 'Check Compliance initiated for 1 VM and Instance from the ManageIQ Database', :level => :success}]) + end + end + end end end