You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by da...@apache.org on 2018/03/08 22:31:20 UTC
[incubator-trafficcontrol] 06/28: implemented the Create for
parameters
This is an automated email from the ASF dual-hosted git repository.
dangogh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-trafficcontrol.git
commit 2d5827b2976dbfafb56601e96c4910bdd6cc3e34
Author: Dewayne Richardson <de...@apache.org>
AuthorDate: Thu Mar 1 11:03:28 2018 -0700
implemented the Create for parameters
---
.../traffic_ops_golang/parameter/parameters.go | 94 ++++++++++++++++++++++
traffic_ops/traffic_ops_golang/routes.go | 1 +
2 files changed, 95 insertions(+)
diff --git a/traffic_ops/traffic_ops_golang/parameter/parameters.go b/traffic_ops/traffic_ops_golang/parameter/parameters.go
index 41fbeaa..1d07f53 100644
--- a/traffic_ops/traffic_ops_golang/parameter/parameters.go
+++ b/traffic_ops/traffic_ops_golang/parameter/parameters.go
@@ -20,6 +20,7 @@ package parameter
*/
import (
+ "errors"
"strconv"
"github.com/apache/incubator-trafficcontrol/lib/go-log"
@@ -29,6 +30,7 @@ import (
"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/dbhelpers"
"github.com/jmoiron/sqlx"
+ "github.com/lib/pq"
)
//we need a type alias to define functions on
@@ -67,6 +69,98 @@ func (parameter *TOParameter) SetID(i int) {
parameter.ID = &i
}
+func (pl *TOParameter) Validate(db *sqlx.DB) []error {
+ errs := []error{}
+ name := pl.Name
+ if name != nil && len(*name) < 1 {
+ errs = append(errs, errors.New(`Parameter 'name' is required.`))
+ }
+ return errs
+}
+
+//The TOParameter implementation of the Creator interface
+//all implementations of Creator should use transactions and return the proper errorType
+//ParsePQUniqueConstraintError is used to determine if a parameter with conflicting values exists
+//if so, it will return an errorType of DataConflict and the type should be appended to the
+//generic error message returned
+//The insert sql returns the id and lastUpdated values of the newly inserted parameter and have
+//to be added to the struct
+func (pl *TOParameter) Create(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
+ rollbackTransaction := true
+ tx, err := db.Beginx()
+ defer func() {
+ if tx == nil || !rollbackTransaction {
+ return
+ }
+ err := tx.Rollback()
+ if err != nil {
+ log.Errorln(errors.New("rolling back transaction: " + err.Error()))
+ }
+ }()
+
+ if err != nil {
+ log.Error.Printf("could not begin transaction: %v", err)
+ return tc.DBError, tc.SystemError
+ }
+ resultRows, err := tx.NamedQuery(insertQuery(), pl)
+ if err != nil {
+ if pqErr, ok := err.(*pq.Error); ok {
+ err, eType := dbhelpers.ParsePQUniqueConstraintError(pqErr)
+ if eType == tc.DataConflictError {
+ return errors.New("a parameter with " + err.Error()), eType
+ }
+ return err, eType
+ }
+ log.Errorf("received non pq error: %++v from create execution", err)
+ return tc.DBError, tc.SystemError
+ }
+ defer resultRows.Close()
+
+ var id int
+ var lastUpdated tc.TimeNoMod
+ rowsAffected := 0
+ for resultRows.Next() {
+ rowsAffected++
+ if err := resultRows.Scan(&id, &lastUpdated); err != nil {
+ log.Error.Printf("could not scan id from insert: %s\n", err)
+ return tc.DBError, tc.SystemError
+ }
+ }
+ if rowsAffected == 0 {
+ err = errors.New("no parameter was inserted, no id was returned")
+ log.Errorln(err)
+ return tc.DBError, tc.SystemError
+ }
+ if rowsAffected > 1 {
+ err = errors.New("too many ids returned from parameter insert")
+ log.Errorln(err)
+ return tc.DBError, tc.SystemError
+ }
+
+ pl.SetID(id)
+ pl.LastUpdated = &lastUpdated
+ err = tx.Commit()
+ if err != nil {
+ log.Errorln("Could not commit transaction: ", err)
+ return tc.DBError, tc.SystemError
+ }
+ rollbackTransaction = false
+ return nil, tc.NoError
+}
+
+func insertQuery() string {
+ query := `INSERT INTO parameter (
+name,
+config_file,
+value,
+secure) VALUES (
+:name,
+:config_file,
+:value,
+:secure) RETURNING id,last_updated`
+ return query
+}
+
func (parameter *TOParameter) Read(db *sqlx.DB, parameters map[string]string, user auth.CurrentUser) ([]interface{}, []error, tc.ApiErrorType) {
var rows *sqlx.Rows
diff --git a/traffic_ops/traffic_ops_golang/routes.go b/traffic_ops/traffic_ops_golang/routes.go
index 4bbe650..4b1feb3 100644
--- a/traffic_ops/traffic_ops_golang/routes.go
+++ b/traffic_ops/traffic_ops_golang/routes.go
@@ -151,6 +151,7 @@ func Routes(d ServerData) ([]Route, http.Handler, error) {
//Parameters
{1.3, http.MethodGet, `parameters/?(\.json)?$`, api.ReadHandler(parameter.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
{1.3, http.MethodGet, `parameters/{id}$`, api.ReadHandler(parameter.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+ {1.3, http.MethodPost, `parameters/?$`, api.CreateHandler(parameter.GetRefType(), d.DB), auth.PrivLevelOperations, Authenticated, nil},
//Ping
{1.2, http.MethodGet, `ping$`, ping.PingHandler(), auth.PrivLevelReadOnly, Authenticated, nil},
--
To stop receiving notification emails like this one, please contact
dangogh@apache.org.