sacloud / libsacloud Goto Github PK
View Code? Open in Web Editor NEW[Deprecated] Library for SAKURA Cloud API with Go
License: Apache License 2.0
[Deprecated] Library for SAKURA Cloud API with Go
License: Apache License 2.0
現在はbuilderパッケージ配下にFrom...
のような関数群がぶら下がっているが、
builderパッケージの対象がサーバー/ディスク以外に拡大した場合に対応できない。
操作対象のリソース名を関数名プレフィックスとする。
サーバーの場合Server...
など。
(a part of #155)
Declarative Approachの構成要素を検討する。
design/tools/
配下にドキュメントを追加Protocol Buffers
+ protoc
+ custom plugin
protoc-gen-swagger
)JSON Schema
+ generatorDSL
(like a usacloud's approach)現状のlibsacloudには次のような課題がある。
これらを解決するため、libsacloud v2として再設計/再実装する。
libsacloudのクライアントは基本的にCore Domain Layerのモデルを操作する。
ただし、例外的にIaaS Layerを直接操作する手段も提供する。
It is necessary to specify an empty array in the parameter Settings.Servers of API POST / commonserviceitem for GSLB.
libsacloudクライアント側でテストを書く際にモデルの値の記載が行いにくい。
なるべく構造体リテラルで記載できるような方法を検討する。
sw := sacloud.Switch{}
sw.ID = 999
sw.Name = "dummy"
sw := sacloud.Switch {
ID: 999,
Name: "dummy",
}
usacloudやterraform-provider-sakuracloudから高レベル操作を切り出してlibsacloudに追加する。
さくらのクラウドAPIが提供するモデルについては対応する構造体を用意する。
未実装のAPIのうち、利用頻度が高そうなものを追加実装する
GET/auth-status
(認証状態の取得)GET/bill*
(請求関連状態)以下機能を含むMakefileを整備する。
os_type
への追加Sample(Low-Level API)の一部のコードが動作しないものを修正する。
READMEに書かれているSample(Low-Level API)のコードの実行でコンパイルエラーがでる。
./main.go:81: cannot use hostName (type string) as type *string in assignment
./main.go:82: cannot use password (type string) as type *string in assignment
./main.go:84: cannot use script.Resource.ID (type int64) as type string in argument to diskConf.AddNote
変更前(81行~84行)
diskConf.HostName = hostName
diskConf.Password = password
diskConf.SSHKey.PublicKey = sshPublicKey
diskConf.AddNote(script.ID)
変更後(81行~84行)
diskConf.HostName = &hostName
diskConf.Password = &password
diskConf.SSHKey.PublicKey = sshPublicKey
diskConf.AddNote(string(script.ID))
実行すると83行目のdiskConf.SSHKey.PublicKey = sshPublicKey
で以下のエラーで落ちる
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x38 pc=0x2a56]
この行に関係するものをコメントアウトして実行すると84行目のdiskConf.AddNote(string(script.ID))
で以下のエラーで落ちる
panic: strconv.ParseInt: parsing "�": invalid syntax
この行に関係するものをコメントアウトして実行すると落ちることなく実行された。
最終的なコード Gist
そこでこれらの項目がきちんと動作するようにする。
GET /auth-status
APIコールで以下のエラーが発生する。
json: cannot unmarshal number into Go struct field Account.ID of type string
戻り値のデータ型が変更された可能性あり。
related: #155
v2のドキュメントをdocsディレクトリ配下にまとめる
(from sacloud-archives/libsacloud-v2#37)
いくつかのデータ型がv1と互換性がなく、json.Unmarshalの失敗などが原因でv2で作成されたリソースをv1から参照できないことがある
例:
v1/v2両面から対応を検討しておく。
以下コミットにて対応済み
71dd269
石狩第1ゾーンのみ、スイッチを接続済みのブリッジをAPIで参照するとJSON変換エラーとなる。
以下のようにbridge.Switches[0].IDが文字列となる模様。
{
"Bridges": [
{
"ID": xxxxxxxxxxxx,
"Info": {
"HybridConnection": {
// 省略
},
"Switches": [
{
"ID": "xxxxxxxxxxxx",
// 省略
}
]
},
現時点ではAPIを直接コールしても数値型となっているため、さくらのクラウド側の一時的な問題だったのかも。
データ型の統合/整理
(from sacloud-archives/libsacloud-v2#35)
現在のfakeドライバーはインメモリでデータを保持している。
このためプロセス終了時にデータは破棄される。
これをローカルファイルをバックエンドとした永続化に対応することによりusacloudやterraformなどでのユーザーによる開発/テストを容易にする。
Add /internet/:internetid/subnet
APIs(POST/PUT/DELETE
) to the api.InternetAPI
for fix this issue
タグを利用したメタデータの指定を行えるようにする。
利用イメージ:
s := api.Server.Read(id)
// メタデータの追加
meta := &sacloud.Metadata{
Namespace: "foo",
Label: "bar",
Value: "baz",
}
s.AddMetadata(meta)
// s.Tags = ["foo:bar=baz"]
golint
でのエラーに全て対応する。
v1.0.0リリースに合わせ、後方互換をなくす変更になる可能性もあるが、対応する。
レプリカ(slave)作成後、コピー中のまま作成が完了しない
現行の仕組みだと待ち時間の設定次第ではタイムアウト処理が発火しない。
src:
libsacloud/api/load_balancer.go
Lines 279 to 304 in 3e57070
time.Tick
とtime.After
を組み合わせる方法に修正する。
TravisCI対応を行う
API自体の基本的な使い方などはGodocで整備するつもりのため、
README.md
には簡単な概要説明や他プロジェクトへの組み込み方法などを中心に記載する。
Pullリクまで作れなくてごめんなさい。
Issueを立てさせていただきます。
2018/08/27 19:32:43 [libsacloud:Client#request] method : "PUT" , url : https://secure.sakura.ad.jp/cloud/zone/is1b/api/cloud/1.1/disk/<リソースID>/install ,
body : {
"Description": "",
"SourceArchive": {
"ID": <アーカイブリソースID>,
"Description": "",
"Tags": null,
"Icon": null
},
"Icon": null,
"Tags": null,
"Storage": {
"DiskPlan": {
"Description": ""
}
}
}
以下の形式で渡す必要があると思います。
{"Disk":{"SourceArchive":{"ID":<アーカイブリソースID>}}}
渡しているjsonがDiskの中にある必要があると思われます。
このあたりで、適当な構造体でDiskが付くようにすれば
問題なくArchiveからのコピーが成功しました。
https://github.com/sacloud/usacloud/blob/master/vendor/github.com/sacloud/libsacloud/api/disk.go#L81
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.