diff --git a/cdb/db_actions.go b/cdb/db_actions.go index 77544a2..0dc2c6c 100644 --- a/cdb/db_actions.go +++ b/cdb/db_actions.go @@ -5,6 +5,7 @@ import ( "database/sql" "errors" "fmt" + "strings" "time" "github.com/google/uuid" @@ -36,6 +37,7 @@ type ( `subset` varchar(255) DEFAULT NULL, `command` varchar(256) DEFAULT '', `origin` varchar(128) DEFAULT '', + `log_type` varchar(30) DEFAULT '', PRIMARY KEY (`id`), KEY `action` (`action`), KEY `end` (`end`), @@ -65,6 +67,18 @@ type ( StatusLog string Command string Origin string + Version string + LogType string + } + + // SvcActionLine contains the SvcAction log line for a rid or subset + SvcActionLine struct { + Begin string + RID string + Subset string + Pid string + Status string + StatusLog string } BActionErrorCount struct { @@ -250,10 +264,10 @@ func (oDb *DB) GetUnfinishedActions(ctx context.Context) (lines []SvcAction, err } -func (oDb *DB) InsertSvcAction(ctx context.Context, a SvcAction) (int64, error) { +func (oDb *DB) InsertSvcAction(ctx context.Context, a SvcAction, lines ...SvcActionLine) (int64, error) { maxCommandLen := 255 - query := "INSERT INTO svcactions (svc_id, node_id, rid, subset, action, begin, status_log, sid, pid, cron, command, origin" - placeholders := "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?" + query := "INSERT INTO svcactions (svc_id, node_id, rid, subset, action, begin, status_log, sid, pid, cron, command, origin, log_type" + placeholders := "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?" statusLogLen := len(a.StatusLog) if statusLogLen > MediumTextMax { @@ -266,7 +280,7 @@ func (oDb *DB) InsertSvcAction(ctx context.Context, a SvcAction) (int64, error) a.Command = string(runes[:maxCommandLen]) } - args := []any{a.SvcID, a.NodeID, a.RID, a.Subset, a.Action, a.BeginAt, a.StatusLog, a.Session, a.Pid, a.Cron, a.Command, a.Origin} + args := []any{a.SvcID, a.NodeID, a.RID, a.Subset, a.Action, a.BeginAt, a.StatusLog, a.Session, a.Pid, a.Cron, a.Command, a.Origin, "status"} if !a.EndAt.IsZero() { query += ", end, time" @@ -300,18 +314,26 @@ func (oDb *DB) InsertSvcAction(ctx context.Context, a SvcAction) (int64, error) oDb.Metrics.InstanceActionInsert.Inc() } + if len(lines) > 0 { + if err := oDb.insertSvcActionLines(ctx, a, lines); err != nil { + return id, err + } + } + return id, nil } -func (oDb *DB) UpdateSvcAction(ctx context.Context, a SvcAction) error { - const query = `UPDATE svcactions SET end = ?, status = ?, time = TIMESTAMPDIFF(SECOND, begin, ?), status_log = ? WHERE id = ?` +func (oDb *DB) UpdateSvcAction(ctx context.Context, a SvcAction, lines ...SvcActionLine) error { + const ( + queryEnd = `UPDATE svcactions SET end = ?, status = ?, time = TIMESTAMPDIFF(SECOND, begin, ?), status_log = ? WHERE id = ?` + ) statusLogLen := len(a.StatusLog) if statusLogLen > MediumTextMax { // Fix end svc action failed: Error 1406 (22001): Data too long for column 'status_log' at row 1 // TODO: add metrics svcactions status_log truncated with len / TextMax a.StatusLog = a.StatusLog[:MediumTextMax] } - result, err := oDb.ExecContext(ctx, query, a.EndAt, a.Status, a.EndAt, a.StatusLog, a.ID) + result, err := oDb.ExecContext(ctx, queryEnd, a.EndAt, a.Status, a.EndAt, a.StatusLog, a.ID) if err != nil { return fmt.Errorf("update svcactions failed status_log length %d: %w", statusLogLen, err) } else if result == nil { @@ -323,6 +345,29 @@ func (oDb *DB) UpdateSvcAction(ctx context.Context, a SvcAction) error { oDb.SetChange("svcactions") oDb.Metrics.InstanceActionUpdate.Inc() } + + if len(lines) == 0 { + return nil + } + return oDb.insertSvcActionLines(ctx, a, lines) +} + +func (oDb *DB) insertSvcActionLines(ctx context.Context, a SvcAction, lines []SvcActionLine) error { + if len(lines) == 0 { + return nil + } + + placeholders := strings.Repeat("(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),", len(lines)-1) + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + query := fmt.Sprintf("INSERT INTO svcactions (svc_id,node_id,sid,action,command,origin,version,cron,begin,pid,rid,subset,status,status_log) VALUES %s", placeholders) + args := make([]any, 0, 14*len(lines)) + for _, line := range lines { + args = append(args, a.SvcID, a.NodeID, a.Session, a.Action, a.Command, a.Origin, a.Version, a.Cron, + line.Begin, line.Pid, line.RID, line.Subset, line.Status, line.StatusLog) + } + + if _, err := oDb.ExecContext(ctx, query, args...); err != nil { + return fmt.Errorf("insert svcactions loglines failed: %w", err) + } return nil } diff --git a/feeder/api.yaml b/feeder/api.yaml index b6a5cba..0411f2d 100644 --- a/feeder/api.yaml +++ b/feeder/api.yaml @@ -5,7 +5,7 @@ servers: info: title: opensvc feeder api - version: 3.0.3 + version: 3.0.4 paths: /checks: @@ -471,59 +471,93 @@ components: Action: type: object + description: | + The begin or end action request required: - path - - rid - - subset - action - - command + - argv + - pid + - rids - origin - version - - begin - cron - - session_uuid - - pid - - argv - uuid + - session_uuid + - begin - end - - status_log - status + - status_log + - lines properties: path: type: string - rid: + action: type: string - subset: + argv: + type: array + items: + type: string + description: the command line arguments + pid: + description: action pid type: string - action: + rids: + description: the action resolved rids type: string origin: type: string version: type: string description: the opensvc client data version - begin: - type: string - description: begin action timestamp in RFC3339Nano format cron: type: boolean - session_uuid: + uuid: + description: action uuid that have been assigned during the action begin type: string - pid: + session_uuid: type: string - argv: - type: array - items: - type: string - uuid: + begin: type: string + description: begin action timestamp in RFC3339Nano format end: type: string description: end action timestamp in RFC3339Nano format + status: + type: string + description: action status status_log: + description: describe the command line + type: string + lines: + type: array + items: + $ref: '#/components/schemas/ActionLine' + + ActionLine: + type: object + required: + - begin + - rid + - subset + - pid + - status_log + - status + properties: + begin: + type: string + description: begin action timestamp + rid: + type: string + subset: + type: string + pid: + description: the action line pid if meaningful type: string status: type: string + status_log: + type: string QueuedActions: type: object diff --git a/feeder/codegen_server_gen.go b/feeder/codegen_server_gen.go index f2bff43..bc758f4 100644 --- a/feeder/codegen_server_gen.go +++ b/feeder/codegen_server_gen.go @@ -334,46 +334,49 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "k1kyniT7m/3/AgAA///Ry5rGdTgAAA==", + "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", + "q0GlODsAAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/feeder/codegen_type_gen.go b/feeder/codegen_type_gen.go index c43af31..ef13d30 100644 --- a/feeder/codegen_type_gen.go +++ b/feeder/codegen_type_gen.go @@ -14,31 +14,56 @@ const ( BearerAuthScopes = "bearerAuth.Scopes" ) -// Action defines model for Action. +// Action The begin or end action request type Action struct { - Action string `json:"action"` - Argv []string `json:"argv"` + Action string `json:"action"` + + // Argv the command line arguments + Argv []string `json:"argv"` // Begin begin action timestamp in RFC3339Nano format Begin string `json:"begin"` Cron bool `json:"cron"` // End end action timestamp in RFC3339Nano format - End string `json:"end"` - Origin string `json:"origin"` - Path string `json:"path"` - Pid string `json:"pid"` - Rid string `json:"rid"` + End string `json:"end"` + Lines []ActionLine `json:"lines"` + Origin string `json:"origin"` + Path string `json:"path"` + + // Pid action pid + Pid string `json:"pid"` + + // Rids the action resolved rids + Rids string `json:"rids"` SessionUuid string `json:"session_uuid"` - Status string `json:"status"` - StatusLog string `json:"status_log"` - Subset string `json:"subset"` - Uuid string `json:"uuid"` + + // Status action status + Status string `json:"status"` + + // StatusLog describe the command line + StatusLog string `json:"status_log"` + + // Uuid action uuid that have been assigned during the action begin + Uuid string `json:"uuid"` // Version the opensvc client data version Version string `json:"version"` } +// ActionLine defines model for ActionLine. +type ActionLine struct { + // Begin begin action timestamp + Begin string `json:"begin"` + + // Pid the action line pid if meaningful + Pid string `json:"pid"` + Rid string `json:"rid"` + Status string `json:"status"` + StatusLog string `json:"status_log"` + Subset string `json:"subset"` +} + // ActionRequestAccepted defines model for ActionRequestAccepted. type ActionRequestAccepted struct { Uuid string `json:"uuid"` diff --git a/feeder/handlers/post_feed_instance_action.go b/feeder/handlers/post_feed_instance_action.go index e6ae679..4bec029 100644 --- a/feeder/handlers/post_feed_instance_action.go +++ b/feeder/handlers/post_feed_instance_action.go @@ -66,6 +66,7 @@ func (a *Api) PostInstanceAction(c echo.Context) error { uuid := uuid.New().String() idx := fmt.Sprintf("%s@%s@%s:%s", payload.Path, nodeID, ClusterID, uuid) + log.Debug("post feed instance action sid:"+payload.SessionUuid+" uuid:"+uuid, logkey.Error, err) log.Debug("Hset FeedInstanceActionH") if _, err := a.Redis.HSet(ctx, keyH, idx, b).Result(); err != nil { diff --git a/feeder/handlers/put_feed_instance_action.go b/feeder/handlers/put_feed_instance_action.go index bc0ccbe..881abe9 100644 --- a/feeder/handlers/put_feed_instance_action.go +++ b/feeder/handlers/put_feed_instance_action.go @@ -58,6 +58,7 @@ func (a *Api) PutInstanceActionEnd(c echo.Context) error { ctx := c.Request().Context() idx := fmt.Sprintf("%s@%s@%s:%s", payload.Path, nodeID, ClusterID, payload.Uuid) + log.Debug("put feed instance action sid:"+payload.SessionUuid+" uuid:"+payload.Uuid, logkey.Error, err) log.Debug("HSet keyH") if _, err := a.Redis.HSet(ctx, keyH, idx, b).Result(); err != nil { diff --git a/worker/job_feed_instance_action.go b/worker/job_feed_instance_action.go index 13efd54..ba43e84 100644 --- a/worker/job_feed_instance_action.go +++ b/worker/job_feed_instance_action.go @@ -150,8 +150,7 @@ func (d *jobFeedInstanceAction) updateDB(ctx context.Context) error { action := cdb.SvcAction{ SvcID: objectUUID, NodeID: nodeUUID, - RID: d.data.Rid, - Subset: d.data.Subset, + RID: d.data.Rids, Action: d.data.Action, Command: strings.Join(d.data.Argv, " "), Origin: d.data.Origin, @@ -163,17 +162,27 @@ func (d *jobFeedInstanceAction) updateDB(ctx context.Context) error { Status: d.data.Status, StatusLog: statusLog, } - + lines := make([]cdb.SvcActionLine, len(d.data.Lines)) + for i, v := range d.data.Lines { + lines[i] = cdb.SvcActionLine{ + Begin: v.Begin, + RID: v.Rid, + Subset: v.Subset, + Pid: v.Pid, + Status: v.Status, + StatusLog: v.StatusLog, + } + } if !found { // begin not processed yet, insert full record - if _, err := d.oDb.InsertSvcAction(ctx, action); err != nil { + if _, err := d.oDb.InsertSvcAction(ctx, action, lines...); err != nil { return fmt.Errorf("insert svc action failed: %w", err) } } else { // begin already processed, update record with end info action.ID = actionID - if err := d.oDb.UpdateSvcAction(ctx, action); err != nil { - return fmt.Errorf("end svc action failed, initial statusLog length %d: %w", len(statusLog), err) + if err := d.oDb.UpdateSvcAction(ctx, action, lines...); err != nil { + return fmt.Errorf("end svc action failed: %w", err) } } @@ -198,8 +207,7 @@ func (d *jobFeedInstanceAction) updateDB(ctx context.Context) error { action := cdb.SvcAction{ SvcID: objectUUID, NodeID: nodeUUID, - RID: d.data.Rid, - Subset: d.data.Subset, + RID: d.data.Rids, Action: d.data.Action, Command: strings.Join(d.data.Argv, " "), Origin: d.data.Origin, @@ -207,7 +215,6 @@ func (d *jobFeedInstanceAction) updateDB(ctx context.Context) error { Pid: d.data.Pid, Cron: d.data.Cron, BeginAt: beginTime, - Status: "", StatusLog: statusLog, } if _, err := d.oDb.InsertSvcAction(ctx, action); err != nil {