ConoHa CLI 開発日誌 vol.2

今日のConoHa-CLIの進捗報告。
ConoHa-CLIの報告だと、上司はこのはちゃんになるのだろうか?

現状

  • 標準入力からの値取得
  • ConoHaのAPIを叩いてログイン(トークンID取得)
  • トークン情報を引き出す
  • TOMLファイルを更新

標準入力からの値取得

現在loginコマンドを実装中。
オプションでID、Password、テナントIDを入力させる作りにはしたが、
入力項目が足りない場合は標準入力から煽って入力させる作りを目指した。

参考サイト:

早速参考サイトを元に実装を行う。
優先順位の要件は下記。

  1. コマンドライン引数-tからの入力値
  2. $HOME/.conohaの設定項目
  3. 標準入力と標準出力で入力させる

まずはcmd/root.goでcobraとviperの設定を行う

1
2
3
4
5
6
7
8
9
10
11
func init() {
cobra.OnInitialize(initConfig)
RootCmd.AddCommand(versionCmd)
}
func initConfig() {
viper.AddConfigPath("$HOME")
viper.SetConfigName(".conoha")
viper.SetConfigType("toml")
viper.ReadInConfig()
}

次にcmd/login.goで各種値を取得するように設定を行う。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func init() {
rootcmd.addcommand(logincmd)
logincmd.flags().stringp("tenantid", "t", "", "port to run application server on")
viper.bindpflag("auth.tenantid", logincmd.flags().lookup("tenantid"))
}
var loginCmd = &cobra.Command{
Use: "login",
Short: "Calculator of addition.",
Long: "Calculator to perform the addition.",
Run: func(cmd *cobra.Command, args []string) {
tenantId := viper.GetString("auth.tenantId")
if tenantId == "" {
fmt.Print("tenantId: ")
fmt.Scan(&tenantId)
}
fmt.Print(tenantId)
# tenantId: test1
# test1
}
}

ConoHaのAPIを叩いてログイン(トークンID取得)

URLにアクセスする所もよく分からんから困るなあ、
とりあえずぐぐってみるとnet/httpパッケージがあるらしい。

調査中にQiitaの記事のコメント欄で凄い事を聞いてしまった。

shibukawa:
簡単なスニペットなら、僕が作ったこのサイトで作れますよ。Curlコマンドからgoのコードが生成できます。ぜひぜひ。
https://shibukawa.github.io/curl_as_dsl/

貴方が神か。
早速トークン発行ページに記載してあるcurlコマンドのサンプルをベタり。
そのままでは通らんかったのでPOSTのパラメータを削るとGoのコードが吐き出されたので丸コピー。

削ったPOSTのパラメータはfmt.Sprintfを使って作り直した。
あっさりログイン成功し、こんなに簡単に出来て良いのだろうか。
実力はついてない気がしないでもないが…

ステータスコードが200以外ならエラー文言を画面表示したい。
公式のnet/httpパッケージを見るとresp.StatusCodeがそれらしい。

トークン情報を引き出す

body部をStringに変換して表示するとJSONであった。
Qiitaの記事を参考にjson.Unmarshalで簡単に…取り出せない!?
俺はaccess.token.idを取り出したいだけなんだ!!

結局構造体を3個余分に作ってネストしていくように実装した。
この辺は要課題だね。

TOMLファイルを更新

ここまでくれば余裕だろ。なに?ファイルに書き込めないだと?
どうやら$HOMEをよしなに解決してくれるのはViperの便利機能であって、自前でファイルに書き込む時はenvやosパッケージを参考に引っ張ってくる必要があるらしい。

実はviperも読み込めてませんでした

最初は$HOME/.conohaにしようと思ってたのだが、
viperのconfigファイルは開幕ドットの隠しファイルはNGらしい。
設定次第で行けるのか?よくわからん…苦戦の末$HOME/.config/conoha.tomlで妥協。

しかし、美雲このはからコノハ=トムルに改名する緊急事態である。
面白そうだからいいか

Next

ログインコマンドは概ね実装が完了したので、次回はモジュールの整理。
今回のJSON解析でトークンの有効期限を文字列で取得することに成功した。
次は一度トークンを確認してから実行するようにしたい。