Class: Jets::Resource::ApiGateway::RestApi::Routes::Change::Base

Inherits:
Object
  • Object
show all
Extended by:
Memoist
Includes:
AwsServices
Defined in:
lib/jets/resource/api_gateway/rest_api/routes/change/base.rb

Direct Known Subclasses

MediaTypes, Page, Variable

Class Method Summary collapse

Instance Method Summary collapse

Methods included from AwsServices

#apigateway, #aws_lambda, #aws_options, #cfn, #dynamodb, #logs, #s3, #s3_resource, #sns, #sqs, #sts

Methods included from AwsServices::StackStatus

#lookup, #stack_exists?, #stack_in_progress?

Methods included from AwsServices::GlobalMemoist

included

Class Method Details

.changed?Boolean

Returns:

  • (Boolean)


6
7
8
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 6

def self.changed?
  new.changed?
end

Instance Method Details

#controller_action_from_api(function_arn) ⇒ Object

TODO: If this hits the Lambda Rate limit, then list_functions also contains the Lambda function description. So we can paginate through list_functions results and store description from there if needed. Dont think this will be needed though because controller_action_from_string gets called most of the time. Also, user might be able to request their Lambda limit to be increased.



66
67
68
69
70
71
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 66

def controller_action_from_api(function_arn)
  desc = lambda_function_description(function_arn)
  controller, action = desc.split('#')
  controller = controller.underscore.sub(/_controller$/,'')
  [controller, action]
end

#controller_action_from_string(function_arn) ⇒ Object



73
74
75
76
77
78
79
80
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 73

def controller_action_from_string(function_arn)
  controller_action = function_arn.sub("#{Jets.project_namespace}-", '')
  md = controller_action.match(/(.*)_controller-(.*)/)
  controller = md[1]
  controller = controller.gsub('-','/')
  action = md[2]
  [controller, action]
end

#deployed_routesObject

Recreate routes from previously deployed stored state in s3



11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 11

def deployed_routes
  state = Jets::Router::State.new
  data = state.load("routes")
  return [] if data.nil?

  data.map do |item|
    Jets::Router::Route.new(
      path: item['path'],
      method: item['options']['method'],
      to: item['to'],
    )
  end
end

#get_controller_action(function_arn) ⇒ Object



53
54
55
56
57
58
59
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 53

def get_controller_action(function_arn)
  if function_arn.include?('_controller-')
    controller_action_from_string(function_arn)
  else
    controller_action_from_api(function_arn)
  end
end

#lambda_function_description(function_arn) ⇒ Object



82
83
84
85
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 82

def lambda_function_description(function_arn)
  resp = aws_lambda.get_function(function_name: function_arn)
  resp.configuration.description # contains full info: PostsController#index
end

#method_uri(resource_id, http_method) ⇒ Object



31
32
33
34
35
36
37
38
39
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 31

def method_uri(resource_id, http_method)
  # https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html
  resp = apigateway.get_method(
    rest_api_id: rest_api_id,
    resource_id: resource_id,
    http_method: http_method
  )
  resp.method_integration.uri
end

#new_routesObject



102
103
104
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 102

def new_routes
  Jets::Router.routes
end

#recreate_to(method_uri) ⇒ Object

Parses method uri and recreates a Route to argument. So:

"arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:112233445566:function:demo-test-posts_controller-new/invocations"

Returns:

posts#new


46
47
48
49
50
51
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 46

def recreate_to(method_uri)
  md = method_uri.match(/function:(.*)\//)
  function_arn = md[1] # IE: demo-dev-posts_controller-new
  controller, action = get_controller_action(function_arn)
  "#{controller}##{action}" # IE: posts#new
end

#rest_api_idObject

Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb



88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 88

def rest_api_id
  stack_name = Jets::Names.parent_stack_name
  return "RestApi" unless stack_exists?(stack_name)

  stack = cfn.describe_stacks(stack_name: stack_name).stacks.first

  api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")

  # resources = cfn.describe_stack_resources(stack_name: api_gateway_stack_arn).stack_resources
  stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
  lookup(stack[:outputs], "RestApi") # rest_api_id
end

#to(resource_id, http_method) ⇒ Object



26
27
28
29
# File 'lib/jets/resource/api_gateway/rest_api/routes/change/base.rb', line 26

def to(resource_id, http_method)
  uri = method_uri(resource_id, http_method)
  recreate_to(uri) unless uri.nil?
end