Skip to content

Commit

Permalink
Move Event to info since it is a public API object.
Browse files Browse the repository at this point in the history
  • Loading branch information
vmarmol committed Apr 1, 2015
1 parent 130d97a commit 4cb6903
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 71 deletions.
6 changes: 3 additions & 3 deletions api/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,19 +204,19 @@ func getEventRequest(r *http.Request) (*events.Request, bool, error) {
if val, ok := urlMap["oom_events"]; ok {
newBool, err := strconv.ParseBool(val[0])
if err == nil {
query.EventType[events.TypeOom] = newBool
query.EventType[info.EventOom] = newBool
}
}
if val, ok := urlMap["creation_events"]; ok {
newBool, err := strconv.ParseBool(val[0])
if err == nil {
query.EventType[events.TypeContainerCreation] = newBool
query.EventType[info.EventContainerCreation] = newBool
}
}
if val, ok := urlMap["deletion_events"]; ok {
newBool, err := strconv.ParseBool(val[0])
if err == nil {
query.EventType[events.TypeContainerDeletion] = newBool
query.EventType[info.EventContainerDeletion] = newBool
}
}
if val, ok := urlMap["max_events"]; ok {
Expand Down
9 changes: 5 additions & 4 deletions api/versions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"testing"

"github.com/google/cadvisor/events"
info "github.com/google/cadvisor/info/v1"
"github.com/stretchr/testify/assert"
)

Expand All @@ -35,8 +36,8 @@ func makeHTTPRequest(requestURL string, t *testing.T) *http.Request {
func TestGetEventRequestBasicRequest(t *testing.T) {
r := makeHTTPRequest("http://localhost:8080/api/v1.3/events?oom_events=true&historical=true&max_events=10", t)
expectedQuery := &events.Request{
EventType: map[events.EventType]bool{
events.TypeOom: true,
EventType: map[info.EventType]bool{
info.EventOom: true,
},
MaxEventsReturned: 10,
}
Expand Down Expand Up @@ -66,8 +67,8 @@ func TestGetEventEmptyRequest(t *testing.T) {
func TestGetEventRequestDoubleArgument(t *testing.T) {
r := makeHTTPRequest("http://localhost:8080/api/v1.3/events?historical=true&oom_events=true&oom_events=false", t)
expectedQuery := &events.Request{
EventType: map[events.EventType]bool{
events.TypeOom: true,
EventType: map[info.EventType]bool{
info.EventOom: true,
},
}

Expand Down
55 changes: 13 additions & 42 deletions events/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"time"

"github.com/golang/glog"
info "github.com/google/cadvisor/info/v1"
)

// EventManager is implemented by Events. It provides two ways to monitor
Expand All @@ -35,7 +36,7 @@ type EventManager interface {
GetEvents(request *Request) (EventSlice, error)
// AddEvent allows the caller to add an event to an EventManager
// object
AddEvent(e *Event) error
AddEvent(e *info.Event) error
// Removes a watch instance from the EventManager's watchers map
StopWatch(watch_id int)
}
Expand Down Expand Up @@ -80,22 +81,7 @@ type watch struct {
}

// typedef of a slice of Event pointers
type EventSlice []*Event

// Event contains information general to events such as the time at which they
// occurred, their specific type, and the actual event. Event types are
// differentiated by the EventType field of Event.
type Event struct {
// the absolute container name for which the event occurred
ContainerName string
// the time at which the event occurred
Timestamp time.Time
// the type of event. EventType is an enumerated type
EventType EventType
// the original event object and all of its extraneous data, ex. an
// OomInstance
EventData EventDataInterface
}
type EventSlice []*info.Event

// Request holds a set of parameters by which Event objects may be screened.
// The caller may want events that occurred within a specific timeframe
Expand All @@ -109,7 +95,7 @@ type Request struct {
// must be left blank in calls to WatchEvents
EndTime time.Time
// EventType is a map that specifies the type(s) of events wanted
EventType map[EventType]bool
EventType map[info.EventType]bool
// allows the caller to put a limit on how many
// events they receive. If there are more events than MaxEventsReturned
// then the most chronologically recent events in the time period
Expand All @@ -122,30 +108,15 @@ type Request struct {
IncludeSubcontainers bool
}

// EventType is an enumerated type which lists the categories under which
// events may fall. The Event field EventType is populated by this enum.
type EventType int

const (
TypeOom EventType = iota
TypeContainerCreation
TypeContainerDeletion
)

// a general interface which populates the Event field EventData. The actual
// object, such as an OomInstance, is set as an Event's EventData
type EventDataInterface interface {
}

type EventChannel struct {
watchId int
channel chan *Event
channel chan *info.Event
}

func NewEventChannel(watchId int) *EventChannel {
return &EventChannel{
watchId: watchId,
channel: make(chan *Event, 10),
channel: make(chan *info.Event, 10),
}
}

Expand All @@ -160,7 +131,7 @@ func NewEventManager() *events {
// returns a pointer to an initialized Request object
func NewRequest() *Request {
return &Request{
EventType: map[EventType]bool{},
EventType: map[info.EventType]bool{},
IncludeSubcontainers: false,
}
}
Expand All @@ -173,7 +144,7 @@ func newWatch(request *Request, eventChannel *EventChannel) *watch {
}
}

func (self *EventChannel) GetChannel() chan *Event {
func (self *EventChannel) GetChannel() chan *info.Event {
return self.channel
}

Expand Down Expand Up @@ -210,15 +181,15 @@ func getMaxEventsReturned(request *Request, eSlice EventSlice) EventSlice {
// container path is a prefix of the event container path. Otherwise,
// it checks that the container paths of the event and request are
// equivalent
func checkIfIsSubcontainer(request *Request, event *Event) bool {
func checkIfIsSubcontainer(request *Request, event *info.Event) bool {
if request.IncludeSubcontainers == true {
return strings.HasPrefix(event.ContainerName+"/", request.ContainerName+"/")
}
return event.ContainerName == request.ContainerName
}

// determines if an event occurs within the time set in the request object and is the right type
func checkIfEventSatisfiesRequest(request *Request, event *Event) bool {
func checkIfEventSatisfiesRequest(request *Request, event *info.Event) bool {
startTime := request.StartTime
endTime := request.EndTime
eventTime := event.Timestamp
Expand Down Expand Up @@ -280,13 +251,13 @@ func (self *events) WatchEvents(request *Request) (*EventChannel, error) {
}

// helper function to update the event manager's eventlist
func (self *events) updateEventList(e *Event) {
func (self *events) updateEventList(e *info.Event) {
self.eventsLock.Lock()
defer self.eventsLock.Unlock()
self.eventlist = append(self.eventlist, e)
}

func (self *events) findValidWatchers(e *Event) []*watch {
func (self *events) findValidWatchers(e *info.Event) []*watch {
watchesToSend := make([]*watch, 0)
for _, watcher := range self.watchers {
watchRequest := watcher.request
Expand All @@ -300,7 +271,7 @@ func (self *events) findValidWatchers(e *Event) []*watch {
// method of Events object that adds the argument Event object to the
// eventlist. It also feeds the event to a set of watch channels
// held by the manager if it satisfies the request keys of the channels
func (self *events) AddEvent(e *Event) error {
func (self *events) AddEvent(e *info.Event) error {
self.updateEventList(e)
self.watcherLock.RLock()
defer self.watcherLock.RUnlock()
Expand Down
23 changes: 12 additions & 11 deletions events/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"testing"
"time"

info "github.com/google/cadvisor/info/v1"
"github.com/stretchr/testify/assert"
)

Expand All @@ -33,16 +34,16 @@ func createOldTime(t *testing.T) time.Time {
}

// used to convert an OomInstance to an Event object
func makeEvent(inTime time.Time, containerName string) *Event {
return &Event{
func makeEvent(inTime time.Time, containerName string) *info.Event {
return &info.Event{
ContainerName: containerName,
Timestamp: inTime,
EventType: TypeOom,
EventType: info.EventOom,
}
}

// returns EventManager and Request to use in tests
func initializeScenario(t *testing.T) (*events, *Request, *Event, *Event) {
func initializeScenario(t *testing.T) (*events, *Request, *info.Event, *info.Event) {
fakeEvent := makeEvent(createOldTime(t), "/")
fakeEvent2 := makeEvent(time.Now(), "/")

Expand All @@ -56,7 +57,7 @@ func checkNumberOfEvents(t *testing.T, numEventsExpected int, numEventsReceived
}
}

func ensureProperEventReturned(t *testing.T, expectedEvent *Event, eventObjectFound *Event) {
func ensureProperEventReturned(t *testing.T, expectedEvent *info.Event, eventObjectFound *info.Event) {
if eventObjectFound != expectedEvent {
t.Errorf("Expected to find test object %v but found a different object: %v",
expectedEvent, eventObjectFound)
Expand All @@ -67,13 +68,13 @@ func TestCheckIfIsSubcontainer(t *testing.T) {
myRequest := NewRequest()
myRequest.ContainerName = "/root"

sameContainerEvent := &Event{
sameContainerEvent := &info.Event{
ContainerName: "/root",
}
subContainerEvent := &Event{
subContainerEvent := &info.Event{
ContainerName: "/root/subdir",
}
differentContainerEvent := &Event{
differentContainerEvent := &info.Event{
ContainerName: "/root-completely-different-container",
}

Expand Down Expand Up @@ -104,7 +105,7 @@ func TestCheckIfIsSubcontainer(t *testing.T) {

func TestWatchEventsDetectsNewEvents(t *testing.T) {
myEventHolder, myRequest, fakeEvent, fakeEvent2 := initializeScenario(t)
myRequest.EventType[TypeOom] = true
myRequest.EventType[info.EventOom] = true
returnEventChannel, err := myEventHolder.WatchEvents(myRequest)
assert.Nil(t, err)

Expand Down Expand Up @@ -145,7 +146,7 @@ func TestAddEventAddsEventsToEventManager(t *testing.T) {
func TestGetEventsForOneEvent(t *testing.T) {
myEventHolder, myRequest, fakeEvent, fakeEvent2 := initializeScenario(t)
myRequest.MaxEventsReturned = 1
myRequest.EventType[TypeOom] = true
myRequest.EventType[info.EventOom] = true

myEventHolder.AddEvent(fakeEvent)
myEventHolder.AddEvent(fakeEvent2)
Expand All @@ -160,7 +161,7 @@ func TestGetEventsForTimePeriod(t *testing.T) {
myEventHolder, myRequest, fakeEvent, fakeEvent2 := initializeScenario(t)
myRequest.StartTime = createOldTime(t).Add(-1 * time.Second * 10)
myRequest.EndTime = createOldTime(t).Add(time.Second * 10)
myRequest.EventType[TypeOom] = true
myRequest.EventType[info.EventOom] = true

myEventHolder.AddEvent(fakeEvent)
myEventHolder.AddEvent(fakeEvent2)
Expand Down
30 changes: 30 additions & 0 deletions info/v1/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -473,3 +473,33 @@ func calculateCpuUsage(prev, cur uint64) uint64 {
}
return cur - prev
}

// Event contains information general to events such as the time at which they
// occurred, their specific type, and the actual event. Event types are
// differentiated by the EventType field of Event.
type Event struct {
// the absolute container name for which the event occurred
ContainerName string
// the time at which the event occurred
Timestamp time.Time
// the type of event. EventType is an enumerated type
EventType EventType
// the original event object and all of its extraneous data, ex. an
// OomInstance
EventData EventDataInterface
}

// EventType is an enumerated type which lists the categories under which
// events may fall. The Event field EventType is populated by this enum.
type EventType int

const (
EventOom EventType = iota
EventContainerCreation
EventContainerDeletion
)

// a general interface which populates the Event field EventData. The actual
// object, such as an OomInstance, is set as an Event's EventData
type EventDataInterface interface {
}
16 changes: 8 additions & 8 deletions manager/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ type Manager interface {
WatchForEvents(request *events.Request) (*events.EventChannel, error)

// Get past events that have been detected and that fit the request.
GetPastEvents(request *events.Request) (events.EventSlice, error)
GetPastEvents(request *events.Request) ([]*info.Event, error)

CloseEventChannel(watch_id int)
}
Expand Down Expand Up @@ -671,11 +671,11 @@ func (m *manager) createContainer(containerName string) error {
return err
}

newEvent := &events.Event{
newEvent := &info.Event{
ContainerName: contRef.Name,
EventData: contSpecs,
Timestamp: contSpecs.CreationTime,
EventType: events.TypeContainerCreation,
EventType: info.EventContainerCreation,
}
err = m.eventHandler.AddEvent(newEvent)
if err != nil {
Expand Down Expand Up @@ -723,10 +723,10 @@ func (m *manager) destroyContainer(containerName string) error {
return err
}

newEvent := &events.Event{
newEvent := &info.Event{
ContainerName: contRef.Name,
Timestamp: time.Now(),
EventType: events.TypeContainerDeletion,
EventType: info.EventContainerDeletion,
}
err = m.eventHandler.AddEvent(newEvent)
if err != nil {
Expand Down Expand Up @@ -874,10 +874,10 @@ func (self *manager) watchForNewOoms() error {

go func() {
for oomInstance := range outStream {
newEvent := &events.Event{
newEvent := &info.Event{
ContainerName: oomInstance.ContainerName,
Timestamp: oomInstance.TimeOfDeath,
EventType: events.TypeOom,
EventType: info.EventOom,
EventData: oomInstance,
}
glog.V(1).Infof("Created an oom event: %v", newEvent)
Expand All @@ -896,7 +896,7 @@ func (self *manager) WatchForEvents(request *events.Request) (*events.EventChann
}

// can be called by the api which will return all events satisfying the request
func (self *manager) GetPastEvents(request *events.Request) (events.EventSlice, error) {
func (self *manager) GetPastEvents(request *events.Request) ([]*info.Event, error) {
return self.eventHandler.GetEvents(request)
}

Expand Down
6 changes: 3 additions & 3 deletions manager/manager_mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,14 @@ func (c *ManagerMock) GetRequestedContainersInfo(containerName string, options v
return args.Get(0).(map[string]*info.ContainerInfo), args.Error(1)
}

func (c *ManagerMock) WatchForEvents(queryuest *events.Request, passedChannel chan *events.Event) error {
func (c *ManagerMock) WatchForEvents(queryuest *events.Request, passedChannel chan *info.Event) error {
args := c.Called(queryuest, passedChannel)
return args.Error(0)
}

func (c *ManagerMock) GetPastEvents(queryuest *events.Request) (events.EventSlice, error) {
func (c *ManagerMock) GetPastEvents(queryuest *events.Request) ([]*info.Event, error) {
args := c.Called(queryuest)
return args.Get(0).(events.EventSlice), args.Error(1)
return args.Get(0).([]*info.Event), args.Error(1)
}

func (c *ManagerMock) GetMachineInfo() (*info.MachineInfo, error) {
Expand Down

0 comments on commit 4cb6903

Please sign in to comment.