Skip to content

Commit 9bcf024

Browse files
fix(api): get, add and delete alarm works (#380)
1 parent 1637b61 commit 9bcf024

File tree

7 files changed

+97
-27
lines changed

7 files changed

+97
-27
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ require (
7070
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
7171
github.com/modern-go/reflect2 v1.0.2 // indirect
7272
github.com/ncruces/go-strftime v0.1.9 // indirect
73-
github.com/open-amt-cloud-toolkit/go-wsman-messages/v2 v2.15.2
73+
github.com/open-amt-cloud-toolkit/go-wsman-messages/v2 v2.15.3
7474
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
7575
github.com/pmezard/go-difflib v1.0.0 // indirect
7676
github.com/prometheus/client_model v0.6.1 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJm
169169
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
170170
github.com/open-amt-cloud-toolkit/go-wsman-messages/v2 v2.15.2 h1:OkeCJ1CJQV/GDoT+3pa4046/uPAouqv7+d52ytUdDaU=
171171
github.com/open-amt-cloud-toolkit/go-wsman-messages/v2 v2.15.2/go.mod h1:LyY8fOvYBt5gawHYuivROR7EBySRuSR0u/k8QosnCeU=
172+
github.com/open-amt-cloud-toolkit/go-wsman-messages/v2 v2.15.3 h1:kg/WqyWJyp/28UR37Zm4/mBTh7X1oPo3oJPnMr48tZQ=
173+
github.com/open-amt-cloud-toolkit/go-wsman-messages/v2 v2.15.3/go.mod h1:LyY8fOvYBt5gawHYuivROR7EBySRuSR0u/k8QosnCeU=
172174
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
173175
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
174176
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=

internal/controller/http/v1/devicemanagement.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,7 @@ func (r *deviceManagementRoutes) deleteAlarmOccurrences(c *gin.Context) {
161161
return
162162
}
163163

164-
if alarm.InstanceID == nil {
165-
alarm.InstanceID = new(string)
166-
}
167-
168-
err := r.d.DeleteAlarmOccurrences(c.Request.Context(), guid, *alarm.InstanceID)
164+
err := r.d.DeleteAlarmOccurrences(c.Request.Context(), guid, alarm.Name)
169165
if err != nil {
170166
r.l.Error(err, "http - v1 - deleteAlarmOccurrences")
171167
ErrorResponse(c, err)

internal/controller/http/v1/devicemanagement_test.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"net/http"
99
"net/http/httptest"
1010
"testing"
11-
"time"
1211

1312
"github.com/gin-gonic/gin"
1413
power "github.com/open-amt-cloud-toolkit/go-wsman-messages/v2/pkg/wsman/cim/power"
@@ -39,8 +38,6 @@ func deviceManagementTest(t *testing.T) (*MockDeviceManagementFeature, *gin.Engi
3938
return deviceManagement, engine
4039
}
4140

42-
var aGoodTime = time.Unix(int64(1073007983), 0)
43-
4441
func TestDeviceManagement(t *testing.T) {
4542
t.Parallel()
4643

@@ -102,15 +99,11 @@ func TestDeviceManagement(t *testing.T) {
10299
name: "deleteAlarmOccurrences - successful deletion",
103100
url: "/api/v1/amt/alarmOccurrences/valid-guid",
104101
method: http.MethodDelete,
105-
requestBody: dto.AlarmClockOccurrence{
106-
ElementName: "elementName",
107-
StartTime: aGoodTime,
108-
Interval: 1,
109-
DeleteOnCompletion: true,
110-
InstanceID: "1",
102+
requestBody: dto.DeleteAlarmOccurrenceRequest{
103+
Name: "instanceID",
111104
},
112105
mock: func(m *MockDeviceManagementFeature) {
113-
m.EXPECT().DeleteAlarmOccurrences(context.Background(), "valid-guid", "1").Return(nil)
106+
m.EXPECT().DeleteAlarmOccurrences(context.Background(), "valid-guid", "instanceID").Return(nil)
114107
},
115108
expectedCode: http.StatusNoContent,
116109
},

internal/entity/dto/v1/alarm.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import "time"
44

55
type (
66
AlarmClockOccurrence struct {
7-
ElementName string `json:"elementName" binding:"required" example:"test"`
8-
InstanceID string `json:"instanceID" binding:"" example:"test"`
9-
StartTime time.Time `json:"startTime" binding:"required" example:"2024-01-01T00:00:00Z"`
10-
Interval int `json:"interval" binding:"number" example:"1"`
11-
DeleteOnCompletion bool `json:"deleteOnCompletion" binding:"required" example:"true"`
7+
ElementName string `json:"ElementName" binding:"required" example:"test"`
8+
InstanceID string `json:"InstanceID" binding:"" example:"test"`
9+
StartTime time.Time `json:"StartTime" binding:"required" example:"2024-01-01T00:00:00Z"`
10+
Interval int `json:"Interval" default:"0" example:"1"`
11+
IntervalInMinutes int `json:"IntervalInMinutes" example:"1"`
12+
DeleteOnCompletion bool `json:"DeleteOnCompletion" binding:"" example:"true"`
1213
}
1314
DeleteAlarmOccurrenceRequest struct {
14-
InstanceID *string `json:"instanceID" binding:"" example:"test"`
15+
Name string `json:"Name" binding:"required" example:"test"`
1516
}
1617

1718
AddAlarmOutput struct {

internal/usecase/devices/alarms.go

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package devices
33
import (
44
"context"
55
"strconv"
6+
"strings"
67
"time"
78

89
amtAlarmClock "github.com/open-amt-cloud-toolkit/go-wsman-messages/v2/pkg/wsman/amt/alarmclock"
@@ -11,6 +12,11 @@ import (
1112
"github.com/open-amt-cloud-toolkit/console/internal/entity/dto/v1"
1213
)
1314

15+
const (
16+
minutesPerDay = 24 * 60
17+
minutesPerHour = 60
18+
)
19+
1420
func (uc *UseCase) GetAlarmOccurrences(c context.Context, guid string) ([]dto.AlarmClockOccurrence, error) {
1521
item, err := uc.GetByID(c, guid, "")
1622
if err != nil {
@@ -33,7 +39,7 @@ func (uc *UseCase) GetAlarmOccurrences(c context.Context, guid string) ([]dto.Al
3339

3440
for i := range alarms {
3541
tmpEntity := alarms[i] // create a new variable to avoid memory aliasing
36-
d1[i] = *uc.alarmOccurenceEntityToDTO(&tmpEntity)
42+
d1[i] = *uc.alarmOccurrenceEntityToDTO(&tmpEntity)
3743
}
3844

3945
return d1, nil
@@ -83,16 +89,53 @@ func (uc *UseCase) addAlarmOutputEntityToDTO(d *amtAlarmClock.AddAlarmOutput) *d
8389
return d1
8490
}
8591

86-
func (uc *UseCase) alarmOccurenceEntityToDTO(d *alarmclock.AlarmClockOccurrence) *dto.AlarmClockOccurrence {
87-
startTime, _ := time.Parse(time.RFC3339, d.StartTime)
88-
interval, _ := strconv.Atoi(d.Interval)
92+
func (uc *UseCase) alarmOccurrenceEntityToDTO(d *alarmclock.AlarmClockOccurrence) *dto.AlarmClockOccurrence {
93+
intervalInMinutes, _ := ParseInterval(d.Interval.Interval)
94+
interval, _ := strconv.Atoi(d.Interval.Interval)
8995
d1 := &dto.AlarmClockOccurrence{
9096
ElementName: d.ElementName,
9197
InstanceID: d.InstanceID,
92-
StartTime: startTime,
98+
StartTime: d.StartTime.Datetime,
9399
Interval: interval,
100+
IntervalInMinutes: intervalInMinutes,
94101
DeleteOnCompletion: d.DeleteOnCompletion,
95102
}
96103

97104
return d1
98105
}
106+
107+
func ParseInterval(duration string) (int, error) {
108+
if duration == "" {
109+
return 0, nil
110+
}
111+
112+
totalMinutes := 0
113+
114+
// parse days
115+
duration = strings.TrimPrefix(duration, "P")
116+
indexOfD := strings.Index(duration, "D")
117+
118+
if indexOfD != -1 {
119+
days, err := strconv.Atoi(duration[:indexOfD])
120+
if err != nil {
121+
return 0, err
122+
}
123+
124+
totalMinutes = days * minutesPerDay
125+
}
126+
127+
// parse time
128+
indexOfT := strings.Index(duration, "T")
129+
if indexOfT != -1 {
130+
duration = strings.ToLower(duration[indexOfT+1:])
131+
132+
timeDuration, err := time.ParseDuration(duration)
133+
if err != nil {
134+
return 0, err
135+
}
136+
137+
return totalMinutes + int(timeDuration.Minutes()), nil
138+
}
139+
140+
return totalMinutes, nil
141+
}

internal/usecase/devices/alarms_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
amtAlarmClock "github.com/open-amt-cloud-toolkit/go-wsman-messages/v2/pkg/wsman/amt/alarmclock"
99
"github.com/open-amt-cloud-toolkit/go-wsman-messages/v2/pkg/wsman/ips/alarmclock"
10+
"github.com/stretchr/testify/assert"
1011
"github.com/stretchr/testify/require"
1112
gomock "go.uber.org/mock/gomock"
1213

@@ -340,3 +341,37 @@ func TestDeleteAlarmOccurrences(t *testing.T) {
340341
})
341342
}
342343
}
344+
345+
func TestParseInterval(t *testing.T) {
346+
t.Parallel()
347+
348+
tests := []struct {
349+
name string
350+
interval string
351+
expected int
352+
err error
353+
}{
354+
{"Parse days only", "P2D", 2880, nil},
355+
{"Parse hours only", "PT5H", 300, nil},
356+
{"Parse minutes only", "PT30M", 30, nil},
357+
{"Parse complex interval", "P1DT6H30M", 1830, nil},
358+
{"Parse with seconds (ignored)", "P1DT6H30M45S", 1830, nil},
359+
{"Empty string", "", 0, nil},
360+
}
361+
362+
for _, tc := range tests {
363+
tc := tc
364+
t.Run(tc.name, func(t *testing.T) {
365+
t.Parallel()
366+
367+
result, err := devices.ParseInterval(tc.interval)
368+
369+
if tc.err != nil {
370+
assert.Error(t, err)
371+
} else {
372+
assert.NoError(t, err)
373+
assert.Equal(t, tc.expected, result)
374+
}
375+
})
376+
}
377+
}

0 commit comments

Comments
 (0)