From 20ce43147c20f9ce6d3b2b89c229553155171cbd Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Tue, 17 Jul 2018 19:02:57 +0530 Subject: [PATCH 1/4] Added utility to perform CRUD operations --- src/CRUD/CRUD.go | 121 +++++++++++++++++++++++++++++++++++++++++++++ src/CRUD/README.md | 43 ++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 src/CRUD/CRUD.go create mode 100644 src/CRUD/README.md diff --git a/src/CRUD/CRUD.go b/src/CRUD/CRUD.go new file mode 100644 index 0000000..be6ef7b --- /dev/null +++ b/src/CRUD/CRUD.go @@ -0,0 +1,121 @@ +package main + +import ( + "bytes" + "encoding/json" + "flag" + "fmt" + "io" + "io/ioutil" + "net/http" + "os" +) + +var auth string + +func makeRequest(requestType, mac, messageType, source, transId, dest, contentType, payload string, client *http.Client) { + + var deviceName string + deviceName = fmt.Sprintf("mac:%s/%s", mac, dest) + + headers := make(map[string]string) + + headers["Authorization"] = auth + var req *http.Request + var err error + var url string + + if "POST" == requestType { + headers["X-Xmidt-Message-Type"]= messageType + headers["X-Xmidt-Content-Type"]= contentType + headers["X-Xmidt-Transaction-Uuid"]= transId + headers["X-Xmidt-Source"]= source + headers["X-Webpa-Device-Name"]= deviceName + + url = fmt.Sprintf("https://api.xmidt.comcast.net/api/v2/device") + fmt.Printf("Received Request %s, %s \n", messageType, url) + + req, err = http.NewRequest(requestType, url, bytes.NewBufferString(payload)) + } + + + if err != nil { + fmt.Printf("Request %s failed: %s, %v\n", requestType, url, err) + } + + for k, v := range headers { + req.Header.Set(k, v) + } + + resp, err := client.Do(req) + + if err != nil { + fmt.Printf("Failed to obtain request: %v\n", err) + } else { + + var res map[string]interface{} + dec := json.NewDecoder(resp.Body) + dec.UseNumber() + dec.Decode(&res) + + if 200 != resp.StatusCode { + fmt.Printf("Failed. resp.StatusCode %v \n", resp.StatusCode) + } else { + fmt.Printf("Success. resp.StatusCode %v\n", resp.StatusCode) + } + io.Copy(ioutil.Discard, resp.Body) + resp.Body.Close() + } +} + +func main() { + if "" == os.Getenv("WEBPA_SAT") { + fmt.Printf("Environment variable WEBPA_SAT must be set a valid SAT token.") + return + } + + auth = "Bearer " + os.Getenv("WEBPA_SAT") + + var maxConnReuse uint + var requestType, mac, messageType, source, dest, contentType, transId, payload string + + flag.StringVar(&mac, "mac", "", "device-id") + flag.StringVar(&messageType, "messageType", "", "type of the request to send") + flag.StringVar(&payload, "payload", "", "the payload to send to apply") + + flag.StringVar(&source, "source", "", "source value for CRUD operations") + flag.StringVar(&dest, "dest", "", "CRUD dest value to apply") + flag.StringVar(&transId, "transId", "", "transId for CRUD operations") + flag.StringVar(&contentType, "contentType", "", "contentType for CRUD operations") + flag.UintVar(&maxConnReuse, "max-reuse", 100, "the maximum number of connection re-use attempts -- (advanced)") + + flag.Parse() + + if "" == messageType{ + fmt.Printf("Please provide messageType option\n") + return + } else if "" != messageType { + requestType = "POST" + if "Create" == messageType || "Update" == messageType { + if "" == payload { + fmt.Printf("Please provide payload option\n") + return + } + } + + if "" == source || "" == dest || "" == transId || "" == contentType { + fmt.Printf("Please provide the required arguments: source, dest, transId, contentType\n") + return + } + } + + client := &http.Client{ + Transport: &http.Transport{ + MaxIdleConnsPerHost: int(maxConnReuse), + }, + } + + fmt.Printf("Request Type: %s, Payload: %s\n", requestType, payload) + makeRequest(requestType, mac, messageType, source, transId, dest, contentType, payload, client) + +} diff --git a/src/CRUD/README.md b/src/CRUD/README.md new file mode 100644 index 0000000..e0f4f09 --- /dev/null +++ b/src/CRUD/README.md @@ -0,0 +1,43 @@ +## CRUD +Utility to perform parodus CRUD operations for a particular device mac. + +To build with just go: +``` +export GOPATH=`pwd` +cd src +glide install +cd src/CRUD +go build + +``` + +## Authentication +export WEBPA_SAT= + +### Example : + +### Create +``` +./CRUD -messageType=Create -payload='{ "expires" : 12345}' -mac=14cfe2142XXX -source="tag-update" -dest="parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" + +``` + +### Retrieve +``` +./CRUD -messageType=Retrieve -mac=14cfe2142XXX -source="tag-update" -dest="parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" + +``` + + +### Update +``` +./CRUD -messageType=Update -payload='{ "expires" : 12345}' -mac=14cfe2142XXX -source="tag-update" -dest="parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" + +``` + +### Delete +``` +./CRUD -messageType=Delete -mac=14cfe2142XXX -source="tag-update" -dest="parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" + +``` + From bbb0364c9d5551e04d7ceb31b36cda43d0bc2689 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 18 Jul 2018 12:08:56 +0530 Subject: [PATCH 2/4] Defined constants for header and url --- src/CRUD/CRUD.go | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/CRUD/CRUD.go b/src/CRUD/CRUD.go index be6ef7b..db6c72c 100644 --- a/src/CRUD/CRUD.go +++ b/src/CRUD/CRUD.go @@ -11,6 +11,17 @@ import ( "os" ) +const ( + AuthHeaderName = "Authorization" + TypeHeaderName = "X-Xmidt-Message-Type" + ContentHeaderName = "X-Xmidt-Content-Type" + TransIdHeaderName = "X-Xmidt-Transaction-Uuid" + SourceHeaderName = "X-Xmidt-Source" + DestHeaderName = "X-Webpa-Device-Name" + PathURL = "https://api.xmidt.comcast.net/api/v2/device" +) + + var auth string func makeRequest(requestType, mac, messageType, source, transId, dest, contentType, payload string, client *http.Client) { @@ -20,27 +31,25 @@ func makeRequest(requestType, mac, messageType, source, transId, dest, contentTy headers := make(map[string]string) - headers["Authorization"] = auth + headers[AuthHeaderName] = auth var req *http.Request var err error - var url string if "POST" == requestType { - headers["X-Xmidt-Message-Type"]= messageType - headers["X-Xmidt-Content-Type"]= contentType - headers["X-Xmidt-Transaction-Uuid"]= transId - headers["X-Xmidt-Source"]= source - headers["X-Webpa-Device-Name"]= deviceName + headers[TypeHeaderName]= messageType + headers[ContentHeaderName]= contentType + headers[TransIdHeaderName]= transId + headers[SourceHeaderName]= source + headers[DestHeaderName]= deviceName - url = fmt.Sprintf("https://api.xmidt.comcast.net/api/v2/device") - fmt.Printf("Received Request %s, %s \n", messageType, url) + fmt.Printf("Received Request %s, %s \n", messageType, PathURL) - req, err = http.NewRequest(requestType, url, bytes.NewBufferString(payload)) + req, err = http.NewRequest(requestType, PathURL, bytes.NewBufferString(payload)) } if err != nil { - fmt.Printf("Request %s failed: %s, %v\n", requestType, url, err) + fmt.Printf("Request %s failed: %s, %v\n", requestType, PathURL, err) } for k, v := range headers { @@ -82,7 +91,6 @@ func main() { flag.StringVar(&mac, "mac", "", "device-id") flag.StringVar(&messageType, "messageType", "", "type of the request to send") flag.StringVar(&payload, "payload", "", "the payload to send to apply") - flag.StringVar(&source, "source", "", "source value for CRUD operations") flag.StringVar(&dest, "dest", "", "CRUD dest value to apply") flag.StringVar(&transId, "transId", "", "transId for CRUD operations") @@ -115,7 +123,6 @@ func main() { }, } - fmt.Printf("Request Type: %s, Payload: %s\n", requestType, payload) makeRequest(requestType, mac, messageType, source, transId, dest, contentType, payload, client) } From 0094dc246a00c869091847a021bb2a6f3414f89f Mon Sep 17 00:00:00 2001 From: skrishnamoorthy01 Date: Wed, 18 Jul 2018 15:48:21 +0530 Subject: [PATCH 3/4] Transform msgpack format response to json --- src/CRUD/CRUD.go | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/CRUD/CRUD.go b/src/CRUD/CRUD.go index db6c72c..dff3e0b 100644 --- a/src/CRUD/CRUD.go +++ b/src/CRUD/CRUD.go @@ -2,13 +2,13 @@ package main import ( "bytes" - "encoding/json" "flag" "fmt" "io" "io/ioutil" "net/http" "os" + "github.com/Comcast/webpa-common/wrp" ) const ( @@ -61,16 +61,38 @@ func makeRequest(requestType, mac, messageType, source, transId, dest, contentTy if err != nil { fmt.Printf("Failed to obtain request: %v\n", err) } else { - - var res map[string]interface{} - dec := json.NewDecoder(resp.Body) - dec.UseNumber() - dec.Decode(&res) if 200 != resp.StatusCode { fmt.Printf("Failed. resp.StatusCode %v \n", resp.StatusCode) + } else if 200 == resp.StatusCode { + /*Decode Msgpack response to JSON format*/ + target := wrp.AllFormats() + decoder := wrp.NewDecoder(resp.Body, target[0]) + var buffer bytes.Buffer + encoder := wrp.NewEncoder(&buffer, target[1]) + + if message, err := wrp.TranscodeMessage(encoder, decoder); err != nil { + fmt.Println("Error while converting:", target[0], "to", target[1], err) + } else { + //Headers + fmt.Println("Content-Type :", resp.Header.Get("Content-Type")) + fmt.Println("Status :", resp.Header.Get("X-Xmidt-Status")) + fmt.Println("Build :", resp.Header.Get("X-Scytale-Build")) + fmt.Println("Flavor :", resp.Header.Get("X-Scytale-Flavor")) + fmt.Println("Region :", resp.Header.Get("X-Scytale-Region")) + fmt.Println("Server :", resp.Header.Get("X-Scytale-Server")) + //Metadata + fmt.Println("Fw-name :", message.Metadata["fw-name"]) + //WRP fields + fmt.Println("TransactionKey :", message.TransactionKey()) + fmt.Println("source :", message.Source) + fmt.Println("Destination :", message.Destination) + fmt.Println("MessageType :", message.Type) + fmt.Println("payload :", string(message.Payload)) + } + } else { - fmt.Printf("Success. resp.StatusCode %v\n", resp.StatusCode) + fmt.Println("Request failed with status ", resp.StatusCode) } io.Copy(ioutil.Discard, resp.Body) resp.Body.Close() From 2a03b7050e90b66b6da95765ca351f0f555dc193 Mon Sep 17 00:00:00 2001 From: Sadhyama Vengilat Date: Wed, 18 Jul 2018 19:53:49 +0530 Subject: [PATCH 4/4] Added glide files and few updates in README.md --- src/CRUD/CRUD.go | 13 ++++--------- src/CRUD/README.md | 11 +++++------ src/glide.yaml | 5 +++++ 3 files changed, 14 insertions(+), 15 deletions(-) create mode 100644 src/glide.yaml diff --git a/src/CRUD/CRUD.go b/src/CRUD/CRUD.go index dff3e0b..6d728a1 100644 --- a/src/CRUD/CRUD.go +++ b/src/CRUD/CRUD.go @@ -24,10 +24,8 @@ const ( var auth string -func makeRequest(requestType, mac, messageType, source, transId, dest, contentType, payload string, client *http.Client) { +func makeRequest(requestType, messageType, source, transId, dest, contentType, payload string, client *http.Client) { - var deviceName string - deviceName = fmt.Sprintf("mac:%s/%s", mac, dest) headers := make(map[string]string) @@ -40,9 +38,7 @@ func makeRequest(requestType, mac, messageType, source, transId, dest, contentTy headers[ContentHeaderName]= contentType headers[TransIdHeaderName]= transId headers[SourceHeaderName]= source - headers[DestHeaderName]= deviceName - - fmt.Printf("Received Request %s, %s \n", messageType, PathURL) + headers[DestHeaderName]= dest req, err = http.NewRequest(requestType, PathURL, bytes.NewBufferString(payload)) } @@ -108,9 +104,8 @@ func main() { auth = "Bearer " + os.Getenv("WEBPA_SAT") var maxConnReuse uint - var requestType, mac, messageType, source, dest, contentType, transId, payload string + var requestType, messageType, source, dest, contentType, transId, payload string - flag.StringVar(&mac, "mac", "", "device-id") flag.StringVar(&messageType, "messageType", "", "type of the request to send") flag.StringVar(&payload, "payload", "", "the payload to send to apply") flag.StringVar(&source, "source", "", "source value for CRUD operations") @@ -145,6 +140,6 @@ func main() { }, } - makeRequest(requestType, mac, messageType, source, transId, dest, contentType, payload, client) + makeRequest(requestType, messageType, source, transId, dest, contentType, payload, client) } diff --git a/src/CRUD/README.md b/src/CRUD/README.md index e0f4f09..6c42be5 100644 --- a/src/CRUD/README.md +++ b/src/CRUD/README.md @@ -6,7 +6,7 @@ To build with just go: export GOPATH=`pwd` cd src glide install -cd src/CRUD +cd CRUD go build ``` @@ -18,26 +18,25 @@ export WEBPA_SAT= ### Create ``` -./CRUD -messageType=Create -payload='{ "expires" : 12345}' -mac=14cfe2142XXX -source="tag-update" -dest="parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" - +./CRUD -messageType=5 -source="tag-update" -dest="mac:14cfe21421xx/parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" -payload='{ "expires" : 12345}' ``` ### Retrieve ``` -./CRUD -messageType=Retrieve -mac=14cfe2142XXX -source="tag-update" -dest="parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" +./CRUD -messageType=6 -source="tag-update" -dest="mac:14cfe21421xx/parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" ``` ### Update ``` -./CRUD -messageType=Update -payload='{ "expires" : 12345}' -mac=14cfe2142XXX -source="tag-update" -dest="parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" +./CRUD -messageType=7 -source="tag-update" -dest="mac:14cfe21421xx/parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" -payload='{ "expires" : 12345}' ``` ### Delete ``` -./CRUD -messageType=Delete -mac=14cfe2142XXX -source="tag-update" -dest="parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" +./CRUD -messageType=8 -source="tag-update" -dest="mac:14cfe21421xx/parodus/tag/test1" -transId="bd4ad2d1-5c9c-486f-8e25-52c242b38" -contentType="application/json" ``` diff --git a/src/glide.yaml b/src/glide.yaml new file mode 100644 index 0000000..4e7325c --- /dev/null +++ b/src/glide.yaml @@ -0,0 +1,5 @@ +package: . +import: +- package: github.com/Comcast/webpa-common + version: c936e1b4ec39c3bb796d28aa11a1bd97dac4e05d +