# PureLinux ## JOB STAUS ```go const ( JOB_NEW JOB_STATUS = `new` // 新的 Job JOB_RUNNING JOB_STATUS = `running` // 正在執行 Job JOB_DONE JOB_STATUS = `done` // 已完成 Job JOB_PAUSE JOB_STATUS = `pause` // 暫停的 Job JOB_FAILED JOB_STATUS = `failed` // 失敗的 Job (算完成的一種 ) ``` ## sendCLI (Embd) ### Note > compList = stage > 沒有做到的 task status -- > code 每個都要各自表示的意思,default value 不同 ### Input Data ```json { "devID": "8D6785", // 裝置 ID // 一個二維陣列,單台 embd 通常用 [1][cmd length] "CLICommands": [ [ { "devID": "8D6785", // 裝置 ID "refReturn": {}, // 要將此 cmd 的回傳參數帶入下個 cmd 使用 "refParam": {}, // 要拿取上個 cmd 執行完的結果當作參數 "param": { "uuid": "Jydisi-WimS-8Wm7-FQOc-vVuf-GUfI-qEq4te", "size": 1025 }, "key": "lvmExpand", "devType": "raid" // 不重要照填即可,已經棄用可忽略 } ] ], devType: "raid", // 不重要照填即可,已經棄用可忽略 estimatedTime: 10, // 不重要照填即可,已經棄用可忽略 templateID: "none" // 不重要照填即可,已經棄用可忽略 } ``` ### Old Job Respone ::: spoiler 成功的範例 ```json= { "esPercent": 84, "msgArray": [ { "msg": "[\"0x06170146\",[]]", "dataArray": [ { "performance": "mid", "protection": "", "media": "mid" } ], "code": "0x06170146", "status": "success" } ], "currStepTask": 1, "totalSteps": 1, "progress": 0, "step": 1, "compList": [ { "msg": "[\"0x06170146\",[]]", "msgObj": { "isFSS": true, "data": [ { "performance": "mid", "protection": "", "media": "mid" } ], "msgList": [ { "code": "0x06170146", "message": "0x06170146", "params": [] } ] }, "code": "0x06170146", "taskList": [ { "msgObj": { "isFSS": true, "data": [ { "performance": "mid", "protection": "", "media": "mid" } ], "msgList": [ { "code": "0x06170146", "message": "0x06170146", "params": [] } ] }, "status": "success" } ], "status": "success" } ], "templateID": "none", "currStepTotalTasks": 1, "status": "done" } ``` ::: ::: spoiler 失敗的範例 ```json= { "esPercent": 2, "msgArray": [ { "msg": "[\"0xFFF00004\",[]]", "dataArray": [], "code": "0x00040000", "status": "failed" } ], "currStepTask": 1, "totalSteps": 1, "progress": 0, "step": 1, "compList": [ { "msg": "", "msgObj": { "isFSS": true, "data": [], "msgList": [ { "code": "0x00040000", "message": "0xFFF00004", "params": [] } ] }, "code": "0x00000000", "taskList": [ { "msgObj": { "isFSS": true, "data": [], "msgList": [ { "code": "0x00040000", "message": "0xFFF00004", "params": [] } ] }, "status": "failed" } ], "status": "failed" } ], "templateID": "none", "currStepTotalTasks": 1, "status": "failed" } ``` ::: ### Old Job with struct ```go= type oldJobResult struct { EsPercent int `json:"esPercent"` // i don't know MsgArray []msgArray `json:"msgArray"` CurrStepTask int `json:"currStepTask"` TotalSteps int `json:"totalSteps"` Progress int `json:"progress"` // not use ? Step int `json:"step"` // not use ? CompList []compList `json:"compList"` TemplateID string `json:"templateID"` // not use ? CurrStepTotalTasks int `json:"currStepTotalTasks"` // i don't know Status string `json:"status"` } type msgArray struct { Msg string `json:"msg"` // compose [returnCode.code, returnCode.Params] Code string `json:"code"` // NASCLI cliCode.Return || returnCode.code Status string `json:"status"` DataArray []*simplejson.Json `json:"dataArray"` // NASCLI data } type compList struct { Msg string `json:"msg"` // compose [returnCode.code, returnCode.Params] MsgObj msgObj `json:"msgObj,omitempty"` Code string `json:"code"` // not sure, sometime will use cliCode.Return/returnCode.code/0x0000 TaskList []taskList `json:"taskList"` Status string `json:"status"` } type msgObj struct { IsFss bool `json:"isFss"` // always true Data []*simplejson.Json `json:"data"` // NASCLI data MsgList []msgList `json:"msgList"` } type msgList struct { Code string `json:"code"` // NASCLI cliCode.Return || returnCode.code Message string `json:"message"` // NASCLI (cliCode.Return || returnCode.code)? to lang Param *simplejson.Json `json:"params"` // NASCLI returnCode.Params } ``` ### Compare 使用相同 cmd 在不同台下的 job result :::spoiler EonOne ```json= { "esPercent": 5, "msgArray": [ { "msg": "[\"general_output_successful\",[]]", "dataArray": [ { "clear_text_password": false, "server_name": "nas-8739448-a", "login_message": "", "enabled": false } ], "code": "0x00000000", "status": "success" } ], "currStepTask": 1, "totalSteps": 1, "progress": 0, "step": 1, "compList": [ { "msg": "[\"general_output_successful\",[]]", "msgObj": { "isFSS": true, "data": [ { "clear_text_password": false, "server_name": "nas-8739448-a", "login_message": "", "enabled": false } ], "msgList": [ { "code": "0x00000000", "message": "general_output_successful", "params": [] } ] }, "code": "0x00000000", "taskList": [ { "msgObj": { "isFSS": true, "data": [ { "clear_text_password": false, "server_name": "nas-8739448-a", "login_message": "", "enabled": false } ], "msgList": [ { "code": "0x00000000", "message": "general_output_successful", "params": [] } ] }, "status": "success" } ], "status": "success" } ], "templateID": "none", "currStepTotalTasks": 1, "status": "done" } ``` ::: :::spoiler PureLinux (getCLIExecutorStatus) ```json= { "esPercent": 100, "msgArray": [ { "msg": "[\"0x0000\",{}]", "code": "0x0000", "status": "success", "dataArray": [ { "$controller$": "SlotB", "clear_text_password": false, "enabled": false, "login_message": "", "server_name": "ks-9267075" }, { "$controller$": "SlotA", "clear_text_password": false, "enabled": false, "login_message": "", "server_name": "ks-9267075" } ] } ], "currStepTask": 1, "totalSteps": 1, "progress": 100, "step": 1, "compList": [ { "msg": "[\"0x0000\",{}]", "msgObj": { "isFss": true, "data": [ { "$controller$": "SlotB", "clear_text_password": false, "enabled": false, "login_message": "", "server_name": "ks-9267075" }, { "$controller$": "SlotA", "clear_text_password": false, "enabled": false, "login_message": "", "server_name": "ks-9267075" } ], "msgList": [ { "code": "0x0000", "message": "0x0000", "params": {} } ] }, "code": "0x0000", "taskList": [ { "msgObj": { "isFss": true, "data": [ { "$controller$": "SlotB", "clear_text_password": false, "enabled": false, "login_message": "", "server_name": "ks-9267075" }, { "$controller$": "SlotA", "clear_text_password": false, "enabled": false, "login_message": "", "server_name": "ks-9267075" } ], "msgList": [ { "code": "0x0000", "message": "0x0000", "params": {} } ] }, "status": "success" } ], "status": "success" } ], "templateID": "none", "currStepTotalTasks": 1, "status": "done" } ``` ::: :::spoiler PureLinux (getJob) 跟上面不同的測試,單純補充格式 ```json= { "currentTask": 1, "err": [], "result": [ [ { "cliCode": { "Return": "0x0000", "CLI": "Successful" }, "returnCode": [], "data": [] } ] ], "status": "done", "totalTask": 1 } ``` ::: --- ## sendParallel ### Note > 有一堆還沒有辦法實作的欄位 > 像是 device busy 的錯誤訊息並不通用 > 以及部分還未實作的功能欄位 e.x. revert ::: spoiler Device busy reponse (Old) ```jsonld= { "revertObjects": [ { "Stage 6760E-0": { "success": true, "jobs": {} } } ], "objects": [ { "Stage 64DC9-0": { "executeByJobManagerException": { "currentCommamdIndex": 0, "subCommandObject": { "devID": "64DC9", "param": { "a": "", "slot": "slotA" }, "refReturn": {}, "key": "fssOssV2KeyDel" }, "Exception": "Can not find job from jobmanager by jobID: ''. deviceBusy: true", "threadName": "CLIParallelForDevice_unsetStageKey_Stage_64DC9-0_11", "isSuccess": false } }, "Stage 6760E-0": { "14e095e3-78c2-430a-9bff-ce4200761431": { "JobStatus": "failed", "JobStdOutput": { "dataArray": [], "code": "0x00040000", "message": "0xFFF00004", "params": [] }, "Severity": "stop all stages", "isConnectionFailed": false, "JobCompList": [ { "msgObj": { "dataArray": [], "isFSS": true, "msgs": [ { "msg": "0xFFF00004", "code": "0x00040000", "params": [] } ] }, "code": "0x00000000", "success": false, "devIDForTask": [ "64DC9" ], "taskList": [ { "devID": "64DC9", "msgObj": { "dataArray": [], "isFSS": true, "msgs": [ { "msg": "0xFFF00004", "code": "0x00040000", "params": [] } ] }, "refParam": {}, "success": false, "cmdParam": { "a": "", "slot": "slotA" }, "ignoreFail": false, "failed": true, "cmdKey": "fssOssV2KeyDel", "config": {}, "refReturn": {}, "status": "failed" } ], "failed": true, "message": "", "status": "failed" } ], "isSuccess": false } } } ], "isRevertSuccess": true, "isConnectionFailed": false, "status": "error" } ``` ::: ### Old Respone ::: spoiler 範例 (I/O) ```jsonld= { "CommandSetKey": "parallelV2", "devType": "raid", "redirectEmbeddedDevId": null, "CLICommands": [ { "stageKey": "syncCommand", "command": { "64DC9": [ { "key": "setControllerDate", "devID": "64DC9", "param": { "yyyyMMdd": "20230815", "hhmmss": "102400" } } ] } }, { "stageKey": "setAllNodes", "command": { "6760E": [ { "key": "setControllerParm", "devID": "6760E", "param": { "sntpIp": "172.26.112.63", "sntpPoll": "1" }, "refReturn": {}, "refParam": {} }, { "key": "showCheckNTP", "devID": "6760E", "param": { "ip": "172.26.112.63" }, "option": {} } ] } } ] } ``` ```jsonld= { "revertObjects": [], "objects": [ { "Stage 64DC9-0": { "2aed59ed-63a4-40e2-a347-fe25a1f4542e": { "JobStatus": "done", "JobStdOutput": { "dataArray": [], "code": "0x00000000", "message": "general_output_successful", "params": [] }, "JobCompList": [ { "msgObj": { "dataArray": [], "isFSS": false, "msgs": [ { "msg": "general_output_successful", "code": "0x00000000", "params": [] } ] }, "code": "0x00000000", "success": true, "devIDForTask": [ "64DC9" ], "taskList": [ { "devID": "64DC9", "msgObj": { "dataArray": [], "isFSS": false, "msgs": [ { "msg": "general_output_successful", "code": "0x00000000", "params": [] } ] }, "refParam": {}, "cmdParam": { "hhmmss": "102400", "yyyyMMdd": "20230815" }, "ignoreFail": false, "success": true, "failed": false, "cmdKey": "setControllerDate", "config": {}, "refReturn": {}, "status": "success" } ], "failed": false, "message": "", "status": "success" } ], "isSuccess": true } } }, { "Stage 6760E-1": { "29667923-b2e6-4495-bff3-108f1c7a7823": { "JobStatus": "done", "JobStdOutput": { "dataArray": [], "code": "0x00000000", "message": "general_output_successful", "params": [] }, "JobCompList": [ { "msgObj": { "dataArray": [], "isFSS": false, "msgs": [ { "msg": "general_output_successful", "code": "0x00000000", "params": [] } ] }, "code": "0x00000000", "success": true, "devIDForTask": [ "6760E" ], "taskList": [ { "devID": "6760E", "msgObj": { "dataArray": [], "isFSS": false, "msgs": [ { "msg": "general_output_successful", "code": "0x00000000", "params": [] } ] }, "refParam": {}, "cmdParam": { "sntpPoll": "1", "sntpIp": "172.26.112.63" }, "ignoreFail": false, "success": true, "failed": false, "cmdKey": "setControllerParm", "config": {}, "refReturn": {}, "status": "success" } ], "failed": false, "message": "", "status": "success" } ], "isSuccess": true }, "420ece78-263c-4d34-aa54-d7975c52b0cb": { "JobStatus": "done", "JobStdOutput": { "dataArray": [ { "Status": "Success" } ], "code": "0x00000000", "message": "general_output_successful", "params": [] }, "JobCompList": [ { "msgObj": { "dataArray": [ { "Status": "Success" } ], "isFSS": false, "msgs": [ { "msg": "general_output_successful", "code": "0x00000000", "params": [] } ], "dataObj": { "Status": "Success" } }, "code": "0x00000000", "success": true, "devIDForTask": [ "6760E" ], "taskList": [ { "devID": "6760E", "msgObj": { "dataArray": [ { "Status": "Success" } ], "isFSS": false, "msgs": [ { "msg": "general_output_successful", "code": "0x00000000", "params": [] } ], "dataObj": { "Status": "Success" } }, "refParam": {}, "cmdParam": { "ip": "172.26.112.63" }, "ignoreFail": false, "success": true, "failed": false, "cmdKey": "showCheckNTP", "config": {}, "refReturn": {}, "status": "success" } ], "failed": false, "message": "[\"general_output_successful\",[]]", "status": "success" } ], "isSuccess": true } } } ], "isRevertSuccess": true, "isConnectionFailed": false, "status": "success" } ``` ::: ### New Respone ::: spoiler grpc respone error ```jsonld= { "revertObjects": [], "objects": [ { "8D6783": { "abc_8D6783": { "JobStatus": "failed", "JobStdOutput": [ { "message": "0xffff", "code": "0xffff", "params": [], "dataArray": null } ], "JobCompList": [ { "msgObj": { "isFSS": true, "dataArray": null, "msgs": [ { "msg": "0xffff", "code": "0xffff", "params": [] } ] }, "code": "", "message": "", "devIDForTask": [ "8D6783" ], "taskList": [ { "devID": "8D6783", "msgObj": { "isFSS": true, "dataArray": null, "msgs": [ { "msg": "0xffff", "code": "0xffff", "params": [] } ] }, "success": false, "failed": true, "status": "failed" } ], "success": false, "failed": true, "status": "failed" } ], "isSuccess": false } }, "index": 0, "stage": "abc" } ], "isRevertSuccess": true, "isConnectionFailed": false, "status": "failed" } ``` ::: ::: spoiler Succesful (2個相同 stage 同台) ```jsonld= { "revertObjects": [], "objects": [ { "8D6783": { "abc_8D6783_0": { "JobStatus": "done", "JobStdOutput": [ { "message": "0x0000", "code": "0x0000", "params": [], "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ] } ], "JobCompList": [ { "msgObj": { "isFSS": true, "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ], "msgs": [ { "msg": "0x0000", "code": "0x0000", "params": [] } ] }, "code": "", "message": "", "devIDForTask": [ "8D6783" ], "taskList": [ { "devID": "8D6783", "msgObj": { "isFSS": true, "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ], "msgs": [ { "msg": "0x0000", "code": "0x0000", "params": [] } ] }, "success": true, "failed": false, "status": "success" } ], "success": true, "failed": false, "status": "success" } ], "isSuccess": true } } }, { "8D6783": { "abc2_8D6783_1": { "JobStatus": "done", "JobStdOutput": [ { "message": "0x0000", "code": "0x0000", "params": [], "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ] } ], "JobCompList": [ { "msgObj": { "isFSS": true, "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ], "msgs": [ { "msg": "0x0000", "code": "0x0000", "params": [] } ] }, "code": "", "message": "", "devIDForTask": [ "8D6783" ], "taskList": [ { "devID": "8D6783", "msgObj": { "isFSS": true, "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ], "msgs": [ { "msg": "0x0000", "code": "0x0000", "params": [] } ] }, "success": true, "failed": false, "status": "success" } ], "success": true, "failed": false, "status": "success" } ], "isSuccess": true } } } ], "isRevertSuccess": true, "isConnectionFailed": false, "status": "success" } ``` ::: :::spoiler GRPC success ```jsonld= { "revertObjects": [], "objects": [ { "8D6783": { "stage1_8D6783_0": { "JobStatus": "done", "JobStdOutput": [ { "message": "0x0000", "code": "0x0000", "params": [], "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ] } ], "JobCompList": [ { "msgObj": { "isFSS": true, "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ], "msgs": [ { "msg": "0x0000", "code": "0x0000", "params": [] } ] }, "code": "", "message": "", "devIDForTask": [ "8D6783" ], "taskList": [ { "devID": "8D6783", "msgObj": { "isFSS": true, "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ], "msgs": [ { "msg": "0x0000", "code": "0x0000", "params": [] } ] }, "success": true, "failed": false, "status": "success" } ], "success": true, "failed": false, "status": "success" } ], "isSuccess": true } }, "remote": { "stage1_remote_0": { "JobStatus": "done", "JobStdOutput": [ { "message": "0x0000", "code": "0x0000", "params": [], "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ] } ], "JobCompList": [ { "msgObj": { "isFSS": true, "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ], "msgs": [ { "msg": "0x0000", "code": "0x0000", "params": [] } ] }, "code": "", "message": "", "devIDForTask": [ "remote" ], "taskList": [ { "devID": "remote", "msgObj": { "isFSS": true, "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ], "msgs": [ { "msg": "0x0000", "code": "0x0000", "params": [] } ] }, "success": true, "failed": false, "status": "success" } ], "success": true, "failed": false, "status": "success" } ], "isSuccess": true } } } ], "isRevertSuccess": true, "isConnectionFailed": false, "status": "success" } ``` ::: :::spoiler GRPC failed ```jsonld= { "revertObjects": [], "objects": [ { "8D6783": { "stage1_8D6783_0": { "JobStatus": "done", "JobStdOutput": [ { "message": "0x0000", "code": "0x0000", "params": [], "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ] } ], "JobCompList": [ { "msgObj": { "isFSS": true, "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ], "msgs": [ { "msg": "0x0000", "code": "0x0000", "params": [] } ] }, "code": "", "message": "", "devIDForTask": [ "8D6783" ], "taskList": [ { "devID": "8D6783", "msgObj": { "isFSS": true, "dataArray": [ { "$controller$": "SlotB", "version": "2.3.155" }, { "$controller$": "SlotA", "version": "2.3.155" } ], "msgs": [ { "msg": "0x0000", "code": "0x0000", "params": [] } ] }, "success": true, "failed": false, "status": "success" } ], "success": true, "failed": false, "status": "success" } ], "isSuccess": true } }, "remote": { "stage1_remote_0": { "JobStatus": "failed", "JobStdOutput": [ { "message": "0x0004", "code": "0x0004", "params": [], "dataArray": [] } ], "JobCompList": [ { "msgObj": { "isFSS": true, "dataArray": [], "msgs": [ { "msg": "0x0004", "code": "0x0004", "params": [] } ] }, "code": "", "message": "", "devIDForTask": [ "remote" ], "taskList": [ { "devID": "remote", "msgObj": { "isFSS": true, "dataArray": [], "msgs": [ { "msg": "0x0004", "code": "0x0004", "params": [] } ] }, "success": false, "failed": true, "status": "failed" } ], "success": false, "failed": true, "status": "failed" } ], "isSuccess": false } } } ], "isRevertSuccess": true, "isConnectionFailed": false, "status": "failed" } ``` ::: :::spoiler GRPC stage1 錯誤 cmd, stage2 正常 cmd (不會有 stage2 資訊) ```jsonld= { "revertObjects": [], "objects": [ { "remote": { "stage1_remote_0": { "JobStatus": "failed", "JobStdOutput": [ { "message": "0x0004", "code": "0x0004", "params": [], "dataArray": [] } ], "JobCompList": [ { "msgObj": { "isFSS": true, "dataArray": [], "msgs": [ { "msg": "0x0004", "code": "0x0004", "params": [] } ] }, "code": "", "message": "", "devIDForTask": [ "remote" ], "taskList": [ { "devID": "remote", "msgObj": { "isFSS": true, "dataArray": [], "msgs": [ { "msg": "0x0004", "code": "0x0004", "params": [] } ] }, "success": false, "failed": true, "status": "failed" } ], "success": false, "failed": true, "status": "failed" } ], "isSuccess": false } } } ], "isRevertSuccess": true, "isConnectionFailed": false, "status": "failed" } ``` :::