いろいろな事情から作っている。
- 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
以上の良いソリューションを考えないといけない。
そんな感じでたまにこのシリーズを連載予定。