// +build !release package main import ( "math/rand" "sort" "strings" "time" "github.com/bcicen/ctop/metrics" "github.com/jgautheron/codename-generator" "github.com/nu7hatch/gouuid" ) type MockContainerSource struct { containers Containers } func NewMockContainerSource() *MockContainerSource { cs := &MockContainerSource{} go cs.Init() go cs.Loop() return cs } // Create Mock containers func (cs *MockContainerSource) Init() { total := 20 rand.Seed(int64(time.Now().Nanosecond())) for i := 0; i < total; i++ { //time.Sleep(1 * time.Second) collector := metrics.NewMock() c := NewContainer(makeID(), collector) c.SetMeta("name", makeName()) c.SetState(makeState()) cs.containers = append(cs.containers, c) } } func (cs *MockContainerSource) Loop() { iter := 0 for { // Change state for random container if iter%5 == 0 && len(cs.containers) > 0 { randC := cs.containers[rand.Intn(len(cs.containers))] randC.SetState(makeState()) } iter++ time.Sleep(3 * time.Second) } } // Get a single container, by ID func (cs *MockContainerSource) Get(id string) (*Container, bool) { for _, c := range cs.containers { if c.Id == id { return c, true } } return nil, false } // Return array of all containers, sorted by field func (cs *MockContainerSource) All() Containers { sort.Sort(cs.containers) return cs.containers } // Remove containers by ID func (cs *MockContainerSource) delByID(id string) { for n, c := range cs.containers { if c.Id == id { cs.del(n) return } } } // Remove one or more containers by index func (cs *MockContainerSource) del(idx ...int) { for _, i := range idx { cs.containers = append(cs.containers[:i], cs.containers[i+1:]...) } log.Infof("removed %d dead containers", len(idx)) } func makeID() string { u, err := uuid.NewV4() if err != nil { panic(err) } return strings.Replace(u.String(), "-", "", -1)[:12] } func makeName() string { n, err := codename.Get(codename.Sanitized) nsp := strings.Split(n, "-") if len(nsp) > 2 { n = strings.Join(nsp[:2], "-") } if err != nil { panic(err) } return strings.Replace(n, "-", "_", -1) } func makeState() string { switch rand.Intn(10) { case 0, 1, 2: return "exited" case 3: return "paused" } return "running" }