diff --git a/app/helpers/media_package_helper.rb b/app/helpers/media_package_helper.rb index d8cc0d32b..b018d425a 100644 --- a/app/helpers/media_package_helper.rb +++ b/app/helpers/media_package_helper.rb @@ -22,4 +22,15 @@ def get_media_package_channels_from_aws(channel_ids = []) channels.select { |channel| channel_ids.include?(channel.id) } end + + def resource_name + conference = streaming.conference + track = streaming.track + + if review_app? + "review_app_#{review_app_number}_#{conference.abbr}_track#{track.name}" + else + "#{env_name}_#{conference.abbr}_track#{track.name}" + end + end end diff --git a/app/jobs/create_media_package_job.rb b/app/jobs/create_media_package_job.rb index 103ed5d38..923b36278 100644 --- a/app/jobs/create_media_package_job.rb +++ b/app/jobs/create_media_package_job.rb @@ -10,11 +10,11 @@ def perform(*args) channel = MediaPackageChannel.new(conference:, track:) logger.error("Failed to create MediaPackageChannel: #{channel.errors}") unless channel.save - channel.create_media_package_resources + channel.create_aws_resource endpoint = MediaPackageOriginEndpoint.new(conference:, media_package_channel: channel) logger.error("Failed to create MediaPackageChannel: #{endpoint.errors}") unless endpoint.save - endpoint.create_media_package_resources + endpoint.create_aws_resource rescue => e logger.error(e.message) end diff --git a/app/jobs/create_streaming_aws_resources_job.rb b/app/jobs/create_streaming_aws_resources_job.rb index 9fc2e0301..7dce296c6 100644 --- a/app/jobs/create_streaming_aws_resources_job.rb +++ b/app/jobs/create_streaming_aws_resources_job.rb @@ -18,6 +18,7 @@ def perform(*args) @track = @streaming.track create_media_package_v2_resources + create_media_package_resources @streaming.update!(status: 'created') rescue => e @@ -42,4 +43,20 @@ def create_media_package_v2_resources logger.info("origin endpoint: #{origin_endpoint}") origin_endpoint.create_aws_resource end + + def create_media_package_resources + logger.info('Perform CreateMediaPackageJob') + + channel = MediaPackageChannel.find_or_create_by(streaming_id: @streaming.id) + logger.info("channel: #{channel}") + channel.create_aws_resource + + parameter = MediaPackageParameter.find_or_create_by(streaming_id: @streaming.id, media_package_channel_id: channel.id) + logger.info("parameter: #{parameter}") + parameter.create_aws_resources + + endpoint = MediaPackageOriginEndpoint.find_or_create_by(streaming_id: @streaming.id, media_package_channel_id: channel.id) + logger.info("endpoint: #{endpoint}") + endpoint.create_aws_resource + end end diff --git a/app/jobs/delete_media_package_job.rb b/app/jobs/delete_media_package_job.rb index b1682bd9e..9dbd05721 100644 --- a/app/jobs/delete_media_package_job.rb +++ b/app/jobs/delete_media_package_job.rb @@ -7,8 +7,12 @@ class DeleteMediaPackageJob < ApplicationJob def perform(*args) logger.info('Perform DeleteMediaPackageJob') channel = args[0] - channel.media_package_origin_endpoints.each(&:destroy) + channel.media_package_origin_endpoints.each do |oe| + oe.delete_aws_resource + oe.destroy + end channel.media_package_harvest_jobs.each(&:destroy) + channel.delete_aws_resource channel.destroy rescue => e logger.error(e.message) diff --git a/app/jobs/delete_streaming_aws_resources_job.rb b/app/jobs/delete_streaming_aws_resources_job.rb index 8d378d040..580955636 100644 --- a/app/jobs/delete_streaming_aws_resources_job.rb +++ b/app/jobs/delete_streaming_aws_resources_job.rb @@ -11,6 +11,7 @@ def perform(*args) @streaming = args[0] delete_media_package_v2_resources + delete_media_package_resources @streaming.update!(status: 'deleted') rescue => e @@ -27,4 +28,15 @@ def delete_media_package_v2_resources logger.info('Deleted MediaPackageV2 resources...') end + + def delete_media_package_resources + logger.info('Deleting MediaPackage resources...') + + @streaming.media_package_origin_endpoint&.destroy! + @streaming.media_package_parameter&.destroy! + @streaming.media_package_channel&.media_package_harvest_jobs&.each(&:destroy) + @streaming.media_package_channel&.destroy! + + logger.info('Deleted MediaPackage resources...') + end end diff --git a/app/models/media_package_channel.rb b/app/models/media_package_channel.rb index 45b376bef..9a8587f20 100644 --- a/app/models/media_package_channel.rb +++ b/app/models/media_package_channel.rb @@ -2,42 +2,32 @@ # # Table name: media_package_channels # -# id :bigint not null, primary key -# channel_id :string(255) default("") -# conference_id :bigint not null -# track_id :bigint not null +# id :bigint not null, primary key +# channel_id :string(255) default("") +# streaming_id :string(255) # # Indexes # -# index_media_package_channels_on_channel_id (channel_id) -# index_media_package_channels_on_conference_id (conference_id) -# index_media_package_channels_on_track_id (track_id) +# index_media_package_channels_on_channel_id (channel_id) +# index_media_package_channels_on_streaming_id (streaming_id) # # Foreign Keys # -# fk_rails_... (conference_id => conferences.id) -# fk_rails_... (track_id => tracks.id) +# fk_rails_... (streaming_id => streamings.id) # class MediaPackageChannel < ApplicationRecord include MediaPackageHelper include EnvHelper - belongs_to :conference - belongs_to :track + before_destroy :delete_aws_resource + + belongs_to :streaming has_many :media_package_origin_endpoints has_many :media_package_harvest_jobs - before_destroy do - delete_media_package_resources - rescue => e - logger.error(e.message) - end - def channel - @channel ||= media_package_client.describe_channel(id: channel_id) - rescue => e - logger.error(e.message.to_s) + @channel = media_package_client.describe_channel(id: channel_id) end def ingest_endpoints @@ -56,18 +46,25 @@ def ingest_endpoint_password ingest_endpoints[0]['password'] end - def create_media_package_resources - resp = media_package_client.create_channel(create_channel_params) - update!(channel_id: resp.id) - rescue => e - logger.error(e.message) - delete_media_package_resources + def create_aws_resource + unless exists_aws_resource? + resp = media_package_client.create_channel(create_channel_params) + update!(channel_id: resp.id) + end end - def delete_media_package_resources - media_package_client.delete_channel(id: channel_id) + def exists_aws_resource? + media_package_client.describe_channel(id: channel_id) + true + rescue Aws::MediaPackage::Errors::NotFoundException + false rescue => e logger.error(e.message.to_s) + false + end + + def delete_aws_resource + media_package_client.delete_channel(id: channel_id) if exists_aws_resource? end private @@ -85,12 +82,4 @@ def tags tags['ReviewAppNumber'] = review_app_number.to_s if ENV['DREAMKAST_NAMESPACE'] tags end - - def resource_name - if review_app? - "review_app_#{review_app_number}_#{conference.abbr}_track#{track.name}" - else - "#{env_name}_#{conference.abbr}_track#{track.name}" - end - end end diff --git a/app/models/media_package_origin_endpoint.rb b/app/models/media_package_origin_endpoint.rb index d0a5eb26f..dd6390295 100644 --- a/app/models/media_package_origin_endpoint.rb +++ b/app/models/media_package_origin_endpoint.rb @@ -3,50 +3,52 @@ # Table name: media_package_origin_endpoints # # id :bigint not null, primary key -# conference_id :bigint not null # endpoint_id :string(255) # media_package_channel_id :bigint not null +# streaming_id :string(255) # # Indexes # -# index_media_package_origin_endpoints_on_conference_id (conference_id) # index_media_package_origin_endpoints_on_media_package_channel_id (media_package_channel_id) +# index_media_package_origin_endpoints_on_streaming_id (streaming_id) # # Foreign Keys # -# fk_rails_... (conference_id => conferences.id) # fk_rails_... (media_package_channel_id => media_package_channels.id) +# fk_rails_... (streaming_id => streamings.id) # class MediaPackageOriginEndpoint < ApplicationRecord include MediaPackageHelper include EnvHelper - belongs_to :conference + before_destroy :delete_aws_resource + belongs_to :media_package_channel + belongs_to :streaming - before_destroy do - delete_media_package_resources - end def origin_endpoint - @origin_endpoint ||= media_package_client.describe_origin_endpoint(id: endpoint_id) - rescue => e - logger.error(e.message.to_s) + @origin_endpoint = media_package_client.describe_origin_endpoint(id: endpoint_id) end - def create_media_package_resources + def create_aws_resource resp = media_package_client.create_origin_endpoint(create_params) update!(endpoint_id: resp.id) - rescue => e - logger.error(e.message) - delete_media_package_resources end - def delete_media_package_resources - media_package_client.delete_origin_endpoint(id: endpoint_id) + def exists_aws_resource? + media_package_client.describe_origin_endpoint(id: endpoint_id) + true + rescue Aws::MediaPackage::Errors::NotFoundException + false rescue => e logger.error(e.message.to_s) + false + end + + def delete_aws_resource + media_package_client.delete_origin_endpoint(id: endpoint_id) if exists_aws_resource? end private @@ -84,12 +86,4 @@ def tags tags['ReviewAppNumber'] = review_app_number.to_s if ENV['DREAMKAST_NAMESPACE'] tags end - - def resource_name - if review_app? - "review_app_#{review_app_number}_#{conference.abbr}_track#{media_package_channel.track.name}" - else - "#{env_name}_#{conference.abbr}_track#{media_package_channel.track.name}" - end - end end diff --git a/app/models/media_package_parameter.rb b/app/models/media_package_parameter.rb new file mode 100644 index 000000000..b9a15aafe --- /dev/null +++ b/app/models/media_package_parameter.rb @@ -0,0 +1,63 @@ +# == Schema Information +# +# Table name: media_package_parameters +# +# id :string(255) not null, primary key +# name :string(255) +# created_at :datetime not null +# updated_at :datetime not null +# media_package_channel_id :bigint not null +# streaming_id :string(255) not null +# +# Indexes +# +# index_media_package_parameters_on_media_package_channel_id (media_package_channel_id) +# index_media_package_parameters_on_streaming_id (streaming_id) +# +# Foreign Keys +# +# fk_rails_... (media_package_channel_id => media_package_channels.id) +# fk_rails_... (streaming_id => streamings.id) +# +require 'aws-sdk-medialive' + +class MediaPackageParameter < ApplicationRecord + include MediaLiveHelper + include SsmHelper + include EnvHelper + + before_destroy :delete_aws_resource + + before_create :set_uuid + + belongs_to :streaming + belongs_to :media_package_channel + + def create_aws_resources + unless exists_aws_resource? + create_parameter("/medialive/#{resource_name}", media_package_channel.ingest_endpoint_password) + update!(name: "/medialive/#{resource_name}") + end + end + + def exists_aws_resource? + ssm_client.describe_parameters(filters: [{ key: 'Name', values: ["/medialive/#{resource_name}"] }]).parameters.any? + rescue => e + logger.error(e.message) + false + end + + def delete_aws_resource + delete_parameter("/medialive/#{resource_name}") if exists_aws_resource? + end + + private + + def resource_name + if review_app? + "review_app_#{review_app_number}_#{conference.abbr}_track#{track.name}" + else + "#{env_name}_#{conference.abbr}_track#{track.name}" + end + end +end diff --git a/app/models/streaming.rb b/app/models/streaming.rb index 54e8836f5..fad4e4cf2 100644 --- a/app/models/streaming.rb +++ b/app/models/streaming.rb @@ -29,6 +29,9 @@ class Streaming < ApplicationRecord has_one :media_package_v2_channel_group has_one :media_package_v2_channel has_one :media_package_v2_origin_endpoint + has_one :media_package_channel + has_one :media_package_origin_endpoint + has_one :media_package_parameter STATUS_CREATING = 'creating'.freeze STATUS_CRTEATED = 'created'.freeze diff --git a/app/models/track.rb b/app/models/track.rb index 74fdd27ea..f80a759d6 100644 --- a/app/models/track.rb +++ b/app/models/track.rb @@ -21,7 +21,6 @@ class Track < ApplicationRecord has_many :talks has_one :live_stream_ivs has_one :live_stream_media_live - has_one :media_package_channel has_one :streaming belongs_to :room, optional: true diff --git a/app/views/admin/streamings/index.html.erb b/app/views/admin/streamings/index.html.erb index abb16779a..57045944f 100644 --- a/app/views/admin/streamings/index.html.erb +++ b/app/views/admin/streamings/index.html.erb @@ -101,6 +101,9 @@