diff --git a/sql/n9e_ams.sql b/sql/n9e_ams.sql index 219314b4..21a40bed 100644 --- a/sql/n9e_ams.sql +++ b/sql/n9e_ams.sql @@ -27,4 +27,29 @@ CREATE TABLE `host` ) ENGINE = InnoDB DEFAULT CHARSET = utf8; +CREATE TABLE `host_field` +( + `id` int unsigned not null AUTO_INCREMENT, + `field_ident` varchar(255) not null comment 'english identity', + `field_name` varchar(255) not null comment 'chinese name', + `field_type` varchar(64) not null, + `field_required` tinyint(1) not null default 0, + `field_extra` varchar(2048) not null default '', + `field_cate` varchar(255) not null default 'Default', + PRIMARY KEY (`id`), + KEY (`field_cate`, `field_ident`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +CREATE TABLE `host_field_value` +( + `id` int unsigned not null AUTO_INCREMENT, + `host_id` int unsigned not null, + `field_ident` varchar(255) not null, + `field_value` varchar(1024) not null default '', + PRIMARY KEY (`id`), + KEY (`host_id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8; + /* 网络设备管理、机柜机架、配件耗材等相关的功能是商业版本才有的,表结构不要放到这里 */ diff --git a/src/models/host_field.go b/src/models/host_field.go new file mode 100644 index 00000000..ecd52d1f --- /dev/null +++ b/src/models/host_field.go @@ -0,0 +1,88 @@ +package models + +import ( + "fmt" +) + +type HostField struct { + Id int64 `json:"id"` + FieldIdent string `json:"field_ident"` + FieldName string `json:"field_name"` + FieldType string `json:"field_type"` + FieldRequired int `json:"field_required"` + FieldExtra string `json:"field_extra"` + FieldCate string `json:"field_cate"` +} + +func (hf *HostField) Validate() error { + if len(hf.FieldIdent) > 255 { + return fmt.Errorf("field ident too long") + } + + if len(hf.FieldName) > 255 { + return fmt.Errorf("field name too long") + } + + if len(hf.FieldExtra) > 2048 { + return fmt.Errorf("field extra too long") + } + + if len(hf.FieldCate) > 255 { + return fmt.Errorf("field cate too long") + } + + return nil +} + +func HostFieldNew(objPtr *HostField) error { + if err := objPtr.Validate(); err != nil { + return err + } + + cnt, err := DB["ams"].Where("field_ident=?", objPtr.FieldIdent).Count(new(HostField)) + if err != nil { + return err + } + + if cnt > 0 { + return fmt.Errorf("%s already exists", objPtr.FieldIdent) + } + + _, err = DB["ams"].Insert(objPtr) + return err +} + +func (hf *HostField) Update(cols ...string) error { + if err := hf.Validate(); err != nil { + return err + } + + _, err := DB["ams"].Where("id=?", hf.Id).Cols(cols...).Update(hf) + return err +} + +func HostFieldGet(where string, args ...interface{}) (*HostField, error) { + var obj HostField + has, err := DB["ams"].Where(where, args...).Get(&obj) + if err != nil { + return nil, err + } + + if !has { + return nil, nil + } + + return &obj, nil +} + +func (hf *HostField) Del() error { + _, err := DB["ams"].Where("id=?", hf.Id).Delete(new(HostField)) + return err +} + +// HostFieldGets 条数非常少,全部返回 +func HostFieldGets() ([]HostField, error) { + var objs []HostField + err := DB["ams"].OrderBy("field_cate, field_ident").Find(&objs) + return objs, err +} diff --git a/src/models/host_field_value.go b/src/models/host_field_value.go new file mode 100644 index 00000000..741ddd0c --- /dev/null +++ b/src/models/host_field_value.go @@ -0,0 +1,58 @@ +package models + +import ( + "fmt" +) + +type HostFieldValue struct { + Id int64 `json:"id"` + HostId int64 `json:"host_id"` + FieldIdent string `json:"field_ident"` + FieldValue string `json:"field_value"` +} + +func (hfv *HostFieldValue) Validate() error { + if len(hfv.FieldValue) > 1024 { + return fmt.Errorf("field value too long") + } + return nil +} + +// HostFieldValueGets 条数非常少,全部返回 +func HostFieldValueGets(hostId int64) ([]HostFieldValue, error) { + var objs []HostFieldValue + err := DB["ams"].Where("host_id = ?", hostId).OrderBy("field_ident").Find(&objs) + return objs, err +} + +func HostFieldValuePuts(hostId int64, objs []HostFieldValue) error { + count := len(objs) + + session := DB["ams"].NewSession() + defer session.Close() + + for i := 0; i < count; i++ { + num, err := session.Where("host_id = ? and field_ident = ?", hostId, objs[i].FieldIdent).Count(new(HostFieldValue)) + if err != nil { + return fmt.Errorf("count host_field_value fail: %v", err) + } + + if num > 0 { + _, err = session.Exec("UPDATE host_field_value SET field_value = ? WHERE host_id = ? and field_ident = ?", objs[i].FieldValue, hostId, objs[i].FieldIdent) + if err != nil { + return fmt.Errorf("update host_field_value fail: %v", err) + } + } else { + _, err = session.InsertOne(HostFieldValue{ + HostId: hostId, + FieldIdent: objs[i].FieldIdent, + FieldValue: objs[i].FieldValue, + }) + if err != nil { + return fmt.Errorf("insert host_field_value fail: %v", err) + } + } + } + + return nil +} diff --git a/src/modules/ams/http/router.go b/src/modules/ams/http/router.go index 2c98e22e..cfbd4a9c 100644 --- a/src/modules/ams/http/router.go +++ b/src/modules/ams/http/router.go @@ -19,6 +19,10 @@ func Config(r *gin.Engine) { userLogin.PUT("/hosts/cate", hostCatePut) userLogin.DELETE("/hosts", hostDel) userLogin.GET("/hosts/search", hostSearchGets) + userLogin.GET("/hosts/fields", hostFieldsGets) + userLogin.GET("/hosts/field/:id", hostFieldGet) + userLogin.GET("/host/:id/fields", hostFieldGets) + userLogin.PUT("/host/:id/fields", hostFieldPuts) } v1 := r.Group("/v1/ams-ce").Use(shouldBeService()) diff --git a/src/modules/ams/http/router_host_field.go b/src/modules/ams/http/router_host_field.go new file mode 100644 index 00000000..af42d065 --- /dev/null +++ b/src/modules/ams/http/router_host_field.go @@ -0,0 +1,31 @@ +package http + +import ( + "github.com/gin-gonic/gin" + + "github.com/didi/nightingale/src/models" +) + +func hostFieldsGets(c *gin.Context) { + lst, err := models.HostFieldGets() + renderData(c, lst, err) +} + +func hostFieldGet(c *gin.Context) { + obj, err := models.HostFieldGet("id = ?", urlParamInt64(c, "id")) + renderData(c, obj, err) +} + +func hostFieldGets(c *gin.Context) { + lst, err := models.HostFieldValueGets(urlParamInt64(c, "id")) + renderData(c, lst, err) +} + +func hostFieldPuts(c *gin.Context) { + var objs []models.HostFieldValue + bind(c, &objs) + + loginUser(c).CheckPermGlobal("ams_host_modify") + + renderMessage(c, models.HostFieldValuePuts(urlParamInt64(c, "id"), objs)) +}