From 7ad2fe692aacecb3c1c2b212b6a38eebf394358f Mon Sep 17 00:00:00 2001 From: Sean Murphy Date: Wed, 1 May 2019 11:06:52 +0200 Subject: [PATCH] Added client for UDR service and restructued dir --- client.go => customerdb/client.go | 2 +- udr/udr.go | 73 +++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) rename client.go => customerdb/client.go (98%) create mode 100644 udr/udr.go diff --git a/client.go b/customerdb/client.go similarity index 98% rename from client.go rename to customerdb/client.go index c45a3a5..2f75bf9 100644 --- a/client.go +++ b/customerdb/client.go @@ -6,7 +6,7 @@ // (C) Cyclops Labs 2019 // -package client +package customerdbclient import ( "bytes" diff --git a/udr/udr.go b/udr/udr.go new file mode 100644 index 0000000..fcd02eb --- /dev/null +++ b/udr/udr.go @@ -0,0 +1,73 @@ +package udrclient + +import ( + "bytes" + "encoding/json" + l "gitlab.com/cyclops-utilities/logging" + "io/ioutil" + "net/http" +) + +// The UDRRecord is reasonably self-explanaroy - the one point that is a little +// non-obvious is the data field - this can be populated using code such as the +// following: +// +// d := map[string]interface{}{ +// "UID": "1", +// "numberData": 200, +// } +// +// and setting this equal to the data field in the struct. Note that this +// implementation requires a bit more work to support embedding entire objects +// within the Data field. +// +type UDRRecord struct { + Metric string `json:"metric"` + Account string `json:"account"` + Usage float64 `json:"usage"` + Time int64 `json:"time"` + Data map[string]interface{} `json:"data"` + Unit string `json:"unit"` +} + +// UDRService simply contains the endpoint where the UDR service lives... +// It is implemented as an interface which includes a PostCommand... +type UDRService struct { + Endpoint string +} + +// PostRecord takes a UDRRecord and posts it to the UDR endpoint +func (u *UDRService) PostRecord(r UDRRecord) (success bool, err error) { + val, _ := json.Marshal(r) + // fmt.Printf("r= %+v\n", string(val)) + req, err := http.NewRequest("POST", u.Endpoint, bytes.NewBuffer(val)) + req.Header.Set("Content-Type", "application/json") + + client := &http.Client{} + resp, err := client.Do(req) + + if err != nil { + //panic(err) + l.Error.Printf("error = %v\n", err.Error()) + success = false + return + } + + defer resp.Body.Close() + + if err == nil { + if resp.StatusCode != http.StatusCreated { + l.Warning.Printf("Unexpected response POSTing to UDR - Response Status: %v\n", resp.Status) + body, _ := ioutil.ReadAll(resp.Body) + l.Debug.Printf("Response Body: %v\n", string(body)) + success = false + } else { + // this is the successful case - only dump output if in debug mode as this + // should be the default... + body, _ := ioutil.ReadAll(resp.Body) + l.Debug.Printf("Sending to Cyclops UDR service - Response Status: %v, Response Body: %v\n", resp.Status, string(body)) + success = true + } + } + return +}