• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
 

How to impl libswarm backend

on

  • 300 views

How to impl libswarm backend

How to impl libswarm backend
docker meetup #3

Statistics

Views

Total Views
300
Views on SlideShare
262
Embed Views
38

Actions

Likes
2
Downloads
0
Comments
0

2 Embeds 38

https://twitter.com 33
http://andbrowser.com 5

Accessibility

Categories

Upload Details

Uploaded via SlideShare as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    How to impl libswarm backend How to impl libswarm backend Presentation Transcript

    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . How to impl libswarm backend July 4, 2014
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 自己紹介 • Yutaka Matsubara • Abby CTO • twiter: @mopemope • github: @mopemope Abby 社員募集中です
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 宣伝 Docker の薄い本を書きました
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . libswarm
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . libswarm network sevice kit • 再利用可能なコンポーネント • 任意の組み合わせによりお互いのサービスを交換する ▶ 任意のオーケストレーションツールを作成
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . libswarm backend 再利用可能なコンポーネントはbackendで実装 • backend の実体は libswarm.Server • 各イベントに対し、処理を実装 • 内部では libchan でやりとり
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . backend 実装方法
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 登場人物 • libswarm.Message ▶ メッセージ本体。受け取った値、Senderなどを保持 • libswarm.Sender ▶ メッセージを送信 • libswarm.Receiver ▶ SenderからSendとすると返る • libswarm.Server ▶ 中心人物、イベント処理などを行う • libswarm.Client ▶ 他のbackendを呼び出す場合に使用
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Verb 基本はDockerの各イベントに対し対応 Docker のイベントがどのように起きるか知ってないと辛い • Ack • Attach • Error • Get • Log • Ls • Spawn • Start • Stop
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 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 }
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 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 }
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 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})
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 2. Hook Event Simple c := &exampleClient{} s.OnAttach(c.attach) s.OnLs(c.ls)
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 2. Hook Event 関数の型が異なるので注意 c := &exampleClient{} s.OnVerb(libswarm.Attach, libswarm.Handler(c.attach)) s.OnVerb(libswarm.Ls, libswarm.Handler(c.ls))
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 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) ...
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . Debug debug を間に挟みメッセージを dump swarmd ’dockerserver tcp://localhost:4244’ ’debug’ ’dockerclient tcp://l
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . 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: [] }
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . まとめ
    • ..... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . .... . .... . ..... . .... . ..... . .... . .... . まとめ • backend の実装自体はそこまで難しくない • どうオーケストレーションするかの設計の方が難しい • APIがまだ不完全な箇所がありそう ▶ docker run –name=ABC が無視されるなど