OpSource インタフェース・メソッド
このページでは、OpSource Cloud へのインタフェースのためのメソッドを説明します。この API の情報は下記のリンクから集めました:
http://opsourcecloud.net/
http://community,opsourcecloud.net/ Documentation、API セクションへ移動します。 サンプルは OpSource REST API v09 をベースにしています。
Tap In Systems は OpSource Cloud サービスに問い合わせたりコントロールするために、これらの仕様に則って REST 呼び出しを行う Ruby テンプレートのセットを作成しました。通常、これらの呼び出しには、認証のためのユーザ ID とパスワードが必要です。
下記のコードは、組織(organization)ID を保存し、アカウント情報を取得します。 OpSource のアカウントの user と password は、入力仕様の一部として渡されます。その後、それらは API への http REST 呼び出しの中で基本認証アトリビュートとしてセットされます。
$:<< '.\jrubylib' $:<< '.\jrubylib\jruby-openssl-0.5.2\lib' require 'rubygems' require 'net/https' require 'rexml/document' require 'uri' require 'digest/md5' require 'time' vcloud_user = $user vcloud_password = $password begin # begin exception processing puts "--------------------------------------------------------------------------------" url = URI.parse('https://api.opsourcecloud.net/oec/0.9/myaccount') req = Net::HTTP::Get.new(url.path) req.basic_auth vcloud_user, vcloud_password req.add_field('Content-Length','0') tmp = Net::HTTP.new(url.host, url.port) tmp.use_ssl = true tmp.verify_mode = OpenSSL::SSL::VERIFY_NONE res = tmp.start {|http| http.request(req) } token = "none" orgId = 0 case res when Net::HTTPSuccess, Net::HTTPRedirection # OK # puts "body:\n"+res.body doc = REXML::Document.new(res.body) doc.elements.each('ns3:Account/ns3:orgId') do |ele| puts "orgId=#{ele.text}" orgId = ele.text end else puts "error="+res.error! end $myself.add "user",$user $myself.add "password",$password $myself.add "orgId",orgId rescue Exception => e puts "Exception error #{e.message}" end
この呼び出しからの応答例を下記に示します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns3:Account xmlns:ns2="http://oec.api.opsource.net/schemas/organization" .. > <ns3:userName>rdyer</ns3:userName> <ns3:fullName>Joe Public</ns3:fullName> <ns3:firstName>Joe</ns3:firstName> <ns3:lastName>Public</ns3:lastName> <ns3:emailAddress>jpublic24583@pop.net</ns3:emailAddress> <ns3:orgId>1831c1a9-9c03-44df-a5a4-f2a4662d6bde</ns3:orgId> <ns3:roles> <ns3:role> <ns3:name>primary administrator</ns3:name> </ns3:role> </ns3:roles> </ns3:Account>そして、アカウントのアトリビュート付きの応答が Ruby REXML gem を使って XML からパースされます。組織 ID は保存され、このアカウントのために配備されたサーバを読み出すために、次の Ruby 呼び出しに渡されます。下記にリストサーバを呼び出すコードを示します。 最初の呼び出しからの組織 ID が、この API 呼び出しを行うのに必要であることに注意ください。
$:<< '.\jrubylib' $:<< '.\jrubylib\jruby-openssl-0.5.2\lib' require 'rubygems' require 'net/https' require 'rexml/document' require 'uri' require 'digest/md5' require 'time' vcloud_user = $myself.get "user" vcloud_password = $myself.get "password" orgId = $myself.get "orgId" begin # begin exception processing puts "--------------------------------------------------------------------------------" url = URI.parse("https://api.opsourcecloud.net/oec/0.9/#{orgId}/server") req = Net::HTTP::Get.new(url.path) req.basic_auth vcloud_user, vcloud_password req.add_field('Content-Length','0') tmp = Net::HTTP.new(url.host, url.port) tmp.use_ssl = true tmp.verify_mode = OpenSSL::SSL::VERIFY_NONE res = tmp.start {|http| http.request(req) } serverHash = Hash.new case res when Net::HTTPSuccess, Net::HTTPRedirection # OK # puts "body:\n"+res.body doc = REXML::Document.new(res.body) doc.elements.each('Servers/Server') do |ele| puts "id=#{ele.elements['id'].text}, name=#{ele.elements['name'].text}" serverHash[ele.elements['id'].text] = Hash.new if serverHash[ele.elements['id'].text].nil? ele.elements.each { |ele2| if ele2.name.eql?('operatingSystem') then ele2.elements.each { |ele3| serverHash[ele.elements['id'].text][ele2.name+":"+ele3.name] = ele3.text } else serverHash[ele.elements['id'].text][ele2.name] = ele2.text end } end else puts "error="+res.error! end rescue Exception => e puts "Exception error #{e.message}" end $process_servers = false serverHash.keys.each { |ele| puts ele serverHash[ele].each { |key,value| puts "\t#{key}=#{value}" } $process_servers = true } $outHash = serverHash
サーバをリストするための API 呼び出しからの応答を下記に示します。 XML をパースし、その結果をハッシュ構造体に入れます。それは、将来のコントロールプランのタスクで使用されるかも知れません。開始(start)、停止(stop)、リスタート(restart)、配備(deploy)やストレージ追加(add storage)などのサーバ操作を実施するために、サーバ ID のフィールドを使用することができます。 これらの呼び出しの使い方については、自動化のサンプルセクション を参照してください。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Servers xmlns:ns2="http://oec.api.opsource.net/schemas/organization" ..> <Server> <id>37605271-d650-4d8e-a0b0-ad46b25d0952</id> <name>10-147-16-11</name> <description>ApiDocTest</description> <vlanResourcePath>/oec/1831-a33d/network/9dd23-afd3</vlanResourcePath> <imageResourcePath></imageResourcePath> <operatingSystem> <type>UNIX</type> <displayName>REDHAT5</displayName> </operatingSystem> <cpuCount>1</cpuCount> <memory>2048</memory> <osStorage>30</osStorage> <additionalLocalStorage>0</additionalLocalStorage> <machineName>10-147-17-33</machineName> <privateIPAddress>10.147.16.11</privateIPAddress> <isDeployed>true</isDeployed> <isStarted>false</isStarted> <created>2009-09-25T10:43:22.105Z</created> </Server> </Servers>