Skip to content

Commit

Permalink
Merge pull request #444 from glasswalk3r/bugfix/uniform_sns_exception
Browse files Browse the repository at this point in the history
Using rescue to hold AWS::SNS::Client exception
  • Loading branch information
k1LoW authored Feb 11, 2019
2 parents 47e0e82 + 11b06f4 commit 42ce8a8
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 6 deletions.
48 changes: 42 additions & 6 deletions lib/awspec/helper/finder/sns_topic.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,52 @@ def to_s
end

def find_sns_topic(topic_arn)
response = sns_client.get_topic_attributes({ topic_arn: topic_arn })
SnsTopic.new(response.attributes)
# Find a SNS topic by searching from it's ARN.
# Expects as parameter the SNS topic ARN.
# Returns a Awspec::Helper::Finder::SNSTopic::SnsTopic if the topic is
# found, nil otherwise.
# If the SNS topic does not exist, AWS SDK throws an exception
# which is acceptable in some cases, but in others will generate a
# NoMethodFound during tests execution.
# In order to avoid that and follow a uniform interface, the exception
# will be captured and nil will be returned instead.
# By convention, the returned object will be checked (see check_existence
# method from Awspec::Type::Base class for an example) and an exception
# Awspec::NoExistingResource will be raised.
begin
response = sns_client.get_topic_attributes({ topic_arn: topic_arn })
puts response
topic = SnsTopic.new(response.attributes)
rescue Aws::SNS::Errors::NotFound
topic = nil
end

topic
end

def find_sns_topic_subs(topic_arn)
response = sns_client.list_subscriptions_by_topic({ topic_arn: topic_arn })
subscriptions = {}
response.subscriptions.each do |subscribed|
subscriptions[subscribed['subscription_arn'].to_sym] = subscribed
# Find a SNS topic subscribers by searching from it's ARN.
# Expects as parameter the SNS topic ARN.
# Returns a map (with keys as the subscribed ARN and the value instances
# of respective objects) if the topic is found, nil otherwise.
# If the SNS topic does not exist, AWS SDK throws an exception
# which is acceptable in some cases, but in others will generate a
# NoMethodFound during tests execution.
# In order to avoid that and follow a uniform interface, the exception
# will be captured and nil will be returned instead.
# By convention, the returned object will be checked (see check_existence
# method from Awspec::Type::Base class for an example) and an exception
# Awspec::NoExistingResource will be raised.
begin
response = sns_client.list_subscriptions_by_topic({ topic_arn: topic_arn })
subscriptions = {}
response.subscriptions.each do |subscribed|
subscriptions[subscribed['subscription_arn'].to_sym] = subscribed
end
rescue Aws::SNS::Errors::NotFound
subscriptions = nil
end

subscriptions
end
end
Expand Down
2 changes: 2 additions & 0 deletions lib/awspec/type/sns_topic.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ def subscribed(subscribed_arn)
end

def method_missing(method_name)
check_existence
# delegates the method invocation to Awspec::Helper::Finder::SnsTopic::SnsTopic class
@resource_via_client.send method_name
end
Expand All @@ -42,6 +43,7 @@ def method_missing(method_name)

def fetch_subscriptions
@subscriptions = find_sns_topic_subs(@topic_arn) if @subscriptions.nil?
raise Awspec::NoExistingResource.new(self.class, @display_name) if @subscriptions.nil?
@subscriptions
end
end
Expand Down

0 comments on commit 42ce8a8

Please sign in to comment.