読者です 読者をやめる 読者になる 読者になる

ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

OpenStack クライアント開発日記 (1)

github.com

いろいろな事情から作っている。

  • fog というものがあって、社のOpenStack系ツールでgemのものはこれを使っているが、ものすごい数の依存gemがあり、fog-openstackへの切り出しの動きは非常に鈍く思えるので、なんというか、いかつい。
  • openstack-ruby は最終更新が2013年で、これを頑張って使おうという気にはなれない...

OpenStack API Documentation などを眺めれば分かる通り、OpenStackのAPIは基本的には非常に綺麗なRESTにしたがっている。なので、自分でスクラッチで書いてもそんなに手間じゃないのでは??と思って書いてみているという話。

方針は:

  • 依存をなるべく少なく
  • メタプロもなるべく...少なく?

進捗

規約に従ってREST APIをレスティに叩くためのメソッドを定義(list, find, create, update, delete, おまけで list_detail)し、サブクラスでパラメータ的な箇所をこうやって指定。

module Oslo::Resources
  class Server < RestfulResources
    self.service        = "compute"
    self.resource_name  = "server"
    self.resources_name = "servers"
  end
end

依存を少なくするんだ!!! と思っているので、 ActiveSupport::Inflector の機能は使いたくない... でも同じようなものを自分で書くことになるんかな...

これでインスタンス一覧が取得OK。詳細もOK。

Oslo::Resources::Server.list
=> [{"id"=>"546143ff-7b7c-4423-9bcf-ce193b74e5ef",
  "links"=>
   [{"href"=>"http://nova.exapmle.com:8080/v2/b598bf98671c47e1b955f8c9660e3c44/servers/546143ff-7b7c-4423-9bcf-ce193b74e5ef", "rel"=>"self"},
    {"href"=>"http://nova.exapmle.com:8080/b598bf98671c47e1b955f8c9660e3c44/servers/546143ff-7b7c-4423-9bcf-ce193b74e5ef", "rel"=>"bookmark"}],
  "name"=>"yum-test001.heteml.jp"},
 {"id"=>"c23d5cd8-7c79-4df0-a5a2-1f242bea56c1",
  "links"=>
   [{"href"=>"http://nova.exapmle.com:8080/v2/b598bf98671c47e1b955f8c9660e3c44/servers/c23d5cd8-7c79-4df0-a5a2-1f242bea56c1", "rel"=>"self"},
    {"href"=>"http://nova.exapmle.com:8080/b598bf98671c47e1b955f8c9660e3c44/servers/c23d5cd8-7c79-4df0-a5a2-1f242bea56c1", "rel"=>"bookmark"}],
  "name"=>"zipper-test.local"},
 {"id"=>"1f8733f7-2f49-4ee5-b633-9ac064e4274e",
  "links"=>
   [{"href"=>"http://nova.exapmle.com:8080/v2/b598bf98671c47e1b955f8c9660e3c44/servers/1f8733f7-2f49-4ee5-b633-9ac064e4274e", "rel"=>"self"},
    {"href"=>"http://nova.exapmle.com:8080/b598bf98671c47e1b955f8c9660e3c44/servers/1f8733f7-2f49-4ee5-b633-9ac064e4274e", "rel"=>"bookmark"}],
  "name"=>"ryoshin-proxy.exapmle.com"},
#...
]

そしてこれだけでGET系はかなりのリソースをカバーできるっぽいことを確認。

ただ、POST系はパラメータが多すぎてまだ動かせていない...スマートに書く方法を考えている。

さらに言うと、レスポンスはJSONをピュアにパースしただけのHashなので、もっとオブジェクトっぽく触れないと面倒くさそうだ。これも、いろんな形のJSONがあるんで、 OpenStruct 以上の良いソリューションを考えないといけない。


そんな感じでたまにこのシリーズを連載予定。