Git Product home page Git Product logo

libsacloud's Introduction

libsacloud

Go Reference Tests Go Report Card

Library for SakuraCloud API

💡 [Deprecated]現在次期バージョンの開発が進められています。
次期バージョンは以下2つのリポジトリに分割されます。

また、IaaSに依存しない機能は以下のリポジトリに切り出されています。

Installation

Use go get.

go get github.com/sacloud/libsacloud/v2

Then import the sacloud package into your own code.

import "github.com/sacloud/libsacloud/v2/sacloud"

License

libsacloud Copyright (C) 2016-2022 The Libsacloud Authors.

This project is published under Apache 2.0 License.

libsacloud's People

Contributors

blp1526 avatar higebu avatar tokibi avatar yamamoto-febc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

libsacloud's Issues

docsの整備

related: #155

v2のドキュメントをdocsディレクトリ配下にまとめる

Sophos UTM対応

  • os_typeへの追加
  • ディスクの修正可否ロジックの修正(現状は修正可能と判定してしまう)

Fix sample(Low-Level API) code error

Sample(Low-Level API)の一部のコードが動作しないものを修正する。

実行環境

  • macOS 10.12.3
  • Go 1.7.4

現状

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
そこでこれらの項目がきちんと動作するようにする。

libsacloud v2 Design Proposal

Overview

libsacloud-design-proposal

Background

現状のlibsacloudには次のような課題がある。

  • データモデルの階層が深く、テストなどで手動でデータ生成するのが面倒
  • sacloudパッケージのデータモデルで構造体リテラルが利用できない
  • IaaS APIクライアントにてcontext/Contextを受け取れないなどGolangらしくない
  • saklient互換のFluent APIを採用しているがGolangらしくなくテスト用のインターフェースが作成しにくい面がある
  • NULL/空文字の区別がなく、値の未指定なのか空の値をセットしたいのか区別できないことがある

これらを解決するため、libsacloud v2として再設計/再実装する。

Design Goals

  • saklient互換性を廃し、よりGolangらしいモダンなスタイルを採用
  • Declarative approachにより網羅的な実装と柔軟性を両立させる
  • クライアント側にIaaS APIデータモデルに依存しないフラットなデータモデルを提供する
  • 現行のbuilderパッケージやutilsパッケージなどで提供している高レベル操作を引き続きサポートする
  • API呼び出しで一貫したCRUD方針を採用/実現する(例: CREATE操作の冪等性の担保など)

Non-Goals

  • 後方互換性の維持

Features

Layered Models

  • モデル層をIaaSと1:1に対応する層(IaaS Layer)とクライアント側に公開するフラットな構造を持つ層(Core Domain Layer)の2層に分ける
  • 両層を結ぶマッピングを実装し、相互に変換可能にする
  • Core Domain LayerはIaaS Layerが持つモデルの属性に加え、クライアント側に公開すべき操作をメソッドとして実装する。
    (クライアント側が意識する必要のない部分については属性のみを提供する)
  • 両層ともコード生成を駆使することでインターフェースレベルで互換性を持たせる

libsacloudのクライアントは基本的にCore Domain Layerのモデルを操作する。
ただし、例外的にIaaS Layerを直接操作する手段も提供する。

Declarative Approach

  • モデルの定義にProtocol Buffersを採用し、コード生成でモデルの基本的な実装を行う
  • 特に前述のモデル実装は同様のメソッドが多数のモデルに共通して必要となる場面が多いため、コード生成を基本とする
  • 高レベル操作を手動で実装する部分もあるため、コード生成はGeneration Gapを考慮する

IaaS API

  • リクエスト/レスポンス共にパラメータをDeclarative Approachで実装する
  • CRUD操作それぞれのパラメータを個別に定義する
    (現行はIaaSのデータモデルを直接指定する必要があり、更新可否や必須の値の判断などが困難)
  • CRUDでの冪等性のサポート
    https://github.com/Azure/azure-cli/blob/dev/doc/command_guidelines.md#standard-command-types
    • 現行のIaaS APIではslugが存在しないため、CREATE時はNameなどを擬似slugとして扱う

Design: Declarative Approach

(a part of #155)

Overview

Declarative Approachの構成要素を検討する。

Goals

  • どの部分を宣言的にするかを明確にする
  • 使用するツール類を選択する
  • 典型的な開発フローを確立する

Non-Goals

  • 実行可能なレベルでの実装

Input/Output

  • Input: #155
  • Output: design/tools/配下にドキュメントを追加

Details

👉 Scope to use Declarative Approach

  • IaaSレイヤのモデル定義
  • IaaS APIクライアント
  • Core Domainレイヤのモデル定義

🤔 How to implements

  • Protocol Buffers + protoc + custom plugin
    (includes protoc-gen-swagger)
  • JSON Schema + generator
  • Goで実装した自前のDSL(like a usacloud's approach)

TODO

  • ツール類の比較/選定
  • ワークフロードキュメントの作成

Fix golint errors

golintでのエラーに全て対応する。
v1.0.0リリースに合わせ、後方互換をなくす変更になる可能性もあるが、対応する。

v1系とのデータ型互換性

(from sacloud-archives/libsacloud-v2#37)

いくつかのデータ型がv1と互換性がなく、json.Unmarshalの失敗などが原因でv2で作成されたリソースをv1から参照できないことがある

例:

  • sakuracloud_exporter
  • usacloud
  • terraform

v1/v2両面から対応を検討しておく。

README.mdの整備

API自体の基本的な使い方などはGodocで整備するつもりのため、
README.mdには簡単な概要説明や他プロジェクトへの組み込み方法などを中心に記載する。

Rename functions under a builder package

Motivation

現在はbuilderパッケージ配下にFrom...のような関数群がぶら下がっているが、
builderパッケージの対象がサーバー/ディスク以外に拡大した場合に対応できない。

Proposal

操作対象のリソース名を関数名プレフィックスとする。
サーバーの場合Server...など。

ポーリングでのタイムアウト処理

現行の仕組みだと待ち時間の設定次第ではタイムアウト処理が発火しない。

src:

select {
case <-time.After(5 * time.Second):
lb, e := api.Read(id)
if e != nil {
errCount++
if errCount > maxRetryCount {
err <- e
return
}
} else {
progress <- lb
if lb.IsAvailable() {
complete <- lb
return
}
if lb.IsFailed() {
err <- fmt.Errorf("Failed: Create LoadBalancer is failed: %#v", lb)
return
}
}
case <-time.After(timeout):
err <- fmt.Errorf("Timeout: AsyncSleepWhileCopying[ID:%d]", id)
return
}

time.Ticktime.Afterを組み合わせる方法に修正する。

Add Cloud APIs

未実装のAPIのうち、利用頻度が高そうなものを追加実装する

  • GET/auth-status(認証状態の取得)
  • GET/bill*(請求関連状態)

メタデータAPI追加

タグを利用したメタデータの指定を行えるようにする。

利用イメージ:

	s := api.Server.Read(id)

	// メタデータの追加
	meta := &sacloud.Metadata{
		Namespace: "foo",
		Label:     "bar",
		Value:     "baz",
	}

	s.AddMetadata(meta)
	// s.Tags = ["foo:bar=baz"]

sacloudパッケージの再設計

libsacloudクライアント側でテストを書く際にモデルの値の記載が行いにくい。
なるべく構造体リテラルで記載できるような方法を検討する。

スイッチを扱う例

As-Is:

sw := sacloud.Switch{}
sw.ID = 999
sw.Name = "dummy"

To-Be:

sw := sacloud.Switch {
    ID: 999,
    Name: "dummy",
}

ディスクアーカイブからの再インストールができない

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

fakeドライバーでのステート永続化対応

(from sacloud-archives/libsacloud-v2#35)

現在のfakeドライバーはインメモリでデータを保持している。
このためプロセス終了時にデータは破棄される。

これをローカルファイルをバックエンドとした永続化に対応することによりusacloudやterraformなどでのユーザーによる開発/テストを容易にする。

[WIP]APIリソース構造体の定義

さくらのクラウドAPIが提供するモデルについては対応する構造体を用意する。

  • サーバ関連
  • ディスク関連
  • スイッチ関連
  • アーカイブ関連
  • ISOイメージ(CDROM)関連
  • ブリッジ関連
  • ルーター関連
  • インターフェース関連
  • アプライアンス関連
    • ロードバランサ
    • VPCルータ
  • 共通サービス契約関連
    • GSLB
    • さくらのDNS
    • シンプル監視
  • アイコン関連
  • スクリプト関連
  • SSHキー関連
  • 設備関連
  • 商品関連
  • ユーザー・アカウント関連

v2でのAPI実装

低レベルAPI

  • アーカイブ
  • 認証情報(#205)
  • 自動バックアップ(#225)
  • 請求(#236)
  • ブリッジ
  • クーポン(#237)
  • ISOイメージ
  • データベースアプライアンス(#239)
  • ディスク
  • DNS(#227)
  • GSLB
  • アイコン(#233)
  • インターフェース
  • スイッチ+ルータ
  • IPv4アドレス(#247)
  • IPv6ネットワーク(#248)
  • IPv6アドレス(#249)
  • ライセンス(#242)
  • ロードバランサ
  • モバイルゲートウェイ(#253)
  • ニュースフィード(メンテナンス情報)(#257)
  • NFS
  • スタートアップスクリプト
  • パケットフィルタ
  • 専有ホスト(#243)
  • 商品関連(productXXX)(#243 , #244)
  • 価格表(public/price)(#245)
  • エンハンスドロードバランサ
  • リージョン(#235)
  • シンプル監視(#228)
  • SIM(fakeドライバ)(#253)
  • 公開鍵(#234)
  • サーバ(#280など)
  • サブネット
  • スイッチ
  • VPCルータ
  • ゾーン
  • ウェブアクセラレータ(#246)

高レベルAPI

Makefileの整備

以下機能を含むMakefileを整備する。

  • build関連( build / clean )
  • godep関連(save / restore)
  • Dockerコンテナでのビルド(USE_CONTAINER環境変数での切り替え)

石狩第1ゾーンでのスイッチ+ブリッジ接続時のJSON変換エラー

以下コミットにて対応済み
71dd269

現象

石狩第1ゾーンのみ、スイッチを接続済みのブリッジをAPIで参照するとJSON変換エラーとなる。

原因

以下のようにbridge.Switches[0].IDが文字列となる模様。

{
    "Bridges": [
        {
            "ID": xxxxxxxxxxxx,
            "Info": {
                "HybridConnection": {
                    // 省略
                },
                "Switches": [
                    {
                        "ID": "xxxxxxxxxxxx",
                        // 省略
                    }
                ]
            },

現時点ではAPIを直接コールしても数値型となっているため、さくらのクラウド側の一時的な問題だったのかも。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.