本文整理汇总了Golang中github.com/flynn/flynn/pkg/stream.Close函数的典型用法代码示例。如果您正苦于以下问题:Golang Close函数的具体用法?Golang Close怎么用?Golang Close使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Close函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: getBuildLog
func (r *Runner) getBuildLog(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
id := ps.ByName("build")
b := &Build{}
if err := r.db.View(func(tx *bolt.Tx) error {
v := tx.Bucket(dbBucket).Get([]byte(id))
if err := json.Unmarshal(v, b); err != nil {
return fmt.Errorf("could not decode build %s: %s", v, err)
}
return nil
}); err != nil {
http.Error(w, err.Error(), 500)
return
}
// if it's a V1 build, redirect to the log in S3
if b.Version == BuildVersion1 {
http.Redirect(w, req, b.LogURL, http.StatusMovedPermanently)
return
}
// if it's a browser, serve the build-log.html template
if strings.Contains(req.Header.Get("Accept"), "text/html") {
tpl, err := template.ParseFiles(path.Join(args.AssetsDir, "build-log.html"))
if err != nil {
http.Error(w, err.Error(), 500)
return
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
if err := tpl.Execute(w, b); err != nil {
log.Printf("error executing build-log template: %s", err)
}
return
}
// serve the build log as either an SSE or plain text stream
ch := make(chan string)
stream, err := getBuildLogStream(b, ch)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
if cn, ok := w.(http.CloseNotifier); ok {
go func() {
<-cn.CloseNotify()
stream.Close()
}()
} else {
defer stream.Close()
}
if strings.Contains(req.Header.Get("Accept"), "text/event-stream") {
sse.ServeStream(w, ch, nil)
} else {
servePlainStream(w, ch)
}
if err := stream.Err(); err != nil {
log.Println("error serving build log stream:", err)
}
}
开发者ID:yanghongkjxy,项目名称:flynn,代码行数:60,代码来源:runner.go
示例2: DeleteApp
// DeleteApp deletes an app.
func (c *Client) DeleteApp(appID string) (*ct.AppDeletion, error) {
events := make(chan *ct.AppEvent)
stream, err := c.ResumingStream("GET", fmt.Sprintf("/apps/%s/events?object_type=%s", appID, ct.EventTypeAppDeletion), events)
if err != nil {
return nil, err
}
defer stream.Close()
if err := c.Delete(fmt.Sprintf("/apps/%s", appID)); err != nil {
return nil, err
}
select {
case event, ok := <-events:
if !ok {
return nil, stream.Err()
}
var e ct.AppDeletionEvent
if err := json.Unmarshal(event.Data, &e); err != nil {
return nil, err
}
if e.Error != "" {
return nil, errors.New(e.Error)
}
return e.AppDeletion, nil
case <-time.After(60 * time.Second):
return nil, errors.New("timed out waiting for app deletion")
}
}
开发者ID:kuntenz,项目名称:flynn,代码行数:30,代码来源:client.go
示例3: DeleteRelease
// DeleteRelease deletes a release and any associated file artifacts.
func (c *Client) DeleteRelease(appID, releaseID string) (*ct.ReleaseDeletion, error) {
events := make(chan *ct.Event)
stream, err := c.StreamEvents(ct.StreamEventsOptions{
AppID: appID,
ObjectID: releaseID,
ObjectTypes: []ct.EventType{ct.EventTypeReleaseDeletion},
}, events)
if err != nil {
return nil, err
}
defer stream.Close()
if err := c.Delete(fmt.Sprintf("/apps/%s/releases/%s", appID, releaseID), nil); err != nil {
return nil, err
}
select {
case event, ok := <-events:
if !ok {
return nil, stream.Err()
}
var e ct.ReleaseDeletionEvent
if err := json.Unmarshal(event.Data, &e); err != nil {
return nil, err
}
if e.Error != "" {
return nil, errors.New(e.Error)
}
return e.ReleaseDeletion, nil
case <-time.After(60 * time.Second):
return nil, errors.New("timed out waiting for release deletion")
}
}
开发者ID:imjorge,项目名称:flynn,代码行数:34,代码来源:client.go
示例4: TestJobMeta
func (s *SchedulerSuite) TestJobMeta(t *c.C) {
app, release := s.createApp(t)
events := make(chan *ct.JobEvent)
stream, err := s.controllerClient(t).StreamJobEvents(app.ID, 0, events)
t.Assert(err, c.IsNil)
defer stream.Close()
// start 1 one-off job
_, err = s.controllerClient(t).RunJobDetached(app.ID, &ct.NewJob{
ReleaseID: release.ID,
Cmd: []string{"sh", "-c", "while true; do echo one-off-job; sleep 1; done"},
Meta: map[string]string{
"foo": "baz",
},
})
t.Assert(err, c.IsNil)
waitForJobEvents(t, stream, events, jobEvents{"": {"up": 1}})
list, err := s.controllerClient(t).JobList(app.ID)
t.Assert(err, c.IsNil)
t.Assert(list, c.HasLen, 1)
t.Assert(list[0].Meta, c.DeepEquals, map[string]string{
"foo": "baz",
})
}
开发者ID:josephwinston,项目名称:flynn,代码行数:26,代码来源:test_scheduler.go
示例5: TestUpdateTags
func (s *HostSuite) TestUpdateTags(t *c.C) {
events := make(chan *discoverd.Event)
stream, err := s.discoverdClient(t).Service("flynn-host").Watch(events)
t.Assert(err, c.IsNil)
defer stream.Close()
nextEvent := func() *discoverd.Event {
select {
case e, ok := <-events:
if !ok {
t.Fatal("unexpected close of discoverd stream")
}
return e
case <-time.After(10 * time.Second):
t.Fatal("timed out waiting for discoverd event")
}
return nil
}
var client *cluster.Host
for {
e := nextEvent()
if e.Kind == discoverd.EventKindUp && client == nil {
client = cluster.NewHost(e.Instance.Meta["id"], e.Instance.Addr, nil, nil)
}
if e.Kind == discoverd.EventKindCurrent {
break
}
}
if client == nil {
t.Fatal("did not initialize flynn-host client")
}
t.Assert(client.UpdateTags(map[string]string{"foo": "bar"}), c.IsNil)
var meta map[string]string
for {
e := nextEvent()
if e.Kind == discoverd.EventKindUpdate && e.Instance.Meta["id"] == client.ID() {
meta = e.Instance.Meta
break
}
}
t.Assert(meta["tag:foo"], c.Equals, "bar")
// setting to empty string should delete the tag
t.Assert(client.UpdateTags(map[string]string{"foo": ""}), c.IsNil)
for {
e := nextEvent()
if e.Kind == discoverd.EventKindUpdate && e.Instance.Meta["id"] == client.ID() {
meta = e.Instance.Meta
break
}
}
if _, ok := meta["tag:foo"]; ok {
t.Fatal("expected tag to be deleted but is still present")
}
}
开发者ID:imjorge,项目名称:flynn,代码行数:59,代码来源:test_host.go
示例6: TestVolumeDeleteOnStop
func (s *HostSuite) TestVolumeDeleteOnStop(t *c.C) {
hosts, err := s.clusterClient(t).Hosts()
t.Assert(err, c.IsNil)
t.Assert(hosts, c.Not(c.HasLen), 0)
h := hosts[0]
// stream job events so we can wait for cleanup events
events := make(chan *host.Event)
stream, err := h.StreamEvents("all", events)
t.Assert(err, c.IsNil)
defer stream.Close()
waitCleanup := func(jobID string) {
timeout := time.After(30 * time.Second)
for {
select {
case event := <-events:
if event.JobID == jobID && event.Event == host.JobEventCleanup {
return
}
case <-timeout:
t.Fatal("timed out waiting for cleanup event")
}
}
}
for _, deleteOnStop := range []bool{true, false} {
job := &host.Job{
Config: host.ContainerConfig{
Args: []string{"sh", "-c", "ls -d /foo"},
DisableLog: true,
},
}
// provision a volume
req := &ct.VolumeReq{Path: "/foo", DeleteOnStop: deleteOnStop}
vol, err := utils.ProvisionVolume(req, h, job)
t.Assert(err, c.IsNil)
defer h.DestroyVolume(vol.ID)
// run the job
cmd := exec.JobUsingCluster(s.clusterClient(t), s.createArtifact(t, "test-apps"), job)
cmd.HostID = h.ID()
out, err := cmd.CombinedOutput()
t.Assert(err, c.IsNil)
t.Assert(string(out), c.Equals, "/foo\n")
// wait for a cleanup event
waitCleanup(job.ID)
// check if the volume was deleted or not
vol, err = h.GetVolume(vol.ID)
if deleteOnStop {
t.Assert(hh.IsObjectNotFoundError(err), c.Equals, true)
} else {
t.Assert(err, c.IsNil)
}
}
}
开发者ID:imjorge,项目名称:flynn,代码行数:58,代码来源:test_host.go
示例7: main
func main() {
defer shutdown.Exit()
grohl.AddContext("app", "controller-scheduler")
grohl.Log(grohl.Data{"at": "start"})
go startHTTPServer()
if period := os.Getenv("BACKOFF_PERIOD"); period != "" {
var err error
backoffPeriod, err = time.ParseDuration(period)
if err != nil {
shutdown.Fatal(err)
}
grohl.Log(grohl.Data{"at": "backoff_period", "period": backoffPeriod.String()})
}
cc, err := controller.NewClient("", os.Getenv("AUTH_KEY"))
if err != nil {
shutdown.Fatal(err)
}
c := newContext(cc, cluster.NewClient())
c.watchHosts()
grohl.Log(grohl.Data{"at": "leaderwait"})
hb, err := discoverd.AddServiceAndRegister("controller-scheduler", ":"+os.Getenv("PORT"))
if err != nil {
shutdown.Fatal(err)
}
shutdown.BeforeExit(func() { hb.Close() })
leaders := make(chan *discoverd.Instance)
stream, err := discoverd.NewService("controller-scheduler").Leaders(leaders)
if err != nil {
shutdown.Fatal(err)
}
for leader := range leaders {
if leader.Addr == hb.Addr() {
break
}
}
if err := stream.Err(); err != nil {
// TODO: handle discoverd errors
shutdown.Fatal(err)
}
stream.Close()
// TODO: handle demotion
grohl.Log(grohl.Data{"at": "leader"})
// TODO: periodic full cluster sync for anti-entropy
c.watchFormations()
}
开发者ID:kuntenz,项目名称:flynn,代码行数:54,代码来源:main.go
示例8: handleStream
func (h *httpAPI) handleStream(w http.ResponseWriter, params httprouter.Params, kind discoverd.EventKind) {
ch := make(chan *discoverd.Event, 64) // TODO: figure out how big this buffer should be
stream := h.Store.Subscribe(params.ByName("service"), true, kind, ch)
s := sse.NewStream(w, ch, nil)
s.Serve()
s.Wait()
stream.Close()
if err := stream.Err(); err != nil {
s.CloseWithError(err)
}
}
开发者ID:josephwinston,项目名称:flynn,代码行数:11,代码来源:http.go
示例9: TestAddFailingJob
func (s *HostSuite) TestAddFailingJob(t *c.C) {
// get a host and watch events
hosts, err := s.clusterClient(t).Hosts()
t.Assert(err, c.IsNil)
t.Assert(hosts, c.Not(c.HasLen), 0)
h := hosts[0]
jobID := random.UUID()
events := make(chan *host.Event)
stream, err := h.StreamEvents(jobID, events)
t.Assert(err, c.IsNil)
defer stream.Close()
// add a job with a non existent partition
job := &host.Job{
ID: jobID,
Mountspecs: []*host.Mountspec{{}},
Partition: "nonexistent",
}
t.Assert(h.AddJob(job), c.IsNil)
// check we get a create then error event
actual := make(map[host.JobEventType]*host.Event, 2)
loop:
for {
select {
case e, ok := <-events:
if !ok {
t.Fatalf("job event stream closed unexpectedly: %s", stream.Err())
}
if _, ok := actual[e.Event]; ok {
t.Fatalf("unexpected event: %v", e)
}
actual[e.Event] = e
if len(actual) >= 2 {
break loop
}
case <-time.After(30 * time.Second):
t.Fatal("timed out waiting for job event")
}
}
t.Assert(actual[host.JobEventCreate], c.NotNil)
e := actual[host.JobEventError]
t.Assert(e, c.NotNil)
t.Assert(e.Job, c.NotNil)
t.Assert(e.Job.Error, c.NotNil)
t.Assert(*e.Job.Error, c.Equals, `host: invalid job partition "nonexistent"`)
}
开发者ID:imjorge,项目名称:flynn,代码行数:47,代码来源:test_host.go
示例10: DeployAppRelease
func (c *Client) DeployAppRelease(appID, releaseID string) error {
d, err := c.CreateDeployment(appID, releaseID)
if err != nil {
return err
}
// if initial deploy, just stop here
if d.FinishedAt != nil {
return nil
}
events := make(chan *ct.DeploymentEvent)
stream, err := c.StreamDeployment(d, events)
if err != nil {
return err
}
defer stream.Close()
timeout := d.DeployTimeout
if timeout == 0 {
// although a non-zero timeout is set for all new apps, it
// could still be zero in the case of updating a cluster which
// doesn't have deploy timeouts set (as the controller
// migration may not have run yet) so use the default
timeout = ct.DefaultDeployTimeout
}
outer:
for {
select {
case e, ok := <-events:
if !ok {
return errors.New("unexpected close of deployment event stream")
}
switch e.Status {
case "complete":
break outer
case "failed":
return e.Err()
}
case <-time.After(time.Duration(timeout) * time.Second):
return errors.New("timed out waiting for deployment completion")
}
}
return nil
}
开发者ID:yanghongkjxy,项目名称:flynn,代码行数:46,代码来源:client.go
示例11: TestScale
func (s *SchedulerSuite) TestScale(t *c.C) {
app, release := s.createApp(t)
events := make(chan *ct.JobEvent)
stream, err := s.controllerClient(t).StreamJobEvents(app.ID, 0, events)
t.Assert(err, c.IsNil)
defer stream.Close()
formation := &ct.Formation{
AppID: app.ID,
ReleaseID: release.ID,
Processes: make(map[string]int),
}
current := make(map[string]int)
updates := []map[string]int{
{"printer": 2},
{"printer": 3, "crasher": 1},
{"printer": 1},
}
for _, procs := range updates {
debugf(t, "scaling formation to %v", procs)
formation.Processes = procs
t.Assert(s.controllerClient(t).PutFormation(formation), c.IsNil)
expected := make(jobEvents)
for typ, count := range procs {
diff := count - current[typ]
if diff > 0 {
expected[typ] = map[string]int{"up": diff}
} else {
expected[typ] = map[string]int{"down": -diff}
}
}
for typ, count := range current {
if _, ok := procs[typ]; !ok {
expected[typ] = map[string]int{"down": count}
}
}
waitForJobEvents(t, stream, events, expected)
current = procs
}
}
开发者ID:josephwinston,项目名称:flynn,代码行数:45,代码来源:test_scheduler.go
示例12: TestJobRestartBackoffPolicy
func (s *SchedulerSuite) TestJobRestartBackoffPolicy(t *c.C) {
if testCluster == nil {
t.Skip("cannot determine scheduler backoff period")
}
backoffPeriod := testCluster.BackoffPeriod()
startTimeout := 20 * time.Second
debugf(t, "job restart backoff period: %s", backoffPeriod)
app, release := s.createApp(t)
events := make(chan *ct.JobEvent)
stream, err := s.controllerClient(t).StreamJobEvents(app.ID, 0, events)
t.Assert(err, c.IsNil)
defer stream.Close()
t.Assert(s.controllerClient(t).PutFormation(&ct.Formation{
AppID: app.ID,
ReleaseID: release.ID,
Processes: map[string]int{"printer": 1},
}), c.IsNil)
_, id := waitForJobEvents(t, stream, events, jobEvents{"printer": {"up": 1}})
// First restart: scheduled immediately
s.stopJob(t, id)
id = waitForJobRestart(t, stream, events, "printer", startTimeout)
// Second restart after 1 * backoffPeriod
start := time.Now()
s.stopJob(t, id)
id = waitForJobRestart(t, stream, events, "printer", backoffPeriod+startTimeout)
t.Assert(time.Now().Sub(start) > backoffPeriod, c.Equals, true)
// Third restart after 2 * backoffPeriod
start = time.Now()
s.stopJob(t, id)
id = waitForJobRestart(t, stream, events, "printer", 2*backoffPeriod+startTimeout)
t.Assert(time.Now().Sub(start) > 2*backoffPeriod, c.Equals, true)
// After backoffPeriod has elapsed: scheduled immediately
time.Sleep(backoffPeriod)
s.stopJob(t, id)
waitForJobRestart(t, stream, events, "printer", startTimeout)
}
开发者ID:josephwinston,项目名称:flynn,代码行数:43,代码来源:test_scheduler.go
示例13: TestRollbackNoService
func (s *DeployerSuite) TestRollbackNoService(t *c.C) {
// create a running release
app, release := s.createRelease(t, "printer", "all-at-once")
// deploy a release which will not register the service
client := s.controllerClient(t)
release.ID = ""
printer := release.Processes["printer"]
printer.Service = "printer"
printer.Ports = []ct.Port{{
Port: 12345,
Proto: "tcp",
Service: &host.Service{
Name: "printer",
Create: true,
Check: &host.HealthCheck{
Type: "tcp",
Interval: 100 * time.Millisecond,
Threshold: 1,
KillDown: true,
StartTimeout: 100 * time.Millisecond,
},
},
}}
release.Processes["printer"] = printer
t.Assert(client.CreateRelease(release), c.IsNil)
deployment, err := client.CreateDeployment(app.ID, release.ID)
t.Assert(err, c.IsNil)
// check the deployment fails
events := make(chan *ct.DeploymentEvent)
stream, err := client.StreamDeployment(deployment, events)
t.Assert(err, c.IsNil)
defer stream.Close()
event := s.waitForDeploymentStatus(t, events, "failed")
t.Assert(event.Error, c.Equals, "printer process type failed to start, got down job event")
s.assertRolledBack(t, deployment, map[string]int{"printer": 2})
// check a new deployment can be created
_, err = client.CreateDeployment(app.ID, release.ID)
t.Assert(err, c.IsNil)
}
开发者ID:imjorge,项目名称:flynn,代码行数:43,代码来源:test_deployer.go
示例14: serveStream
// serveStream creates a subscription and streams out events in SSE format.
func (h *Handler) serveStream(w http.ResponseWriter, params httprouter.Params, kind discoverd.EventKind) {
// Create a buffered channel to receive events.
ch := make(chan *discoverd.Event, StreamBufferSize)
// Subscribe to events on the store.
service := params.ByName("service")
stream := h.Store.Subscribe(service, true, kind, ch)
// Create and serve an SSE stream.
s := sse.NewStream(w, ch, nil)
s.Serve()
s.Wait()
stream.Close()
// Check if there was an error while closing.
if err := stream.Err(); err != nil {
s.CloseWithError(err)
}
}
开发者ID:ably-forks,项目名称:flynn,代码行数:20,代码来源:handler.go
示例15: Instances
func (c *Client) Instances(service string, timeout time.Duration) ([]*Instance, error) {
s := c.Service(service)
instances, err := s.Instances()
if len(instances) > 0 || err != nil && !IsNotFound(err) {
return instances, err
}
events := make(chan *Event)
stream, err := s.Watch(events)
if err != nil {
return nil, err
}
defer stream.Close()
// get any current instances
outer:
for event := range events {
switch event.Kind {
case EventKindCurrent:
break outer
case EventKindUp:
instances = append(instances, event.Instance)
}
}
if len(instances) > 0 {
return instances, nil
}
// wait for an instance to come up
for {
select {
case event, ok := <-events:
if !ok {
return nil, stream.Err()
}
if event.Kind != EventKindUp {
continue
}
return []*Instance{event.Instance}, nil
case <-time.After(timeout):
return nil, ErrTimedOut
}
}
}
开发者ID:yanghongkjxy,项目名称:flynn,代码行数:42,代码来源:client.go
示例16: DeployAppRelease
func (c *Client) DeployAppRelease(appID, releaseID string, stopWait <-chan struct{}) error {
d, err := c.CreateDeployment(appID, releaseID)
if err != nil {
return err
}
// if initial deploy, just stop here
if d.FinishedAt != nil {
return nil
}
events := make(chan *ct.DeploymentEvent)
stream, err := c.StreamDeployment(d, events)
if err != nil {
return err
}
defer stream.Close()
outer:
for {
select {
case e, ok := <-events:
if !ok {
return fmt.Errorf("unexpected close of deployment event stream: %s", stream.Err())
}
switch e.Status {
case "complete":
break outer
case "failed":
return e.Err()
}
case <-stopWait:
return errors.New("deploy wait cancelled")
}
}
return nil
}
开发者ID:imjorge,项目名称:flynn,代码行数:38,代码来源:client.go
示例17: unfollowHost
func (s *Scheduler) unfollowHost(id string) {
log := logger.New("fn", "unfollowHost", "host.id", id)
stream, ok := s.hostStreams[id]
if !ok {
log.Warn("ignoring host unfollow due to lack of existing stream")
return
}
log.Info("unfollowing host")
for jobID, job := range s.jobs {
if job.HostID == id {
log.Info("removing job", "job.id", jobID)
s.jobs.SetState(job.JobID, JobStateStopped)
s.triggerRectify(job.Formation.key())
}
}
log.Info("closing job event stream")
stream.Close()
delete(s.hostStreams, id)
s.triggerSyncFormations()
}
开发者ID:joshteng,项目名称:flynn,代码行数:23,代码来源:scheduler.go
示例18: DeployAppReleaseWithTimeout
func (c *Client) DeployAppReleaseWithTimeout(appID, releaseID string, timeout time.Duration) error {
d, err := c.CreateDeployment(appID, releaseID)
if err != nil {
return err
}
// if initial deploy, just stop here
if d.FinishedAt != nil {
return nil
}
events := make(chan *ct.DeploymentEvent)
stream, err := c.StreamDeployment(d, events)
if err != nil {
return err
}
defer stream.Close()
outer:
for {
select {
case e, ok := <-events:
if !ok {
return errors.New("unexpected close of deployment event stream")
}
switch e.Status {
case "complete":
break outer
case "failed":
return e.Err()
}
case <-time.After(timeout):
return errors.New("timed out waiting for deployment completion")
}
}
return nil
}
开发者ID:rikur,项目名称:flynn,代码行数:37,代码来源:client.go
示例19: TestRollbackFailedJob
func (s *DeployerSuite) TestRollbackFailedJob(t *c.C) {
// create a running release
app, release := s.createRelease(t, "printer", "all-at-once")
// deploy a release which will fail to start
client := s.controllerClient(t)
release.ID = ""
printer := release.Processes["printer"]
printer.Args = []string{"this-is-gonna-fail"}
release.Processes["printer"] = printer
t.Assert(client.CreateRelease(release), c.IsNil)
deployment, err := client.CreateDeployment(app.ID, release.ID)
t.Assert(err, c.IsNil)
// check the deployment fails
events := make(chan *ct.DeploymentEvent)
stream, err := client.StreamDeployment(deployment, events)
t.Assert(err, c.IsNil)
defer stream.Close()
event := s.waitForDeploymentStatus(t, events, "failed")
t.Assert(event.Error, c.Equals, `deployer: printer job failed to start: exec: "this-is-gonna-fail": executable file not found in $PATH`)
s.assertRolledBack(t, deployment, map[string]int{"printer": 2})
}
开发者ID:imjorge,项目名称:flynn,代码行数:24,代码来源:test_deployer.go
示例20: TestNotifyOOM
func (s *HostSuite) TestNotifyOOM(t *c.C) {
appID := random.UUID()
// subscribe to init log messages from the logaggregator
client, err := logaggc.New("")
t.Assert(err, c.IsNil)
opts := logagg.LogOpts{
Follow: true,
StreamTypes: []logagg.StreamType{logagg.StreamTypeInit},
}
rc, err := client.GetLog(appID, &opts)
t.Assert(err, c.IsNil)
defer rc.Close()
msgs := make(chan *logaggc.Message)
stream := stream.New()
defer stream.Close()
go func() {
defer close(msgs)
dec := json.NewDecoder(rc)
for {
var msg logaggc.Message
if err := dec.Decode(&msg); err != nil {
stream.Error = err
return
}
select {
case msgs <- &msg:
case <-stream.StopCh:
return
}
}
}()
// run the OOM job
cmd := exec.CommandUsingCluster(
s.clusterClient(t),
s.createArtifact(t, "test-apps"),
"/bin/oom",
)
cmd.Meta = map[string]string{"flynn-controller.app": appID}
runErr := make(chan error)
go func() {
runErr <- cmd.Run()
}()
// wait for the OOM notification
for {
select {
case err := <-runErr:
t.Assert(err, c.IsNil)
case msg, ok := <-msgs:
if !ok {
t.Fatalf("message stream closed unexpectedly: %s", stream.Err())
}
t.Log(msg.Msg)
if strings.Contains(msg.Msg, "FATAL: a container process was killed due to lack of available memory") {
return
}
case <-time.After(30 * time.Second):
t.Fatal("timed out waiting for OOM notification")
}
}
}
开发者ID:imjorge,项目名称:flynn,代码行数:63,代码来源:test_host.go
注:本文中的github.com/flynn/flynn/pkg/stream.Close函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论