ようへいの日々精進XP

よかろうもん

2018 年 02 月 02 日(金)

ジョギング

  • 香椎浜 x 2 周
  • テンポは良いが、フォームを意識し過ぎてギクシャクした感じが残っている

日課

  • (腕立て x 50 + 腹筋 x 30) x 3

夕飯

  • 奥さんが外食だったので、よしもとで
  • よしもとのママにデザートをサービスして頂いた
  • 結構、お腹いっぱい食べたけど 2000 円ちょいだった...よしもと、コスパ最高である

今日のるびぃ ~ awspec の generator を追加するメモ ~

先日...

久しぶりに awspec にプルリクエストして無事にマージされたので, generator を追加する方法をメモっておく.

github.com

generator メソッドを書く

/lib/awspec/generator/spec/rds_db_parameter_group.rb を以下のように書いた.

module Awspec::Generator
  module Spec
    class RdsDbParameterGroup
      include Awspec::Helper::Finder
      def generate_by_parameter_group(parameter_group)
        @parameter_group = parameter_group
        res = select_all_rds_db_parameters(@parameter_group)
        ERB.new(db_parameter_group_template, nil, '-').result(binding).gsub(/^\n/, '')
      end

      def db_parameter_group_template
        template = <<-'EOF'
describe rds_db_parameter_group('<%= @parameter_group %>') do
<% res.each do |key, value| %>
  its('<%= key %>') { should eq '<%= value %>' }
<% end %>
end
EOF
        template
      end
    end
  end
end

select_all_rds_db_parameters メソッドで @paramater_group で指定した DB パラメータグループを取得している. select_all_rds_db_parametersaws-sdkdescribe_db_parameters をラップした Awspec::Helper::Finder モジュールメソッド.

Awspec::Helper::Finder モジュールメソッド

先述の select_all_rds_db_parameters を Awspec::Helper::Finder モジュールメソッドとして定義する.

...
def select_all_rds_db_parameters(parameter_group)
  parameters = {}
  res = rds_client.describe_db_parameters({
                                            db_parameter_group_name: parameter_group
                                          })
  loop do
    res.parameters.each do |param|
      parameters[param.parameter_name] = param.parameter_value
    end
    (res.next_page? && res = res.next_page) || break
  end
  parameters
end
...

このモジュールメソッドの修正は, 今回の generator 追加にあたっては必須では無かったけど, describe_db_parameters を awspec/lib/awspec/type/rds_db_parameter_group.rb でも呼んでいたので, コードを集約する意味で Awspec::Helper::Finder に寄せた.

awspec/lib/awspec/generator.rb に generator メソッドを追加

...
require 'awspec/generator/spec/rds_db_parameter_group'
...

awspec/lib/awspec/command/generate.rb にメソッド呼び出しを追加

...
types = %w(
  rds_db_parameter_group rds_db_cluster_parameter_group
)

types.each do |type|
  desc type + ' [parameter_name]', "Generate #{type} spec from parameter name."
  define_method type do |_parameter_name|
    Awsecrets.load(profile: options[:profile], region: options[:region], secrets_path: options[:secrets_path])
    eval "puts Awspec::Generator::Spec::#{type.camelize}.new.generate_by_parameter_group(_parameter_name)"
  end
end
...

今回は db_parameter_group と db_cluster_parameter_group を一緒に追加するので、上記のように define_method で動的にメソッドを呼ぶようにして重複コードを出来るだけ避けるようにした. この実装は既にこちらで実装されているので, それをそのまま流用した.

あとは...

テストはしっかりと.

$ bundle exec rake spec:rds_db_parameter_group
....

Finished in 0.01137 seconds (files took 1.33 seconds to load)
4 examples, 0 failures

$ bundle exec rake spec:rds_db_cluster_parameter_group
....

Finished in 0.01114 seconds (files took 1.32 seconds to load)
4 examples, 0 failures

あと, Rubocop 警察の取り締まりも.

$ bundle exec rake spec:rubocop
Running RuboCop...
Inspecting 405 files
.....................................................................................................................................................................................................................................................................................................................................................................................................................

405 files inspected, no offenses detected

generator にはテストは無いので, プルリクエスト前に generate しておくことをお薦め.

$ bundle exec awspec generate rds_db_parameter_group foo
$ bundle exec awspec generate rds_db_cluster_parameter_group bar

こんな感じで

$ bundle exec awspec generate | grep rds_
  awspec generate rds_db_cluster_parameter_group [parameter_name]  # Generate rds_db_cluster_parameter_group spec from parameter name.
  awspec generate rds_db_parameter_group [parameter_name]          # Generate rds_db_parameter_group spec from parameter name.

awspec はリソースタイプや generator の追加が簡単に行えるように実装されているので, これからも気付いたら色々と追加していけたらなあと思う.