Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/27614.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:improvement
events: Added a Purge flag to JobDeregistered event type to differentiate between stopped and deleted jobs
```
3 changes: 2 additions & 1 deletion nomad/state/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,8 @@ func eventFromChange(change memdb.Change) (structs.Event, bool) {
Key: before.ID,
Namespace: before.Namespace,
Payload: &structs.JobEvent{
Job: before,
Job: before,
Purge: true,
},
}, true
case "nodes":
Expand Down
32 changes: 21 additions & 11 deletions nomad/state/events_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -698,34 +698,44 @@ func TestEventsFromChanges_AllocClientUpdateRequestType(t *testing.T) {
t.SkipNow()
}

func TestEventsFromChanges_JobDeregisterRequestType(t *testing.T) {
t.SkipNow()
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😅


func TestEventsFromChanges_WithDeletion(t *testing.T) {
ci.Parallel(t)

upsertedJob := &structs.Job{ID: "upserted-job", Namespace: "default"}
purgedJob := &structs.Job{ID: "purged-job", Namespace: "default"}

changes := Changes{
Index: uint64(1),
Changes: memdb.Changes{
{
Table: "jobs",
Before: &structs.Job{},
After: &structs.Job{},
Before: upsertedJob,
After: upsertedJob, // updated (stop, not purge)
},
{
Table: "jobs",
Before: &structs.Job{},
After: nil, // deleted
Before: purgedJob,
After: nil, // deleted (purged)
},
},
MsgType: structs.JobDeregisterRequestType,
}

event := eventsFromChanges(nil, changes)
must.NotNil(t, event)
events := eventsFromChanges(nil, changes)
must.NotNil(t, events)
must.Len(t, 2, events.Events)

// first event: upserted job (stop) — Purge should be false
upsertEvent := events.Events[0]
upsertPayload, ok := upsertEvent.Payload.(*structs.JobEvent)
must.True(t, ok)
must.False(t, upsertPayload.Purge)

must.Len(t, 2, event.Events)
// second event: deleted job (purge) — Purge should be true
purgeEvent := events.Events[1]
purgePayload, ok := purgeEvent.Payload.(*structs.JobEvent)
must.True(t, ok)
must.True(t, purgePayload.Purge)
}

func TestEventsFromChanges_WithNodeDeregistration(t *testing.T) {
Expand Down
4 changes: 4 additions & 0 deletions nomad/structs/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ func (j *EventJson) Copy() *EventJson {
// JobEvent holds a newly updated Job.
type JobEvent struct {
Job *Job

// Purge indicates whether the job was deleted from the state store. This
// field is only set for JobDeregistered events.
Purge bool `json:",omitempty"`
}

// EvaluationEvent holds a newly updated Eval.
Expand Down
Loading