Yet Another OpenStack Wrapper in Ruby - YAO 소개

9187 단어 openstack루비
OpenStack 어드벤트 캘린더의 참가 기사입니다. 지난번은 Trove 이야기이었습니다.

회사(페파보)의 엔지니어로 개발하고 있는 OSS의 Ruby 라이브러리, YAO의 소개를 합니다.

YAO란?




Yet Another Openstack ruby wrapper의 약자입니다. 로고도 만들었습니다.

실은, Ruby 경계에서는 이하와 같은 선행하는 구현이 있었습니다만,
  • fog
  • ruby-openstack

  • fog는 멀티 클라우드 대응 전제의 라이브러리로 의존이 많고, ruby-openstack는 보수가 되어 있지 않다, 라고 하는 것으로 어느쪽도 미묘하게 가려운 곳에 손이 닿지 않는 상태였습니다.

    라는 것으로, 자작해 버렸습니다. 설계 사상은 다음과 같습니다.
  • 낮은 의존성
  • 리소스 지향 설계

  • 이런 식으로 사용합니다.



    자원 지향이라고 하는 것으로, 이하와 같은 자원을 표현하는 클래스를 간단한 DSL를 이용해 쓸 수 있습니다. OpenStack의 API는 아름다운 RESTful이므로 할 수있는 기술이라고 생각합니다.

    flavor.rb
    module Yao::Resources
      class Flavor < Base
        # JSONのキーのうち、属性のように使ってアクセスしたいものを列挙できる
        friendly_attributes :name, :vcpus, :disk, :swap
    
        # 拡張によってはキーの形式が特殊なので、それにも対応
        map_attribute_to_attribute "os-flavor-access:is_public" => :public?
        map_attribute_to_attribute "OS-FLV-DISABLED:disabled"   => :disabled?
    
        # 普通のメソッドは普通に定義する
        # self#[] で、元となるJSONのデータを参照できる
        def ram(unit='M')
          case unit
          when 'M'
            self["ram"]
          when 'G'
            self["ram"] / 1024.0
          end
        end
        alias memory ram
    
        # API として使うサービス(compute, network, identity...)を指定
        self.service        = "compute"
    
        # RESTful URL に出てくるリソース名を指定。複数形が自力なのは要改善...
        self.resource_name  = "flavor"
        self.resources_name = "flavors"
      end
    end
    
    Yao.configure 블록에서 OpenStack에 필요한 매개 변수를 설정하고,
    Yao.configure do
      auth_url    "http://keystone.example.local:8080/v2.0/tokens"
      tenant_name "fooproject"
      username    "udzura"
      password    "tonk0tsu-r@men"
    end
    
    list 이다 create 를 두드리면 해당 API를 두드립니다.
    Yao::Flavor.list
    # => [#<Yao::Resources::Flavor>, #<Yao::Resources::Flavor>, ...]
    
    f = Yao::Flavor.get(10)
    # => #<Yao::Resources::Flavor:0x007f9b159828a0 @data={... "id"=>"10"}>
    f.name
    # => "r1.2xlarge"
    

    이런 사용법



    페파보 사내의 OpenStack 기반(Nyah이라고 부릅니다)의 운용 주위의 툴을 중심으로, OSS(RubyGems)로서 내고 있는 것은 이런 느낌입니다. 또한 아이와 비슷합니다. 그리고 ls의 AWS 도구 그룹에 매우 영향을 받았습니다

  • ... KeyStone 사용자 관리를 코딩하는 도구

  • 울타리 ... 보안 그룹을 코딩하는 도구

  • pec ... 인스턴스의 스펙을 YAML로 쓰면, 그대로의 인스턴스를 시작하는 툴.

  • stackspec ... serverspec 또는 awspec과 같이 OpenStack 리소스가 제대로 서 있는지 확인하는 도구입니다. WIP.

  • 최신 작품 인 stackspec은 조금 흥미 롭고 현재 이러한 테스트 코드를 작성하면 :

    server_spec.rb
    describe server('stackspec.example.com') do
    
      its(:name)            { should eq 'stackspec.example.com' }
      its(:key_name)        { should eq 'sample001' }
    
      its(:security_groups) { should have(4).security_groups }
      it { should have_security_group(name: "https") }
    
      its('flavor.id')      { should eq '8' }
    
    end
    

    이런 느낌의 출력을 해줍니다.
    $ rspec spec/tenant_name/server_spec.rb
    OpenStack server "stackspec.example.com"
      should have security group {:name=>"https"}
      name
        should eq "stackspec.example.com"
      key_name
        should eq "sample001"
      security_groups
        should have 4 security_groups
      flavor.id
        should eq "8"
    
    Finished in 2.36 seconds (files took 0.2018 seconds to load)
    5 examples, 0 failures
    

    OpenStack 테넌트 내에서 구축이 잘 되었습니까? 라고 하는 것을 검사하거나, 있어야 할 구성을 먼저 테스트로 써 TDD 하거나... 라고 꿈이 있을 것 같습니다. RSpec을 사용하기 때문에 Ruby 같음도 있습니다. WIP이므로 내년에 노력하겠습니다 ....

    참고



    실은 이전 기사를 쓰고 있습니다.
  • RubyWorld Conference 2015에 등단하여 OpenStack의 노력에 대해 이야기했습니다.

  • 타이밍 등 여러가지로, OpenStack Summit등에서는 발표하고 있지 않습니다만, 언젠가는...이라고 생각하고 있거나 합니다.

    그렇다고 해서, 꼭 라이브러리, 툴 모두 시험해 주시면 좋겠습니다.

    내일은 tmak_tw 씨입니다!

    좋은 웹페이지 즐겨찾기