ラベル rspec の投稿を表示しています。 すべての投稿を表示
ラベル rspec の投稿を表示しています。 すべての投稿を表示

2015年4月26日日曜日

ネットワークプログラマビリティ勉強会 #4 @GMO Yours

ネットワークプログラマビリティ勉強会 #4 @GMO Yours

開催概要

他のかたのまとめ

いろいろまとめられているので、全体的なのは他のかたのメモを参照してください。

感想

今回は、LTの発表をしたせいで、あまり他の人の発表をこころの余裕をもって聞くことができませんでしたが、 自分としては発表することで自分が知りたい内容がしれたのでよかったと思います。
一番大きい収穫は、この勉強会にどのような人が来ているか?ということがわかったことです。 「ネットワークエンジニア」というのは、範囲が非常に広いので、発表者がどのような人をターゲットに話をしたら いいのかが難しいと思っていたからです。
今回の超おおざっぱな私の集計によると、次のようになっています。(重複含む。全体人数は100人くらい)
TypeRelated toHow many people at this study?
SDNOpenFlow, OpenStack20 people
InternetBGP10 people
IntranetWAN, Inter DC15 people
DC internalFirewall, Load balancer,L2/L3 switch30 people
Platform ServiceDNS, mail, proxy20 people
ServerLinux, Windows,20 people
ApplicationWeb Service, Mail Service10 people
全体として、SDNとかをいま使っている人は20%くらいで、80%の人はSDNとかに興味はあるけど、 いまの活動としてはあまり使っていないということでした。 DNS, mailとかの基盤サービスをやっている人も結構いて、「ネットワークエンジニア」が広いということがわかりました。 (自分の中の仮説どおりです。)
よかったことと、改善できたらいいな ということをまとめるとこんな感じです。

よかったこと

  • #npstudy というハッシュタグがついたことで、いろいろ情報がまとまったこと
  • どんな人が参加しているかがわかったこと
  • 具体的なプログラミングのことになると、けっこう、一歩引いてしまうということがわかったこと
  • 会場設備がよくて、Wifiやドリンクも提供していただいたこと(GMOさんありがとうございます)

改善できたらいいな ということ

  • 終了がギリギリになってしまって、懇親があまりできなかったこと
    • LTでは質問を受け付けず、会場での懇親の場(30分でも)で聞いてくださいのほうがよかったかもですね

発表

自分の気持ち的に、全体の発表はあまり見れなかったので、自分の発表のところだけ。。

ネットワークのテスト自動化(Network Test Automation) @otahi


ネットワークテストの自動化して、インシデント対応などでの「ダブルチェック」の再発防止を減らしていきたい。 そういう感じで話をしました。
自前のテスト自動化ツールなどの紹介をしたので、「なんだ」と思ったかたもいたと思いますが、 OSSなので、自分で書き換えれば、もっとよくなりますよ! ということで。。
今回紹介したツールは、以下のとおりです。(上の2つ以外は自作ツールです。)
TypeTest targetRemarks
ServerspecServers(static)
InfratasterServers(dynamic)
Infrataster-plugin-dnsDNS servers
Infrataster-plugin-firewallFirewallsTraget server needs: tcpdump, netcat
LbspecLoad Balancers(L4-L7)Target server needs: ngrep, netcat
RSpec-ssltlsSSL/TLS

今回紹介しなかったですが、RSpec-proxypac というproxy.pacをテストするツールもあります。

将来的にはOpenFlowを使って、TDDできるとおもしろいかなと思っています。
Trema に興味をもって、Rubyを始めたので、そろそろTremaに恩返しをしたいとは思っています。

スライドは適当な「英語」で書いていますが、私のボキャブラリの範囲なので、 難しいことはないと思います(英語的に意味がわからないことはあるかもしれませんが)。
なぜ、英語で書いたかというと、せっかく書くのだから 「スライドだけ」でも他の人にも見てもらえたらな と思ったからです。 OSSのツールを広めるのであれば、英語圏(全世界)の人が見てくれたほうがいいですよね。
このスライドに対して、2015/4/23に発表して、2015/4/26 07:22現在で、USからのアクセスもそれなりにありますので、 英語で書いておいて、効果はあったかな と(とはいえ、このblog記事を英語ではかけなかった。。)。
  • Top countries
NameViews
Japan464
United States68
Canada5
France4
Philippines2


Happy network life!!!

2014年3月17日月曜日

LoadBalancerもRSpecで定義: Lbspec

LoadBalancerのspecは、あるリクエストに対して、期待するレスポンスを返すか という表現では不十分である。実際にnodeにリクエストが到達するか ということを表現しなければいけない。そこで、LbspecというRSpecのMatcherを作った。これを使うと、LoadBalancerがnodeにリクエストを転送することをRSpecの書式で表現できる。

これでLoadBalancerもRSpecで定義できるはず。。

リンク

Installation

Gemfileに書く:

gem 'lbspec'

bundlerを実行する:

$ bundle

もしくはgem installする:

$ gem install lbspec

Requires

  • nodeにsshで入れる(~/.ssh/configなどで定義されている)

Usage

こんな感じで spec_helper.rbで require lbspec する:

# spec/spec_helper.rb
require 'rspec'
require 'lbspec'

あとはSpecを記述する:

require_relative 'spec_helper'

describe 'vhost_a' do
  it { should transfer('node_a') }
end

describe 'vhost_b' do
  it { should transfer(['node_b','node_c']) }
end

describe 'vhost_c:80' do
  it { should transfer(['node_b','node_c']).port(80) }
end

describe 'vhost_c:80' do
  it { should transfer(['node_b','node_c']).port(53).udp }
end

describe 'vhost_c:80' do
  it { should transfer('node_c').http.path('/test/') }
end

describe 'vhost_c:443' do
  it { should transfer(['node_b','node_c']).port(80).https.path('/test/') }
end

How it works

#transfer

  1. nodeにsshでログインする
  2. nodeでprobeをキャプチャーする
  3. probeを使ってリクエストを投げる(or パケットを投げる)
  4. nodeにprobeが来ているかで判定する

ここで、nodeではコマンドを実行しているだけなので、nodeに特別なプログラムを入れる必要はない。(ngrepとかtcpdumpが簡単かもしれないが、access.logをgrepするのほうが簡単かもしれない。)

#tranfer works

Configuration

#transfer

キャプチャとリクエストを投げる方法はカスタマイズできる。なので、キャプチャ方法を定義して、自分で投げたいリクエストを生成できる。

RSpec.configuration.lbspec_capture_command =
  lambda do |port, prove|
  port_str = port > 0 ? "port #{port}" : ''
  "sudo ngrep #{prove} #{port_str} | grep -v \"match:\""
end

RSpec.configuration.lbspec_https_request_command =
  lambda do |addr, port, path, prove|
  uri = 'https://' + "#{addr}:#{port}#{path}?#{prove}"
  system("curl -o /dev/null -sk #{uri}")
end

カスタマイズできるのは次のコマンド。

  • lbspec_capture_command with |port, prove|
  • lbspec_udp_request_command with |addr, port, prove|
  • lbspec_tcp_request_command with |addr, port, prove|
  • lbspec_http_request_command with |addr, port, path, prove|
  • lbspec_https_request_command with |addr, port, path, prove|

2013年8月24日土曜日

RSpecを使ってDNSのテストを自動で実施する方法

DNSのテストを素早く回すことができるrspec-dnsというのがあるので紹介する。 これを使えば、DNSを変更するときにだいぶ安心できるはず。

使うもの

どのように書くのか?

次のように update_config でDNSを指定する。(config/dns.ymlというのを更新するので、なにもやらなければ、config/dns.ymlに記載されているまま) レコードごとにspecを記載していく。 複数のDNSをテストしたい場合は、 update_config でDNSを指定していく。

実行のやり方

  • git clone
    • % git clone -b example https://github.com/otahi/rspec-dns.git
  • move into example directory and run
    • % cd rspec-dns/example
    • % rvm use 1.9.3
    • % bundle install --path=vendor/bundle --binstubs=vendor/
    • % bundle exec rspec -c -f doc

どのような出力になるか?

% bundle exec rspec -c -f doc 

github.com
  should have the correct dns entries with {:type=>"A", :address=>"192.30.252.128"}
  should have the correct dns entries with {:type=>"A", :address=>"192.30.252.129"}
  should have the correct dns entries with {:type=>"A", :address=>"192.30.252.130"}
  should have the correct dns entries with {:type=>"A", :address=>"192.30.252.131"}
  should have the correct dns entries with {:type=>"A", :address=>"204.232.175.90"}
  should have the correct dns entries with {:type=>"A", :address=>"207.97.227.239"}
  should have the correct dns entries with {:type=>"MX", :exchange=>"ASPMX.L.GOOGLE.com", :preference=>10}
  should have the correct dns entries with {:type=>"MX", :exchange=>"ALT1.ASPMX.L.GOOGLE.com", :preference=>20}
  should have the correct dns entries with {:type=>"MX", :exchange=>"ALT2.ASPMX.L.GOOGLE.com", :preference=>20}
  should have the correct dns entries with {:type=>"MX", :exchange=>"ASPMX2.GOOGLEMAIL.com", :preference=>30}
  should have the correct dns entries with {:type=>"MX", :exchange=>"ASPMX3.GOOGLEMAIL.com", :preference=>30}
  should have the correct dns entries with {:type=>"NS", :name=>"ns1.p16.dynect.net"}
  should have the correct dns entries with {:type=>"NS", :name=>"ns2.p16.dynect.net"}
  should have the correct dns entries with {:type=>"NS", :name=>"ns3.p16.dynect.net"}
  should have the correct dns entries with {:type=>"NS", :name=>"ns4.p16.dynect.net"}
  should have the correct dns entries with {:type=>"TXT", :data=>"v=spf1 include:_spf.google.com include:_netblocks.zdsys.com include:sendgrid.net include:mailgun.org include:smtp.github.com ~all"}
  should have the correct dns entries with {:type=>"SOA", :mname=>"ns1.p16.dynect.net", :rname=>"hostmaster.github.com", :refresh=>3600, :retry=>600, :expire=>604800, :minimum=>60}

Finished in 2.4 seconds
17 examples, 0 failures
% 

Reference