SlideShare une entreprise Scribd logo
1  sur  19
Télécharger pour lire hors ligne
.....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
....
.
....
.
.....
.
....
.
.....
.
....
.
....
.
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 が無視されるなど

Contenu connexe

Similaire à How to impl libswarm backend

Jquery 38book-pt-br
Jquery 38book-pt-brJquery 38book-pt-br
Jquery 38book-pt-brJean Lopes
 
caelum-java-objetos-fj11.pdf
caelum-java-objetos-fj11.pdfcaelum-java-objetos-fj11.pdf
caelum-java-objetos-fj11.pdfssuserbc6cf7
 
Apostila JavaEE 5 Componentes Distribuídos EJB 3 e JBoss
Apostila JavaEE 5 Componentes Distribuídos EJB 3 e JBossApostila JavaEE 5 Componentes Distribuídos EJB 3 e JBoss
Apostila JavaEE 5 Componentes Distribuídos EJB 3 e JBossGilberto Holms
 
Calopsita e Calopsitas - www.calopsitabr.blogspot.com
Calopsita e Calopsitas - www.calopsitabr.blogspot.comCalopsita e Calopsitas - www.calopsitabr.blogspot.com
Calopsita e Calopsitas - www.calopsitabr.blogspot.comAntonio Silva
 
10 solucoes-para-criacao-de-sites
10 solucoes-para-criacao-de-sites10 solucoes-para-criacao-de-sites
10 solucoes-para-criacao-de-sitesiron67
 
CPSA 4 - Aprender ao longo da vida_índice .pdf
CPSA 4 - Aprender ao longo da vida_índice .pdfCPSA 4 - Aprender ao longo da vida_índice .pdf
CPSA 4 - Aprender ao longo da vida_índice .pdfManuais Formação
 
Cargos e salarios
Cargos e salariosCargos e salarios
Cargos e salariosIara Lino
 
Python
PythonPython
PythonTiago
 
Guia do usuário da indexação do family search (setembro de 2010)
Guia do usuário da indexação do family search (setembro de 2010)Guia do usuário da indexação do family search (setembro de 2010)
Guia do usuário da indexação do family search (setembro de 2010)chfceilandia
 
Currículo da Educação Básica
Currículo da Educação BásicaCurrículo da Educação Básica
Currículo da Educação Básicaprofandre
 
Hibernate Reference20061120
Hibernate Reference20061120Hibernate Reference20061120
Hibernate Reference20061120daniloasantos
 
Caelum ruby-on-rails-rr71
Caelum ruby-on-rails-rr71Caelum ruby-on-rails-rr71
Caelum ruby-on-rails-rr71Moisés Moura
 
Apostila fireworks-cs5
Apostila fireworks-cs5Apostila fireworks-cs5
Apostila fireworks-cs5aulaemvideo
 

Similaire à How to impl libswarm backend (20)

Zope
ZopeZope
Zope
 
Jquery 38book-pt-br
Jquery 38book-pt-brJquery 38book-pt-br
Jquery 38book-pt-br
 
caelum-java-objetos-fj11.pdf
caelum-java-objetos-fj11.pdfcaelum-java-objetos-fj11.pdf
caelum-java-objetos-fj11.pdf
 
Apostila JavaEE 5 Componentes Distribuídos EJB 3 e JBoss
Apostila JavaEE 5 Componentes Distribuídos EJB 3 e JBossApostila JavaEE 5 Componentes Distribuídos EJB 3 e JBoss
Apostila JavaEE 5 Componentes Distribuídos EJB 3 e JBoss
 
Calopsita e Calopsitas - www.calopsitabr.blogspot.com
Calopsita e Calopsitas - www.calopsitabr.blogspot.comCalopsita e Calopsitas - www.calopsitabr.blogspot.com
Calopsita e Calopsitas - www.calopsitabr.blogspot.com
 
10 solucoes-para-criacao-de-sites
10 solucoes-para-criacao-de-sites10 solucoes-para-criacao-de-sites
10 solucoes-para-criacao-de-sites
 
CPSA 4 - Aprender ao longo da vida_índice .pdf
CPSA 4 - Aprender ao longo da vida_índice .pdfCPSA 4 - Aprender ao longo da vida_índice .pdf
CPSA 4 - Aprender ao longo da vida_índice .pdf
 
Cargos e salarios
Cargos e salariosCargos e salarios
Cargos e salarios
 
Assistente administrativo
Assistente administrativoAssistente administrativo
Assistente administrativo
 
Python
PythonPython
Python
 
Guia do usuário da indexação do family search (setembro de 2010)
Guia do usuário da indexação do family search (setembro de 2010)Guia do usuário da indexação do family search (setembro de 2010)
Guia do usuário da indexação do family search (setembro de 2010)
 
Apostila Java
Apostila JavaApostila Java
Apostila Java
 
Apostila impress libre office
Apostila impress libre officeApostila impress libre office
Apostila impress libre office
 
Manual de Práticas SEFIP
Manual de Práticas SEFIPManual de Práticas SEFIP
Manual de Práticas SEFIP
 
Currículo da Educação Básica
Currículo da Educação BásicaCurrículo da Educação Básica
Currículo da Educação Básica
 
Hibernate Reference20061120
Hibernate Reference20061120Hibernate Reference20061120
Hibernate Reference20061120
 
Diretrizes básicas para indexação
Diretrizes básicas para indexaçãoDiretrizes básicas para indexação
Diretrizes básicas para indexação
 
Caelum ruby-on-rails-rr71
Caelum ruby-on-rails-rr71Caelum ruby-on-rails-rr71
Caelum ruby-on-rails-rr71
 
Apostila fireworks-cs5
Apostila fireworks-cs5Apostila fireworks-cs5
Apostila fireworks-cs5
 
Apostila fireworks-cs5
Apostila fireworks-cs5Apostila fireworks-cs5
Apostila fireworks-cs5
 

How to impl libswarm backend