Skip to content

Commit 039c59a

Browse files
authored
Merge pull request #39 from giggsoff/uuid-endpoint
uuid endpoint
2 parents c1154d9 + 2085db5 commit 039c59a

10 files changed

+182
-1
lines changed

pkg/driver/device_manager.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ type DeviceManager interface {
8383
GetConfig(uuid.UUID) ([]byte, error)
8484
// SetConfig set the config for a given uuid
8585
SetConfig(uuid.UUID, []byte) error
86+
// GetUUID get the UuidResponse for a given uuid
87+
GetUUID(uuid.UUID) ([]byte, error)
8688
// GetLogsReader get the logs for a given uuid
8789
GetLogsReader(u uuid.UUID) (io.Reader, error)
8890
// GetInfoReader get the info for a given uuid

pkg/driver/file/device_manager_file.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/lf-edge/adam/pkg/driver/common"
2222
"github.com/lf-edge/adam/pkg/util"
2323
ax "github.com/lf-edge/adam/pkg/x509"
24+
eveuuid "github.com/lf-edge/eve/api/go/eveuuid"
2425
uuid "github.com/satori/go.uuid"
2526
"google.golang.org/protobuf/proto"
2627
)
@@ -1146,3 +1147,13 @@ func (d *DeviceManager) WriteFlowMessage(u uuid.UUID, b []byte) error {
11461147
dev := d.devices[u]
11471148
return dev.AddFlowRecord(b)
11481149
}
1150+
1151+
// GetUUID get UuidResponse for device by uuid
1152+
func (d *DeviceManager) GetUUID(u uuid.UUID) ([]byte, error) {
1153+
// check that the device actually exists
1154+
if !d.deviceExists(u) {
1155+
return nil, fmt.Errorf("unregistered device UUID: %s", u)
1156+
}
1157+
ur := &eveuuid.UuidResponse{Uuid: u.String()}
1158+
return proto.Marshal(ur)
1159+
}

pkg/driver/file/device_manager_file_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ import (
1818
"github.com/lf-edge/adam/pkg/driver/common"
1919
"github.com/lf-edge/adam/pkg/util"
2020
ax "github.com/lf-edge/adam/pkg/x509"
21+
eveuuid "github.com/lf-edge/eve/api/go/eveuuid"
2122
"github.com/lf-edge/eve/api/go/info"
2223
"github.com/lf-edge/eve/api/go/metrics"
2324
uuid "github.com/satori/go.uuid"
25+
"google.golang.org/protobuf/proto"
2426
)
2527

2628
func TestDeviceManager(t *testing.T) {
@@ -738,6 +740,55 @@ func TestDeviceManager(t *testing.T) {
738740
}
739741
}
740742
})
743+
744+
t.Run("TestGetUUID", func(t *testing.T) {
745+
u, _ := uuid.NewV4()
746+
747+
tests := []struct {
748+
deviceExists bool
749+
}{
750+
{false},
751+
{true},
752+
}
753+
for _, tt := range tests {
754+
// reset with each test
755+
// make a temporary directory with which to work
756+
dir, err := ioutil.TempDir("", "adam-test")
757+
if err != nil {
758+
t.Fatal(err)
759+
}
760+
defer os.RemoveAll(dir)
761+
d := DeviceManager{
762+
databasePath: dir,
763+
}
764+
uids := fillDevice(&d)
765+
switch {
766+
case tt.deviceExists:
767+
u = *uids[0]
768+
}
769+
uuidResponse, err := d.GetUUID(u)
770+
if tt.deviceExists {
771+
if err != nil {
772+
t.Errorf("Error: %v", err)
773+
}
774+
if len(uuidResponse) == 0 {
775+
t.Error("Empty uuidResponse")
776+
}
777+
var ur eveuuid.UuidResponse
778+
err := proto.Unmarshal(uuidResponse, &ur)
779+
if err != nil {
780+
t.Errorf("Unmarshal error: %v", err)
781+
}
782+
if ur.GetUuid() != u.String() {
783+
t.Error("uuid mismatch in uuidResponse")
784+
}
785+
continue
786+
}
787+
if err == nil {
788+
t.Errorf("empty error for non-exist device")
789+
}
790+
}
791+
})
741792
}
742793

743794
func copyFile(src, dest string) error {

pkg/driver/memory/device_manager_memory.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import (
99
"io"
1010

1111
"github.com/lf-edge/adam/pkg/driver/common"
12+
eveuuid "github.com/lf-edge/eve/api/go/eveuuid"
1213
uuid "github.com/satori/go.uuid"
14+
"google.golang.org/protobuf/proto"
1315
)
1416

1517
const (
@@ -509,3 +511,14 @@ func (d *DeviceManager) WriteFlowMessage(u uuid.UUID, b []byte) error {
509511
// append the messages
510512
return dev.AddFlowRecord(b)
511513
}
514+
515+
// GetUUID get UuidResponse for device by uuid
516+
func (d *DeviceManager) GetUUID(u uuid.UUID) ([]byte, error) {
517+
// check that the device actually exists
518+
_, ok := d.devices[u]
519+
if !ok {
520+
return nil, fmt.Errorf("unregistered device UUID: %s", u)
521+
}
522+
ur := &eveuuid.UuidResponse{Uuid: u.String()}
523+
return proto.Marshal(ur)
524+
}

pkg/driver/memory/device_manager_memory_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ import (
1212

1313
"github.com/lf-edge/adam/pkg/driver/common"
1414
ax "github.com/lf-edge/adam/pkg/x509"
15+
eveuuid "github.com/lf-edge/eve/api/go/eveuuid"
1516
"github.com/lf-edge/eve/api/go/info"
1617
"github.com/lf-edge/eve/api/go/metrics"
1718
uuid "github.com/satori/go.uuid"
1819
"google.golang.org/protobuf/encoding/protojson"
20+
"google.golang.org/protobuf/proto"
1921
)
2022

2123
func TestDeviceManager(t *testing.T) {
@@ -682,4 +684,43 @@ func TestDeviceManager(t *testing.T) {
682684
}
683685
}
684686
})
687+
688+
t.Run("TestGetUUID", func(t *testing.T) {
689+
u, _ := uuid.NewV4()
690+
d := DeviceManager{}
691+
692+
tests := []struct {
693+
deviceExists bool
694+
}{
695+
{false},
696+
{true},
697+
}
698+
for _, tt := range tests {
699+
d.devices = map[uuid.UUID]common.DeviceStorage{}
700+
if tt.deviceExists {
701+
d.devices[u] = common.DeviceStorage{}
702+
}
703+
uuidResponse, err := d.GetUUID(u)
704+
if tt.deviceExists {
705+
if err != nil {
706+
t.Errorf("Error: %v", err)
707+
}
708+
if len(uuidResponse) == 0 {
709+
t.Error("Empty uuidResponse")
710+
}
711+
var ur eveuuid.UuidResponse
712+
err := proto.Unmarshal(uuidResponse, &ur)
713+
if err != nil {
714+
t.Errorf("Unmarshal error: %v", err)
715+
}
716+
if ur.GetUuid() != u.String() {
717+
t.Error("uuid mismatch in uuidResponse")
718+
}
719+
continue
720+
}
721+
if err == nil {
722+
t.Errorf("empty error for non-exist device")
723+
}
724+
}
725+
})
685726
}

pkg/driver/redis/device_manager_redis.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/go-redis/redis"
1919
"github.com/lf-edge/adam/pkg/driver/common"
2020
ax "github.com/lf-edge/adam/pkg/x509"
21+
eveuuid "github.com/lf-edge/eve/api/go/eveuuid"
2122
uuid "github.com/satori/go.uuid"
2223
"github.com/vmihailenco/msgpack/v4"
2324
"google.golang.org/protobuf/proto"
@@ -993,3 +994,14 @@ func (d *DeviceManager) WriteFlowMessage(u uuid.UUID, b []byte) error {
993994
}
994995
return dev.AddFlowRecord(b)
995996
}
997+
998+
// GetUUID get UuidResponse for device by uuid
999+
func (d *DeviceManager) GetUUID(u uuid.UUID) ([]byte, error) {
1000+
// check that the device actually exists
1001+
_, ok := d.devices[u]
1002+
if !ok {
1003+
return nil, fmt.Errorf("unregistered device UUID: %s", u)
1004+
}
1005+
ur := &eveuuid.UuidResponse{Uuid: u.String()}
1006+
return proto.Marshal(ur)
1007+
}

pkg/driver/redis/device_manager_redis_test.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import (
1111
"github.com/lf-edge/adam/pkg/util"
1212
ax "github.com/lf-edge/adam/pkg/x509"
1313
"github.com/lf-edge/eve/api/go/config"
14+
eveuuid "github.com/lf-edge/eve/api/go/eveuuid"
1415
"github.com/lf-edge/eve/api/go/info"
1516
"github.com/lf-edge/eve/api/go/metrics"
1617
uuid "github.com/satori/go.uuid"
1718
"github.com/stretchr/testify/assert"
1819
"google.golang.org/protobuf/encoding/protojson"
20+
"google.golang.org/protobuf/proto"
1921
)
2022

2123
func TestInit(t *testing.T) {
@@ -106,14 +108,22 @@ func TestDeviceRedis(t *testing.T) {
106108
assert.Equal(t, nil, err)
107109
UUID, err := r.DeviceCheckCert(cert)
108110
assert.Equal(t, nil, err)
109-
assert.Equal(t, UUID1, UUID)
111+
assert.Equal(t, UUID1, *UUID)
110112

111113
certBack, certOnboardBack, serial, err := r.DeviceGet(UUID)
112114
assert.Equal(t, nil, err)
113115
assert.Equal(t, "123456", serial)
114116
assert.Equal(t, cert, certBack)
115117
assert.Equal(t, certOnboard, certOnboardBack)
116118

119+
uuidResponse, err := r.GetUUID(*UUID)
120+
assert.Equal(t, nil, err)
121+
122+
var ur eveuuid.UuidResponse
123+
err = proto.Unmarshal(uuidResponse, &ur)
124+
assert.Equal(t, nil, err)
125+
assert.Equal(t, ur.GetUuid(), UUID.String())
126+
117127
UUIDs, err := r.DeviceList()
118128
assert.Equal(t, nil, err)
119129
assert.Equal(t, 3, len(UUIDs))

pkg/server/apiHandler.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,22 @@ func (h *apiHandler) appLogs(w http.ResponseWriter, r *http.Request) {
253253
w.WriteHeader(status)
254254
}
255255

256+
func (h *apiHandler) uuid(w http.ResponseWriter, r *http.Request) {
257+
u := h.checkCertAndRecord(w, r)
258+
if u == nil {
259+
return
260+
}
261+
uuidResponce, err := h.manager.GetUUID(*u)
262+
if err != nil {
263+
log.Printf("error getting device uuidResponce: %v", err)
264+
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
265+
return
266+
}
267+
w.Header().Add(contentType, mimeProto)
268+
w.WriteHeader(http.StatusOK)
269+
w.Write(uuidResponce)
270+
}
271+
256272
func (h *apiHandler) newAppLogs(w http.ResponseWriter, r *http.Request) {
257273
u := h.checkCertAndRecord(w, r)
258274
if u == nil {

pkg/server/apiHandlerv2.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,3 +630,26 @@ func (h *apiHandlerv2) flowlog(w http.ResponseWriter, r *http.Request) {
630630
}
631631
w.WriteHeader(status)
632632
}
633+
634+
func (h *apiHandlerv2) uuid(w http.ResponseWriter, r *http.Request) {
635+
u := h.checkCertAndRecord(w, r)
636+
if u == nil {
637+
return
638+
}
639+
uuidResponce, err := h.manager.GetUUID(*u)
640+
if err != nil {
641+
log.Printf("error getting device uuidResponce: %v", err)
642+
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
643+
return
644+
}
645+
cloudEnvelope, eErr := h.prepareEnvelope(uuidResponce)
646+
if eErr != nil {
647+
msg := fmt.Sprintf("Error occurred while creating envelope: %v", eErr)
648+
log.Print(msg)
649+
http.Error(w, msg, http.StatusInternalServerError)
650+
return
651+
}
652+
w.Header().Add(contentType, mimeProto)
653+
w.WriteHeader(http.StatusOK)
654+
w.Write(cloudEnvelope)
655+
}

pkg/server/server.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ func (s *Server) Start() {
112112
ed.HandleFunc("/flowlog", api.flowLog).Methods("POST")
113113
ed.HandleFunc("/apps/instances/id/{uuid}/logs", api.appLogs).Methods("POST")
114114
ed.HandleFunc("/apps/instanceid/id/{uuid}/newlogs", api.newAppLogs).Methods("POST")
115+
ed.HandleFunc("/uuid", api.uuid).Methods("POST")
115116

116117
if hasApiV2 {
117118
apiv2 := &apiHandlerv2{
@@ -144,6 +145,7 @@ func (s *Server) Start() {
144145
edv2.HandleFunc("/id/{uuid}/flowlog", apiv2.flowlog).Methods("POST")
145146
edv2.HandleFunc("/id/{uuid}/apps/instances/id/{appuuid}/logs", apiv2.appLogs).Methods("POST")
146147
edv2.HandleFunc("/id/{uuid}/apps/instanceid/{appuuid}/newlogs", apiv2.newAppLogs).Methods("POST")
148+
edv2.HandleFunc("/uuid", apiv2.uuid).Methods("POST")
147149
}
148150

149151
// admin endpoint - custom, used to manage adam

0 commit comments

Comments
 (0)