0
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
Upcoming SlideShare
Loading in...5
×

How to impl libswarm backend

5,859

Published on

How to impl libswarm backend
docker meetup #3

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,859
On Slideshare
0
From Embeds
0
Number of Embeds
18
Actions
Shares
0
Downloads
11
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

Transcript of "How to impl libswarm backend"

  1. 1. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . How to impl libswarm backend July 4, 2014
  2. 2. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 自己紹介 • Yutaka Matsubara • Abby CTO • twiter: @mopemope • github: @mopemope Abby 社員募集中です
  3. 3. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 宣伝 Docker の薄い本を書きました
  4. 4. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . libswarm
  5. 5. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . libswarm network sevice kit • 再利用可能なコンポーネント • 任意の組み合わせによりお互いのサービスを交換する ▶ 任意のオーケストレーションツールを作成
  6. 6. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . libswarm backend 再利用可能なコンポーネントはbackendで実装 • backend の実体は libswarm.Server • 各イベントに対し、処理を実装 • 内部では libchan でやりとり
  7. 7. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . backend 実装方法
  8. 8. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 登場人物 • libswarm.Message ▶ メッセージ本体。受け取った値、Senderなどを保持 • libswarm.Sender ▶ メッセージを送信 • libswarm.Receiver ▶ SenderからSendとすると返る • libswarm.Server ▶ 中心人物、イベント処理などを行う • libswarm.Client ▶ 他のbackendを呼び出す場合に使用
  9. 9. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Verb 基本はDockerの各イベントに対し対応 Docker のイベントがどのように起きるか知ってないと辛い • Ack • Attach • Error • Get • Log • Ls • Spawn • Start • Stop
  10. 10. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 1. Spawn Backend Spawnをhookしてbackend を起こす func Example() libswarm.Sender { backend := libswarm.NewServer() backend.OnVerb(libswarm.Spawn, libswarm.Handler(func(ctx *libswarm.Messag var cmd = ctx.Args ... s := libswarm.NewServer() ... // 2. Hook Event ... _, err = ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: s}) return err } return backend }
  11. 11. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 1. Spawn Backend Simple Way func Example() libswarm.Sender { backend := libswarm.NewServer() backend.OnSpawn(func(cmd ...string) (libswarm.Sender, error) { ... s := libswarm.NewServer() ... // 2. Hook Event ... return s, err } return backend }
  12. 12. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Use Task 2重起動などを防ぐ instance := utils.Task(func(in libswarm.Receiver, out libswarm.Sender) { libswarm.AsClient(out).Log(”[simulator] startingn”) s := libswarm.NewServer() s.OnVerb(libswarm.Ls, libswarm.Handler(func(msg *libswarm.Message) error { libswarm.AsClient(out).Log(”[simulator] generating fake list of objects libswarm.AsClient(msg.Ret).Set(containers...) return nil })) libswarm.Copy(s, in) }) ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: instance})
  13. 13. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 2. Hook Event Simple c := &exampleClient{} s.OnAttach(c.attach) s.OnLs(c.ls)
  14. 14. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 2. Hook Event 関数の型が異なるので注意 c := &exampleClient{} s.OnVerb(libswarm.Attach, libswarm.Handler(c.attach)) s.OnVerb(libswarm.Ls, libswarm.Handler(c.ls))
  15. 15. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 3. AsClient 他のbackendを呼び出す libswarm.AsClient(X) で Sender -> Clientへ Client は Sender の Wrapper として機能する dockerClient := DockerClientWithConfig(&DockerClientConfig{ Scheme: ”http”, URLHost: ”localhost”, }) dockerBackend := libswarm.AsClient(dockerClient) url := fmt.Sprintf(”tcp://localhost:%s”, c.config.sshLocalPort) // Spawn call dockerInstance, err := dockerBackend.Spawn(url) ...
  16. 16. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Debug debug を間に挟みメッセージを dump swarmd ’dockerserver tcp://localhost:4244’ ’debug’ ’dockerclient tcp://l
  17. 17. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Debug 2014/07/04 10:16:37 [debug] ---> Outbound Message ---> { Verb: Attach, Args: [5 2014/07/04 10:16:37 [debug] <--- Inbound Message <--- { Verb: Ack, Args: [] } 2014/07/04 10:16:37 [debug] <--- Inbound Message <--- { Verb: Ack, Args: [] }
  18. 18. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . まとめ
  19. 19. ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . まとめ • backend の実装自体はそこまで難しくない • どうオーケストレーションするかの設計の方が難しい • APIがまだ不完全な箇所がありそう ▶ docker run –name=ABC が無視されるなど
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×