From 32221954b799e49d569ff3cb29dbbf37c5ce68d5 Mon Sep 17 00:00:00 2001 From: MANOJ PUTHRAN Date: Thu, 7 Nov 2024 15:36:52 +0530 Subject: [PATCH] Use explicit create_stack & delete_stack runner methods in Job.execute --- .../automation_manager/job.rb | 25 ++++++++----- lib/terraform/runner.rb | 9 +++-- spec/lib/terraform/runner_spec.rb | 35 +++++++++++++++++++ 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/app/models/manageiq/providers/embedded_terraform/automation_manager/job.rb b/app/models/manageiq/providers/embedded_terraform/automation_manager/job.rb index e4bd2012..92b783f8 100644 --- a/app/models/manageiq/providers/embedded_terraform/automation_manager/job.rb +++ b/app/models/manageiq/providers/embedded_terraform/automation_manager/job.rb @@ -25,14 +25,23 @@ def execute action = options.dig(:input_vars, :action) || nil terraform_stack_id = options.dig(:input_vars, :terraform_stack_id) || nil # required in case of Retirement action - response = Terraform::Runner.run( - template_path, - :input_vars => decrypt_input_vars(input_vars), - :credentials => credentials, - :env_vars => options[:env_vars], - :action => action, - :stack_id => terraform_stack_id - ) + response = case action + when ResourceAction::RETIREMENT + Terraform::Runner.delete_stack( + terraform_stack_id, + template_path, + :input_vars => decrypt_input_vars(input_vars), + :credentials => credentials, + :env_vars => options[:env_vars] + ) + else + Terraform::Runner.create_stack( + template_path, + :input_vars => decrypt_input_vars(input_vars), + :credentials => credentials, + :env_vars => options[:env_vars] + ) + end options[:terraform_stack_id] = response.stack_id save! diff --git a/lib/terraform/runner.rb b/lib/terraform/runner.rb index b4670795..46abb64b 100644 --- a/lib/terraform/runner.rb +++ b/lib/terraform/runner.rb @@ -66,8 +66,13 @@ def run_async(template_path, input_vars: {}, tags: nil, credentials: [], env_var alias create_stack run_async # Delete(destroy) terraform-runner created stack resources. - def delete_stack(stack_id, template_path, input_vars, credentials: [], env_vars: {}) - run_async(template_path, input_vars, nil, credentials, env_vars, ResourceAction::RETIREMENT, stack_id) + def delete_stack(stack_id, template_path, input_vars: {}, credentials: [], env_vars: {}) + run_async(template_path, + :input_vars => input_vars, + :credentials => credentials, + :env_vars => env_vars, + :action => ResourceAction::RETIREMENT, + :stack_id => stack_id) end # Stop running terraform-runner job, by stack_id diff --git a/spec/lib/terraform/runner_spec.rb b/spec/lib/terraform/runner_spec.rb index 27749e19..2a7079f2 100644 --- a/spec/lib/terraform/runner_spec.rb +++ b/spec/lib/terraform/runner_spec.rb @@ -77,6 +77,21 @@ def verify_req(req) expect(response.details).to(be_nil) end + it "create_stack for hello-world terraform template" do + async_response = Terraform::Runner.create_stack(File.join(__dir__, "runner/data/hello-world"), :input_vars => input_vars) + expect(create_stub).to(have_been_requested.times(1)) + + response = async_response.response + expect(retrieve_stub).to(have_been_requested.times(1)) + + expect(response.status).to(eq('IN_PROGRESS'), "terraform-runner failed with:\n#{response.status}") + expect(response.stack_id).to(eq(@hello_world_create_response['stack_id'])) + expect(response.action).to(eq('CREATE')) + expect(response.stack_name).to(eq(@hello_world_create_response['stack_name'])) + expect(response.message).to(be_nil) + expect(response.details).to(be_nil) + end + it "handles trailing '/' in template path" do async_response = Terraform::Runner.run_async(File.join(__dir__, "runner/data/hello-world/"), :input_vars => input_vars) expect(create_stub).to(have_been_requested.times(1)) @@ -246,6 +261,26 @@ def verify_req(req) expect(response.message).to(include('Destroy complete! Resources: 1 destroyed.')) expect(response.details).to(eq({"resources" => [], "outputs" => []})) end + + it "delete_stack for hello-world terraform template" do + stack_id = @hello_world_retrieve_delete_response['stack_id'] + async_response = Terraform::Runner.delete_stack( + stack_id, + File.join(__dir__, "runner/data/hello-world"), + :input_vars => input_vars + ) + expect(delete_stub).to(have_been_requested.times(1)) + + response = async_response.response + expect(delete_retrieve_stub).to(have_been_requested.times(1)) + expect(response.stack_id).to(eq(@hello_world_delete_response['stack_id'])) + expect(response.action).to(eq('DELETE')) + expect(response.stack_name).to(eq(@hello_world_delete_response['stack_name'])) + + expect(response.status).to(eq('SUCCESS'), "terraform-runner failed with:\n#{response.status}") + expect(response.message).to(include('Destroy complete! Resources: 1 destroyed.')) + expect(response.details).to(eq({"resources" => [], "outputs" => []})) + end end end