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|