parent
							
								
									ce5c9f4854
								
							
						
					
					
						commit
						7ad2fe692a
					
				@ -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 | 
				
			||||||
 | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue