Skip to content

Commit

Permalink
Use explicit create_stack & delete_stack runner methods in Job.execute
Browse files Browse the repository at this point in the history
  • Loading branch information
putmanoj committed Nov 7, 2024
1 parent 4cfa610 commit 3222195
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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!
Expand Down
9 changes: 7 additions & 2 deletions lib/terraform/runner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
35 changes: 35 additions & 0 deletions spec/lib/terraform/runner_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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

Expand Down

0 comments on commit 3222195

Please sign in to comment.