Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
...
Upcoming SlideShare
Loading in …5
×

How to impl libswarm backend

15,170 views

Published on

How to impl libswarm backend
docker meetup #3

Published in: Technology
  • ⇒⇒⇒WRITE-MY-PAPER.net ⇐⇐⇐ has really great writers to help you get the grades you need, they are fast and do great research. Support will always contact you if there is any confusion with the requirements of your paper so they can make sure you are getting exactly what you need.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating direct: ♥♥♥ http://bit.ly/36cXjBY ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ♥♥♥ http://bit.ly/36cXjBY ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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 が無視されるなど

×