mirror of https://github.com/docker/docs.git
				
				
				
			WIP more beam conversion
This commit is contained in:
		
							parent
							
								
									5b54be92ca
								
							
						
					
					
						commit
						c90ce90113
					
				|  | @ -1,6 +1,7 @@ | |||
| package backends | ||||
| 
 | ||||
| import ( | ||||
| 	"io" | ||||
| 	"fmt" | ||||
| 	"github.com/docker/beam" | ||||
| 	beamutils "github.com/docker/beam/utils" | ||||
|  | @ -17,18 +18,31 @@ import ( | |||
| // Example: `New().Job("debug").Run()`
 | ||||
| func New() beam.Sender { | ||||
| 	backends := beamutils.NewHub() | ||||
| 	backends.RegisterName("debug", func(msg *beam.Message, in beam.Receiver, out beam.Sender, next beam.Sender) (bool, error) { | ||||
| 		backends.RegisterTask(func(r beam.Receiver, w beam.Sender) error { | ||||
| 			for { | ||||
| 				msg, msgr, msgw, err := r.Receive(beam.R | beam.W) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				fmt.Printf("[DEBUG] %s %s\n", msg.Name, strings.Join(msg.Args, " ")) | ||||
| 				// FIXME: goroutine?
 | ||||
| 				splice(w, msg, msgr, msgw) | ||||
| 	backends.RegisterName("cd", func(msg *beam.Message, in beam.Receiver, out beam.Sender, next beam.Sender) (bool, error) { | ||||
| 		return false, fmt.Errorf("no such backend: %s\n", strings.Join(msg.Args, " ")) | ||||
| 	}) | ||||
| 	backends.RegisterName("cd", func(msg *beam.Message, in beam.Receiver, out beam.Sender, next beam.Sender) (bool, error) { | ||||
| 		if len(msg.Args) > 0 && msg.Args[0] == "debug" { | ||||
| 			debugr, debugw, err := out.Send(&beam.Message{Name: "register"}, beam.R|beam.W) | ||||
| 			if err != nil { | ||||
| 				return false, err | ||||
| 			} | ||||
| 		}) | ||||
| 			go func() { | ||||
| 				for { | ||||
| 					msg, msgr, msgw, err := debugr.Receive(beam.R | beam.W) | ||||
| 					if err == io.EOF { | ||||
| 						return | ||||
| 					} | ||||
| 					if err != nil { | ||||
| 						return | ||||
| 					} | ||||
| 					fmt.Printf("[DEBUG] %s %s\n", msg.Name, strings.Join(msg.Args, " ")) | ||||
| 					// FIXME: goroutine?
 | ||||
| 					Splice(debugw, msg, msgr, msgw) | ||||
| 				} | ||||
| 			}() | ||||
| 			return false, nil | ||||
| 		} | ||||
| 		return true, nil | ||||
| 	}) | ||||
| 	backends.RegisterName("fakeclient", func(msg *beam.Message, in beam.Receiver, out beam.Sender, next beam.Sender) (bool, error) { | ||||
|  | @ -43,7 +57,7 @@ func New() beam.Sender { | |||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				go beamutils.Copy(beamutils.NopSender{}, containersR) | ||||
| 				go beamutils.Copy(beam.NopSender{}, containersR) | ||||
| 			} | ||||
| 		}) | ||||
| 		return true, nil | ||||
|  | @ -51,7 +65,7 @@ func New() beam.Sender { | |||
| 	return backends | ||||
| } | ||||
| 
 | ||||
| func splice(dst beam.Sender, msg *beam.Message, r beam.Receiver, w beam.Sender) error { | ||||
| func Splice(dst beam.Sender, msg *beam.Message, r beam.Receiver, w beam.Sender) error { | ||||
| 	dstR, dstW, err := dst.Send(msg, beam.R|beam.W) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
|  |  | |||
|  | @ -154,7 +154,7 @@ func cmdDaemon(c *cli.Context) { | |||
| 	} | ||||
| 
 | ||||
| 	hub := beamutils.NewHub() | ||||
| 	backends := backends.New() | ||||
| 	back := backends.New() | ||||
| 	// Load backends
 | ||||
| 	for _, cmd := range c.Args() { | ||||
| 		bName, bArgs, err := parseCmd(cmd) | ||||
|  | @ -162,12 +162,31 @@ func cmdDaemon(c *cli.Context) { | |||
| 			Fatalf("%v", err) | ||||
| 		} | ||||
| 		fmt.Printf("---> Loading backend '%s'\n", strings.Join(append([]string{bName}, bArgs...), " ")) | ||||
| 		_, backend, err := backends.Send(&beam.Message{Name: bName, Args: bArgs}, beam.W) | ||||
| 		backendr, _, err := back.Send(&beam.Message{Name: "cd", Args: []string{bName}}, beam.R) | ||||
| 		if err != nil { | ||||
| 			Fatalf("%s: %v\n", bName, err) | ||||
| 		} | ||||
| 		if err := hub.Register(backend); err != nil { | ||||
| 			Fatalf("%v", err) | ||||
| 		// backendr will return either 'error' or 'register'.
 | ||||
| 		for { | ||||
| 			m, mr, mw, err := backendr.Receive(beam.R|beam.W) | ||||
| 			if err != nil { | ||||
| 				Fatalf("%v", err) | ||||
| 			} | ||||
| 			if m.Name == "error" { | ||||
| 				Fatalf("%v", strings.Join(m.Args, " ")) | ||||
| 			} | ||||
| 			if m.Name == "register" { | ||||
| 				// FIXME: adapt the beam interface to allow the caller to
 | ||||
| 				// (optionally) pass their own Sender/Receiver?
 | ||||
| 				// Would make proxying/splicing easier.
 | ||||
| 				hubr, hubw, err := hub.Send(m, beam.R|beam.W) | ||||
| 				if err != nil { | ||||
| 					Fatalf("%v", err) | ||||
| 				} | ||||
| 				fmt.Printf("successfully registered\n") | ||||
| 				go beamutils.Copy(hubw, mr) | ||||
| 				go beamutils.Copy(mw, hubr) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	in, _, err := hub.Send(&beam.Message{Name: "start"}, beam.R) | ||||
|  | @ -176,6 +195,9 @@ func cmdDaemon(c *cli.Context) { | |||
| 	} | ||||
| 	for { | ||||
| 		msg, _, _, err := in.Receive(0) | ||||
| 		if err == io.EOF { | ||||
| 			break | ||||
| 		} | ||||
| 		if err != nil { | ||||
| 			Fatalf("%v", err) | ||||
| 		} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue