Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

エンハンスドロードバランサでのエニーキャスト対応 #577

Closed
yamamoto-febc opened this issue Jun 15, 2020 · 5 comments · Fixed by #578
Closed

エンハンスドロードバランサでのエニーキャスト対応 #577

yamamoto-febc opened this issue Jun 15, 2020 · 5 comments · Fixed by #578

Comments

@yamamoto-febc
Copy link
Member

https://cloud-news.sakura.ad.jp/2020/06/11/enhanced-lb-anycast/

リクエスト時に以下のパラメータを指定可能にする。

{
  "CommonServiceItem": {
    "Status": {
      "Region": "anycast"
    }
  }
}
@yamamoto-febc
Copy link
Member Author

yamamoto-febc commented Jun 15, 2020

サービスクラス: ServiceClassに指定する値も変更する必要がある。

"ServiceClass": "cloud/proxylb/anycast/100",

サービスクラスはProxyLB作成時のパラメータPlantypes.EProxyLBPlan型として実装し、json.Marshaler/json.Unmarshalerを実装することで出力しているが、単純にプランの値からだけでは出力する値の決定ができなくなったため対応が必要。

@yamamoto-febc
Copy link
Member Author

実装案:

  • 案1: プランのフィールドを通常/エニーキャストで分ける
  • 案2: types.EProxyLBPlanでjson.Marshaler/Unmarshalerを実装するのをやめ、プランとリージョンを両方持ち値を決定できるProxyLB本体に実装させる

案2だとProxyLBとProxyLBCreateRequest両方で対応する必要があるが、既存クライアントに対する変更の影響が少ないためこちらの案の方が望ましい。

@yamamoto-febc
Copy link
Member Author

yamamoto-febc commented Jun 15, 2020

案3: naked型にPlanフィールドを追加(json:"-"タグ付きで)、naked型でjson.Marshaler/Unmarshalerを実装しサービスクラスの出力を行う

この案だとコードの複雑性が上がるが案2と同じく既存クライアントに対する影響が少なく、かつmapconvなどの中間変換層を気にせずに実装できる。
また実装箇所も1箇所で済む。

@yamamoto-febc
Copy link
Member Author

Note: プラン変更APIをどうするか?

現在のプラン変更APIシグニチャは以下の通り

// ProxyLBAPI is interface for operate ProxyLB resource
type ProxyLBAPI interface {
	ChangePlan(ctx context.Context, id types.ID, param *ProxyLBChangePlanRequest) (*ProxyLB, error)
}

type ProxyLBChangePlanRequest struct {
	Plan types.EProxyLBPlan
}

この形だと一度APIリクエストを発行して現在のProxyLBの値を参照しないとサービスクラスが決定できない。

@yamamoto-febc
Copy link
Member Author

libsacloud v2のコード生成の仕組みでは先にAPIで既存データを参照してから処理するという方法は困難。

このため、以下のような対応が必要となる。

対応案:

  • 案1) プラン変更APIだけServiceClassを文字列で受け取る
  • 案2) プラン変更APIにリージョンも渡す

案1はプラン変更専用のnaked型があるため、先述のnaked型でjson.Marshaler/Unmarshalerを実装する方法とはバッティングしない。

ただしbreaking-changeになることとクライアントの利便性が下がる(ServiceClassをクライアント側で組み立てる必要があるため)。

案2はリージョンは作成後は変更できないにもかかわらずパラメータを渡すことが好ましくないためできれば避けたい。

このため案1を採用し、必要に応じてutils/helpersでIDとプランを渡すとプラン変更してくれるユーティリティを提供する。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant