From 294a9daa8711f7a2dbb054f1de750bf9f1bb4f3a Mon Sep 17 00:00:00 2001 From: Pavel Boldyrev <627562+bpg@users.noreply.github.com> Date: Wed, 27 Sep 2023 21:46:45 -0400 Subject: [PATCH] fix(tasks): fix UPID (task id) parsing error (#591) Signed-off-by: Pavel Boldyrev <627562+bpg@users.noreply.github.com> --- proxmox/nodes/tasks/tasks_types.go | 14 +++++++------- proxmox/nodes/tasks/tasks_types_test.go | 25 ++++++++++++++++++++----- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/proxmox/nodes/tasks/tasks_types.go b/proxmox/nodes/tasks/tasks_types.go index 4cf80ee5..249cb293 100644 --- a/proxmox/nodes/tasks/tasks_types.go +++ b/proxmox/nodes/tasks/tasks_types.go @@ -28,8 +28,8 @@ type GetTaskStatusResponseData struct { // TaskID contains the components of a PVE task ID. type TaskID struct { NodeName string - PID int - PStart int + PID int64 + PStart int64 StartTime time.Time Type string ID string @@ -51,17 +51,17 @@ func ParseTaskID(taskID string) (TaskID, error) { return TaskID{}, fmt.Errorf("missing node name in task ID: %s", taskID) } - pid, err := strconv.ParseInt(parts[2], 16, 32) + pid, err := strconv.ParseInt(parts[2], 16, 64) if err != nil { return TaskID{}, fmt.Errorf("error parsing task ID: %w", err) } - pstart, err := strconv.ParseInt(parts[3], 16, 32) + pstart, err := strconv.ParseInt(parts[3], 16, 64) if err != nil { return TaskID{}, fmt.Errorf("error parsing pstart in task ID: %q: %w", taskID, err) } - stime, err := strconv.ParseInt(parts[4], 16, 32) + stime, err := strconv.ParseInt(parts[4], 16, 64) if err != nil { return TaskID{}, fmt.Errorf("error parsing start time in task ID: %q: %w", taskID, err) } @@ -76,8 +76,8 @@ func ParseTaskID(taskID string) (TaskID, error) { return TaskID{ NodeName: parts[1], - PID: int(pid), - PStart: int(pstart), + PID: pid, + PStart: pstart, StartTime: time.Unix(stime, 0).UTC(), Type: parts[5], ID: parts[6], diff --git a/proxmox/nodes/tasks/tasks_types_test.go b/proxmox/nodes/tasks/tasks_types_test.go index 143d8d46..41b2e08b 100644 --- a/proxmox/nodes/tasks/tasks_types_test.go +++ b/proxmox/nodes/tasks/tasks_types_test.go @@ -17,10 +17,12 @@ import ( func TestParseTaskID(t *testing.T) { t.Parallel() - stime, err := time.Parse(time.RFC3339, "2023-08-30T21:28:16-04:00") - require.NoError(t, err) + parseTime := func(s string) time.Time { + stime, err := time.Parse(time.RFC3339, s) + require.NoError(t, err) - stime = stime.UTC() + return stime.UTC() + } tests := []struct { name string @@ -35,7 +37,7 @@ func TestParseTaskID(t *testing.T) { NodeName: "pve", PID: 400563, PStart: 17540764, - StartTime: stime, + StartTime: parseTime("2023-08-30T21:28:16-04:00"), Type: "imgcopy", ID: "", User: "root@pam", @@ -48,12 +50,25 @@ func TestParseTaskID(t *testing.T) { NodeName: "pve", PID: 400563, PStart: 17540764, - StartTime: stime, + StartTime: parseTime("2023-08-30T21:28:16-04:00"), Type: "qmcreate", ID: "101", User: "root@pam", }, }, + { + name: "large pid", + taskID: "UPID:pve-srv:0012D68C:8206F38C:65144CB7:qmcreate:501:root@pam:", + want: TaskID{ + NodeName: "pve-srv", + PID: 1234572, + PStart: 2181493644, + StartTime: parseTime("2023-09-27T15:39:35Z"), + Type: "qmcreate", + ID: "501", + User: "root@pam", + }, + }, { name: "missing node", taskID: "UPID::00061CB3:010BA69C:64EFECB0:qmcreate:101:root@pam:",