Skip to content

Commit da1b592

Browse files
authored
Merge pull request #451 from kcajmagic/feature/sessionID
add session-id to event metadata
2 parents 6126784 + aef602c commit da1b592

File tree

6 files changed

+119
-1
lines changed

6 files changed

+119
-1
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
- Added session-id to device information [#451](https://github.com/xmidt-org/webpa-common/pull/451)
9+
- Added device metadata to outbound events [#451](https://github.com/xmidt-org/webpa-common/pull/451)
810

911
## [v1.5.1]
1012
- Added automated releases using travis [#444](https://github.com/xmidt-org/webpa-common/pull/444)

device/device.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package device
22

33
import (
44
"bytes"
5+
"crypto/rand"
6+
"encoding/base64"
57
"encoding/json"
68
"fmt"
79
"sync/atomic"
@@ -96,6 +98,9 @@ type Interface interface {
9698
// SatClientID returns the SAT JWT token passed when the device connected
9799
SatClientID() string
98100

101+
// SessionID returns the session id associated with the devices connection
102+
SessionID() string
103+
99104
// Trust returns the trust level of this device
100105
Trust() string
101106

@@ -127,6 +132,7 @@ type device struct {
127132

128133
partnerIDs []string
129134
satClientID string
135+
sessionID string
130136

131137
trust string
132138

@@ -166,6 +172,10 @@ func newDevice(o deviceOptions) *device {
166172
var partnerIDs []string
167173
partnerIDs = append(partnerIDs, o.PartnerIDs...)
168174

175+
var id [16]byte
176+
rand.Read(id[:])
177+
sessionID := base64.RawURLEncoding.EncodeToString(id[:])
178+
169179
return &device{
170180
id: o.ID,
171181
errorLog: logging.Error(o.Logger, "id", o.ID),
@@ -180,6 +190,7 @@ func newDevice(o deviceOptions) *device {
180190
transactions: NewTransactions(),
181191
partnerIDs: partnerIDs,
182192
satClientID: o.SatClientID,
193+
sessionID: sessionID,
183194
trust: o.Trust,
184195
}
185196
}
@@ -337,6 +348,10 @@ func (d *device) SatClientID() string {
337348
return d.satClientID
338349
}
339350

351+
func (d *device) SessionID() string {
352+
return d.sessionID
353+
}
354+
340355
func (d *device) Trust() string {
341356
return d.trust
342357
}

device/device_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ func TestDevice(t *testing.T) {
5757
)
5858

5959
require.NotNil(device)
60+
assert.NotEmpty(device.sessionID)
6061
device.statistics = NewStatistics(func() time.Time { return expectedConnectedAt.Add(expectedUpTime) }, expectedConnectedAt)
6162

6263
assert.Equal(string(record.expectedID), device.String())
@@ -104,3 +105,19 @@ func TestDevice(t *testing.T) {
104105
assert.Error(err)
105106
}
106107
}
108+
109+
func TestDeviceSessionID(t *testing.T) {
110+
assert := assert.New(t)
111+
112+
connectOptions := deviceOptions{
113+
ID: "1",
114+
QueueSize: 10,
115+
ConnectedAt: time.Now(),
116+
Logger: logging.NewTestLogger(nil, t),
117+
}
118+
sessionOne := newDevice(connectOptions)
119+
sessionTwo := newDevice(connectOptions)
120+
assert.Equal(sessionOne.ID(), sessionTwo.ID())
121+
assert.NotEqual(sessionOne.SessionID(), sessionTwo.SessionID())
122+
}
123+

device/manager.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"io"
66
"net/http"
7+
"strings"
78
"sync"
89
"time"
910

@@ -340,7 +341,7 @@ func (m *manager) readPump(d *device, r ReadCloser, closeOnce *sync.Once) {
340341
event.Type = TransactionComplete
341342
}
342343
}
343-
344+
event = updateEventMetadata(event)
344345
m.dispatch(&event)
345346
}
346347
}
@@ -490,3 +491,28 @@ func (m *manager) Route(request *Request) (*Response, error) {
490491
return nil, ErrorDeviceNotFound
491492
}
492493
}
494+
495+
func updateEventMetadata(event Event) Event {
496+
var (
497+
contents []byte
498+
msg wrp.Message
499+
)
500+
501+
// decode event
502+
err := wrp.NewDecoderBytes(event.Contents, event.Format).Decode(&msg)
503+
if err != nil {
504+
return event
505+
}
506+
507+
// update metadata
508+
msg.Metadata["partner-ids"] = strings.Join(event.Device.PartnerIDs(), ",")
509+
msg.Metadata["session-id"] = event.Device.SessionID()
510+
511+
// encode event
512+
err = wrp.NewEncoderBytes(&contents, event.Format).Encode(&msg)
513+
if err != nil {
514+
return event
515+
}
516+
event.Contents = contents
517+
return event
518+
}

device/manager_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net/http"
77
"net/http/httptest"
88
"net/url"
9+
"strings"
910
"sync"
1011
"testing"
1112
"time"
@@ -395,3 +396,54 @@ func TestGaugeCardinality(t *testing.T) {
395396
m.(*manager).measures.Models.With("neat", "bad").Add(-1)
396397
})
397398
}
399+
400+
func TestUpdateMetadata(t *testing.T) {
401+
assert := assert.New(t)
402+
require := require.New(t)
403+
msg := wrp.Message{
404+
Type: wrp.SimpleEventMessageType,
405+
Source: "external.com",
406+
Destination: "mac:FFEEAADD44443333",
407+
TransactionUUID: "DEADBEEF",
408+
Headers: []string{"Header1", "Header2"},
409+
Metadata: map[string]string{"name": "value"},
410+
Spans: [][]string{{"1", "2"}, {"3"}},
411+
Payload: []byte{1, 2, 3, 4, 0xff, 0xce},
412+
PartnerIDs: []string{"foo"},
413+
}
414+
originalContents := []byte{}
415+
err := wrp.NewEncoderBytes(&originalContents, wrp.Msgpack).Encode(&msg)
416+
require.NoError(err)
417+
device := newDevice(deviceOptions{
418+
ID: "mac:FFEEAADD44443333",
419+
C: nil,
420+
Compliance: 0,
421+
PartnerIDs: nil,
422+
SatClientID: "",
423+
Trust: "",
424+
QueueSize: 0,
425+
ConnectedAt: time.Time{},
426+
Logger: nil,
427+
})
428+
originalEvent := Event{
429+
Type: MessageReceived,
430+
Device: device,
431+
Message: &msg,
432+
Format: wrp.Msgpack,
433+
Contents: originalContents,
434+
}
435+
436+
event := updateEventMetadata(originalEvent)
437+
438+
assert.Equal(originalEvent.Device, event.Device)
439+
assert.Equal(originalEvent.Message, event.Message)
440+
assert.NotEqual(originalEvent.Contents, event.Contents)
441+
assert.Equal(originalEvent.Format, event.Format)
442+
443+
expectedMetaData := map[string]string{"name": "value", "session-id": device.SessionID(), "partner-ids": strings.Join(device.PartnerIDs(), ",")}
444+
445+
newMessage := new(wrp.Message)
446+
err = wrp.NewDecoderBytes(event.Contents, event.Format).Decode(newMessage)
447+
require.NoError(err)
448+
assert.Equal(expectedMetaData, newMessage.Metadata)
449+
}

device/mocks.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ func (m *MockDevice) SatClientID() string {
111111
return first
112112
}
113113

114+
func (m *MockDevice) SessionID() string {
115+
arguments := m.Called()
116+
first, _ := arguments.Get(0).(string)
117+
return first
118+
}
119+
114120
func (m *MockDevice) Trust() string {
115121
return m.Called().String(0)
116122
}

0 commit comments

Comments
 (0)