|
|
|
@ -1,6 +1,8 @@
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"database/sql"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
|
|
"dim/query"
|
|
|
|
@ -141,9 +143,93 @@ func PoolList(c *Context, req Request, res *Response) error {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func PoolGetAttr(c *Context, req Request, res *Response) error {
|
|
|
|
|
name := ""
|
|
|
|
|
if err := req.ParseAtLeast(1, &name); err != nil {
|
|
|
|
|
res.AddMessage(LevelError, "could not parse name: %s", err)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if name == "" {
|
|
|
|
|
res.AddMessage(LevelError, "empty name was provided")
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result := json.RawMessage{}
|
|
|
|
|
selClause := query.FieldsToJSON("p", map[string]string{
|
|
|
|
|
"name": "p.name",
|
|
|
|
|
"modified_by": "p.modified_by",
|
|
|
|
|
"modified_at": "p.modified_at",
|
|
|
|
|
"created_by": "p.created_by",
|
|
|
|
|
"created_at": "p.created_at",
|
|
|
|
|
"layer3domain": "l.name",
|
|
|
|
|
})
|
|
|
|
|
queryStr := fmt.Sprintf(`select %s from pools p join layer3domains l
|
|
|
|
|
on p.layer3domain_id = l.id
|
|
|
|
|
where p.name = $1`, selClause)
|
|
|
|
|
err := c.tx.QueryRow(queryStr, name).Scan(&result)
|
|
|
|
|
if err != nil {
|
|
|
|
|
res.AddMessage(LevelError, "could not return result")
|
|
|
|
|
return fmt.Errorf("could not get pool '%s': %s - query: %s", name, err, queryStr)
|
|
|
|
|
}
|
|
|
|
|
res.Result = result
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func PoolSetAttr(c *Context, req Request, res *Response) error {
|
|
|
|
|
name := ""
|
|
|
|
|
attrs := types.FieldMap{}
|
|
|
|
|
if err := req.ParseAtLeast(2, &name, &attrs); err != nil {
|
|
|
|
|
res.AddMessage(LevelError, "could not parse options: %s", err)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if name == "" {
|
|
|
|
|
res.AddMessage(LevelError, "empty name was provided")
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if attrs.Size() == 0 {
|
|
|
|
|
res.AddMessage(LevelError, "no key/value pairs provided to update")
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO this is ugly. Can we have better API somehow?
|
|
|
|
|
fieldMap := map[string]string{
|
|
|
|
|
"name": "",
|
|
|
|
|
"modified_by": "",
|
|
|
|
|
"modified_at": "",
|
|
|
|
|
"created_by": "",
|
|
|
|
|
"created_at": "",
|
|
|
|
|
"layer3domain_id": "",
|
|
|
|
|
}
|
|
|
|
|
if attrs.Contains("subnets") {
|
|
|
|
|
res.AddMessage(LevelError, "can not set subnets as attributes")
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if attrs.Contains("layer3domain") {
|
|
|
|
|
l3name := attrs.Fields()["layer3domain"]
|
|
|
|
|
attrs.Delete("layer3domain")
|
|
|
|
|
l3id := 0
|
|
|
|
|
err := c.tx.QueryRow(`select id from layer3domains where name = $1`, l3name).Scan(&l3id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
if err == sql.ErrNoRows {
|
|
|
|
|
res.AddMessage(LevelError, "layer3domain '%s' does not exist", l3name)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
res.AddMessage(LevelError, "could not get layer3domain")
|
|
|
|
|
return fmt.Errorf("could not fetch layer3domain id for name '%s': %#v", l3name, err)
|
|
|
|
|
}
|
|
|
|
|
attrs.Set("layer3domain_id", l3id)
|
|
|
|
|
}
|
|
|
|
|
setClause, args, err := query.FieldMapToUpdate(attrs, fieldMap)
|
|
|
|
|
if err != nil {
|
|
|
|
|
res.AddMessage(LevelError, "could not encode requested attributes: %s", err)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
queryStr := fmt.Sprintf("update pools p set %s where name = $%d", setClause, len(args)+1)
|
|
|
|
|
args = append(args, name) // don't forget to add the where clause parameter
|
|
|
|
|
c.Logf(LevelInfo, "query: %s - args: %#v", queryStr, args)
|
|
|
|
|
if _, err := c.tx.Exec(queryStr, args...); err != nil {
|
|
|
|
|
res.AddMessage(LevelError, "could not set attributes")
|
|
|
|
|
c.Logf(LevelError, "could not set attributes on layer3domain '%s': %s - query: `%s` - args: `%#v`", name, err, queryStr, args)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|