Skip to content

Commit

Permalink
Merge pull request #2020 from cloudnativedaysjp/feat/add-media-packag…
Browse files Browse the repository at this point in the history
…e-v2

(1) MediaPackageV2リソースを扱えるようにする
  • Loading branch information
takaishi authored Sep 17, 2023
2 parents 26af0d7 + 5e94fe2 commit 60827c1
Show file tree
Hide file tree
Showing 16 changed files with 541 additions and 6 deletions.
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ gem 'psych', '< 6'
gem "aws-sdk-ivs"
gem "aws-sdk-medialive"
gem "aws-sdk-mediapackage"
gem "aws-sdk-mediapackagev2"
gem "aws-sdk-ssm"

gem 'active_hash'
Expand Down
12 changes: 8 additions & 4 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,13 @@ GEM
rake (>= 10.4, < 14.0)
ast (2.4.2)
aws-eventstream (1.2.0)
aws-partitions (1.628.0)
aws-partitions (1.817.0)
aws-record (2.7.0)
aws-sdk-dynamodb (~> 1.18)
aws-sdk-core (3.144.0)
aws-sdk-core (3.181.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1)
aws-sdk-dynamodb (1.76.0)
aws-sdk-core (~> 3, >= 3.127.0)
Expand All @@ -107,6 +107,9 @@ GEM
aws-sdk-mediapackage (1.56.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sigv4 (~> 1.1)
aws-sdk-mediapackagev2 (1.5.0)
aws-sdk-core (~> 3, >= 3.177.0)
aws-sigv4 (~> 1.1)
aws-sdk-rails (3.6.3)
aws-record (~> 2)
aws-sdk-ses (~> 1)
Expand Down Expand Up @@ -702,6 +705,7 @@ DEPENDENCIES
aws-sdk-ivs
aws-sdk-medialive
aws-sdk-mediapackage
aws-sdk-mediapackagev2
aws-sdk-rails
aws-sdk-s3 (~> 1.14)
aws-sdk-ssm
Expand Down
44 changes: 44 additions & 0 deletions app/helpers/media_package_v2_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
require 'aws-sdk-mediapackagev2'

module MediaPackageV2Helper
def media_package_v2_client
creds = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
@client ||= if creds.set?
Aws::MediaPackageV2::Client.new(region: AWS_LIVE_STREAM_REGION, credentials: creds)
else
Aws::MediaPackageV2::Client.new(region: AWS_LIVE_STREAM_REGION)
end
end

def channel_group_name
conference = streaming.conference

if review_app?
"review_app_#{review_app_number}_#{conference.abbr}"
else
"#{env_name}_#{conference.abbr}"
end
end

def channel_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

def origin_endpoint_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
26 changes: 26 additions & 0 deletions app/jobs/create_streaming_aws_resources_job.rb
Original file line number Diff line number Diff line change
@@ -1,19 +1,45 @@
class CreateStreamingAwsResourcesJob < ApplicationJob
include EnvHelper
include MediaPackageV2Helper
include LogoutHelper

# queue_as :default
self.queue_adapter = :async

attr_reader :conference
attr_reader :track
attr_reader :streaming

def perform(*args)
# Rails.logger.level = Logger::DEBUG
logger.info('Perform CreateMediaPackageV2Job')
@streaming = args[0]
@conference = @streaming.conference
@track = @streaming.track

create_media_package_v2_resources

@streaming.update!(status: 'created')
rescue => e
@streaming.update!(status: 'error')
logger.error(e.message)
logger.error(e.backtrace.join("\n"))
end

def create_media_package_v2_resources
logger.info('Perform CreateMediaPackageV2Job')


channel_group = MediaPackageV2ChannelGroup.find_or_create_by(streaming_id: @streaming.id, name: channel_group_name)
logger.info("channel group: #{channel_group}")
channel_group.create_aws_resource

channel = MediaPackageV2Channel.find_or_create_by(streaming_id: @streaming.id, media_package_v2_channel_group_id: channel_group.id, name: channel_name)
logger.info("channel: #{channel}")
channel.create_aws_resource

origin_endpoint = MediaPackageV2OriginEndpoint.find_or_create_by(streaming_id: @streaming.id, media_package_v2_channel_id: channel.id, name: origin_endpoint_name)
logger.info("origin endpoint: #{origin_endpoint}")
origin_endpoint.create_aws_resource
end
end
12 changes: 12 additions & 0 deletions app/jobs/delete_streaming_aws_resources_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,21 @@ def perform(*args)
logger.info('Perform DeleteStreamingAwsResourcesJob')
@streaming = args[0]

delete_media_package_v2_resources

@streaming.update!(status: 'deleted')
rescue => e
logger.error(e.message)
logger.error(e.backtrace.join("\n"))
end

def delete_media_package_v2_resources
logger.info('Deleting MediaPackageV2 resources...')

@streaming.media_package_v2_origin_endpoint&.destroy!
@streaming.media_package_v2_channel&.destroy!
@streaming.media_package_v2_channel_group&.destroy!

logger.info('Deleted MediaPackageV2 resources...')
end
end
78 changes: 78 additions & 0 deletions app/models/media_package_v2_channel.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# == Schema Information
#
# Table name: media_package_v2_channels
#
# id :string(255) not null, primary key
# name :string(255)
# media_package_v2_channel_group_id :string(255)
# streaming_id :string(255) not null
#
# Indexes
#
# index_channels_on_channel_group_id (media_package_v2_channel_group_id)
# index_media_package_v2_channels_on_name (name) UNIQUE
# index_media_package_v2_channels_on_streaming_id (streaming_id)
#
# Foreign Keys
#
# fk_rails_... (streaming_id => streamings.id)
#

require 'aws-sdk-mediapackagev2'

class MediaPackageV2Channel < ApplicationRecord
include EnvHelper
include MediaPackageV2Helper

before_create :set_uuid
before_destroy :delete_aws_resource

belongs_to :streaming
belongs_to :channel_group, class_name: 'MediaPackageV2ChannelGroup', foreign_key: :media_package_v2_channel_group_id
has_one :origin_endpoint, class_name: 'MediaPackageV2OriginEndpoint'

def create_aws_resource
unless exists_aws_resource?
resp = media_package_v2_client.create_channel(channel_group_name:, channel_name:)
update!(name: resp.channel_name)
end
end

def delete_aws_resource
if exists_aws_resource?
media_package_v2_client.delete_channel(channel_group_name:, channel_name:)
loop do
break unless exists_aws_resource?
end
update!(name: '')
end
end

def exists_aws_resource?
media_package_v2_client.get_channel(channel_group_name:, channel_name:)
true
rescue Aws::MediaPackageV2::Errors::NotFoundException
false
rescue => e
logger.error(e.message)
false
end

def channel
@channel ||= media_package_v2_client.get_channel(channel_group_name:, channel_name:)
end

def ingest_endpoint_url
channel.ingest_endpoints[0].url
end

private

def conference
streaming.conference
end

def track
streaming.track
end
end
56 changes: 56 additions & 0 deletions app/models/media_package_v2_channel_group.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# == Schema Information
#
# Table name: media_package_v2_channel_groups
#
# id :string(255) not null, primary key
# name :string(255)
# streaming_id :string(255) not null
#
# Indexes
#
# index_media_package_v2_channel_groups_on_name (name) UNIQUE
# index_media_package_v2_channel_groups_on_streaming_id (streaming_id)
#
# Foreign Keys
#
# fk_rails_... (streaming_id => streamings.id)
#
require 'aws-sdk-mediapackagev2'

class MediaPackageV2ChannelGroup < ApplicationRecord
include EnvHelper
include MediaPackageV2Helper

before_create :set_uuid
before_destroy :delete_aws_resource

belongs_to :streaming
has_one :channel, class_name: 'MediaPackageV2Channel'

def create_aws_resource
unless exists_aws_resource?
resp = media_package_v2_client.create_channel_group(channel_group_name:)
update!(name: resp.channel_group_name)
end
end

def delete_aws_resource
if exists_aws_resource?
media_package_v2_client.delete_channel_group(channel_group_name:)
loop do
break unless exists_aws_resource?
end
update!(name: '')
end
end

def exists_aws_resource?
media_package_v2_client.get_channel_group(channel_group_name:)
true
rescue Aws::MediaPackageV2::Errors::NotFoundException
false
rescue => e
logger.error(e.message)
false
end
end
Loading

0 comments on commit 60827c1

Please sign in to comment.