GoでOpenStackを操作する

OpenStackを操作するGoのSDKとして、OpenStackコミュニティ側にGoのSDKがあります。現在は残念ながら開発は止まっているようです。その代わりにRackspaceが開発を行っているGopher CloudがOpenStack用のGoのSDKとして活発に開発が行われています。

http://gophercloud.io/

今回はこのGopher Cloudを利用して、Goを使ってOpenStackの操作を行いたいと思います。

インストール

Goは以下からDownloadしてインストールを行います。主要Platformではインストーラー形式で提供されています。

https://golang.org/dl/

環境変数GOPATH配下にパッケージがインストールされるため、まずは環境変数を設定しておきます。自分で作成するのコードはsrc配下にフォルダ等を作成して配置します。githubアカウントがある場合はgithub.com配下にアカウント名でフォルダを作成するか、github側の自分のレポジトリを作ってgo getしても良いです。その後以下のコマンドでgophercloudのインストールを行います。これにより、$GOPATH/src/github.com/rackspace/gophercloud配下にコードがDownloadされます。

go get github.com/rackspace/gophercloud


認証

インストール後実際にSDKを利用してコードを書いて行きますが、まずは認証情報を受け渡します。認証情報からAuthenticateClientを呼び出して、ProviderClient構造体を受け取ります。ProviderClientの中にはEndpoint一覧やToken等のAPIで直接token取得した時の情報が含まれています。

認証情報を値で受け渡す

認証情報を値で受け渡す場合は以下のコードになります。test.goのように保存して、go runで直接実行か、go buildで実行形式に変えて実行出来ます。認証情報等はコードに埋め込まずにflag等を用いてコマンドラインのオプションとして受け渡す事も出来ます。

package main
import (
     "fmt"
     "github.com/rackspace/gophercloud"
     "github.com/rackspace/gophercloud/openstack"
)

func main(){
  opts := gophercloud.AuthOptions{ 
      IdentityEndpoint: "https://my-openstack.com:5000/v2.0",
      Username: "{username}", 
      Password: "{password}", 
      TenantName: "{tenant_id}", } 
  provider, err := openstack.AuthenticatedClient(opts) 
  if err != nil{
      return
  }
   fmt.Println(provider)
}

環境変数で値を受け渡す

認証情報を環境変数で受け渡す場合は以下のコードになります。

package main
import ( "fmt"
         "github.com/rackspace/gophercloud/openstack"
)

func main(){
   opts, err := openstack.AuthOptionsFromEnv()
   if err != nil{
      return
   }
   provider, err := openstack.AuthenticatedClient(opts)
   if err != nil{
      return
   }
   fmt.Println(provider)
}

Computeへの接続

認証情報が得られましたので、例としてComputeを操作します。まずはCompute等の各Project毎に先ほど取得した、ProviderClientからClientを作成して接続を行います。

client, err := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{
	Region: "RegionOne",
})

このClientを利用して各種Computeを操作する関数を呼び出します。

サーバー一覧の取得

このClientを利用すればフレーバー一覧等の各種情報が取得が出来ますが、今回はサーバー一覧を取得します。一覧はPaginationの形式で帰って来るので一覧を表示したい場合はfor文で値を取得します。今回は名前だけを一覧表示します。

package main

import (
   "flag"
   "fmt"

   "github.com/rackspace/gophercloud"
   "github.com/rackspace/gophercloud/openstack"
   "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
   "github.com/rackspace/gophercloud/pagination"
)

func main()  {
   optUrl := flag.String("url", "http://localhost:5000/v2.0","Hostname")
   optUser :=  flag.String("user", "admin", "User")
   optPassword := flag.String("password", "password", "Password")
   optTenant := flag.String("tenant", "admin", "Tenant")
   flag.Parse()

   opts := gophercloud.AuthOptions{
      IdentityEndpoint: *optUrl,
      Username: *optUser,
      Password: *optPassword,
      TenantName : *optTenant,
   }

   provider, err := openstack.AuthenticatedClient(opts)
   if err != nil{
      return
   }
   client, err := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{
      Region: "RegionOne",
   })
   if err != nil{
      return
   }

   pager := servers.List(client, nil)

   pager.EachPage(func(page pagination.Page) (bool, error) {
      serverList, err := servers.ExtractServers(page)
      if err != nil {
         return false, err
      }
      for _, s := range serverList {
         fmt.Println(s.Name)
      }
      return true, nil
   })
}

まとめ

SDKでどのような構造体を返してくれるのか、どのような構造体を期待しているのかを気にしながらコードを各必要があります。今回はGitHub上のGopher Cloudのコードから構造体を確認しつつ説明しています。

広告
GoでOpenStackを操作する

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中