diff --git a/app/controllers/autograders_controller.rb b/app/controllers/autograders_controller.rb
index 51c27ff86..54605d3f2 100755
--- a/app/controllers/autograders_controller.rb
+++ b/app/controllers/autograders_controller.rb
@@ -19,6 +19,8 @@ def create
a.access_key_id = ""
a.access_key = ""
a.instance_type = "t2.micro"
+ a.ami = ""
+ a.security_group = ""
end
if @autograder.save
flash[:success] = "Autograder created."
@@ -37,6 +39,9 @@ def edit
tar_path = Rails.root.join("courses", @course.name, @assessment.name, "autograde.tar")
@makefile_exists = File.exist?(makefile_path) ? makefile_path : nil
@tar_exists = File.exist?(tar_path) ? tar_path : nil
+ tango_info = TangoClient.info
+ @tagged_amis = tango_info["tagged_amis"] || []
+ @security_groups = tango_info["security_groups"] || []
end
action_auth_level :update, :instructor
@@ -116,7 +121,7 @@ def set_autograder
def autograder_params
params[:autograder].permit(:autograde_timeout, :autograde_image, :release_score, :access_key,
- :access_key_id, :instance_type)
+ :access_key_id, :instance_type, :ami, :security_group)
end
def assessment_params
diff --git a/app/controllers/jobs_controller.rb b/app/controllers/jobs_controller.rb
index d763afc66..0b61f65a9 100755
--- a/app/controllers/jobs_controller.rb
+++ b/app/controllers/jobs_controller.rb
@@ -164,6 +164,11 @@ def getjob
def tango_status
# Obtain overall Tango info and pool status
@tango_info = TangoClient.info
+
+ # Obtain tagged AMIs and security groups from Tango
+ @tagged_amis = @tango_info["tagged_amis"] || []
+ @security_groups = @tango_info["security_groups"] || []
+
@vm_pool_list = TangoClient.pool
# Obtain Image -> Course mapping
@img_to_course = {}
diff --git a/app/helpers/assessment_autograde_core.rb b/app/helpers/assessment_autograde_core.rb
index ac90d2a9b..b683dbd93 100644
--- a/app/helpers/assessment_autograde_core.rb
+++ b/app/helpers/assessment_autograde_core.rb
@@ -177,10 +177,11 @@ def tango_add_job(course, assessment, upload_file_list, callback_url, job_name,
job_properties["accessKeyId"] = ""
end
job_properties["instanceType"] = @autograde_prop.instance_type
+ job_properties["ami"] = @autograde_prop.ami
+ job_properties["security_group"] = @autograde_prop.security_group
end
job_properties = job_properties.to_json
-
begin
response = TangoClient.addjob("#{course.name}-#{assessment.name}", job_properties)
rescue TangoClient::TangoException => e
diff --git a/app/views/autograders/_ec2_settings.html.erb b/app/views/autograders/_ec2_settings.html.erb
index cfb6bf6f0..1c57d39cc 100755
--- a/app/views/autograders/_ec2_settings.html.erb
+++ b/app/views/autograders/_ec2_settings.html.erb
@@ -8,7 +8,6 @@
help_text: "(Optional) Use your own provided access key to authenticate to different EC2 instances than the default one on Tango" %>
<%= f.text_field :access_key, display_name: "Access Key" %>
<%= f.text_field :access_key_id, display_name: "Access Key ID" %>
-
<%
# Group EC2 instance options by category for better organization
ec2_instance_options = [
@@ -76,7 +75,15 @@
Note: Larger instances incur higher AWS costs. View EC2 pricing
-
+AMI
+<%= f.select :ami,
+ options_for_select(@tagged_amis.map { |ami| ["Name: #{ami['name']}, ID: #{ami['id']}", ami['id']] }, f.object.ami),
+ { include_blank: "Use Tango Default" } %>
+
+Security Group
+<%= f.select :security_group,
+ options_for_select(@security_groups.map { |sg| ["Name: #{sg['name']}, ID: #{sg['id']}", sg['name']] }, f.object.security_group),
+ { include_blank: "Use Tango Default" } %>
<%= f.submit "Save Settings" %>
<%= link_to "Delete Autograder", course_assessment_autograder_path(@course, @assessment),
diff --git a/db/schema.rb b/db/schema.rb
index 659fad556..2602bb640 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 2024_12_11_042124) do
+ActiveRecord::Schema.define(version: 2025_04_13_141437) do
create_table "active_storage_attachments", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.string "name", null: false
@@ -153,6 +153,8 @@
t.string "access_key", default: ""
t.string "access_key_id", default: ""
t.boolean "use_access_key", default: false
+ t.string "ami", default: ""
+ t.string "security_group", default: ""
end
create_table "course_user_data", id: :integer, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|