Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion dm-manager/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.5.0
0.5.1-dev
16 changes: 8 additions & 8 deletions dm-manager/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,20 @@ go 1.24.6
require (
github.com/google/uuid v1.6.0
github.com/oapi-codegen/runtime v1.1.1
github.com/open-edge-platform/infra-core/inventory/v2 v2.30.8
github.com/open-edge-platform/infra-core/inventory/v2 v2.30.11-0.20251013154907-b094655fe7ca
github.com/open-edge-platform/infra-external/loca-onboarding/v2 v2.19.0
github.com/open-edge-platform/orch-library/go v0.6.1
github.com/prometheus/client_golang v1.23.2
github.com/rs/zerolog v1.34.0
github.com/stretchr/testify v1.11.1
google.golang.org/grpc v1.75.1
google.golang.org/protobuf v1.36.9
google.golang.org/grpc v1.76.0
google.golang.org/protobuf v1.36.10
k8s.io/apimachinery v0.33.2
)

require (
ariga.io/atlas v0.37.0 // indirect
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.9-20250912141014-52f32327d4b0.1 // indirect
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1 // indirect
buf.build/go/protovalidate v1.0.0 // indirect
cel.dev/expr v0.24.0 // indirect
cloud.google.com/go/compute/metadata v0.7.0 // indirect
Expand All @@ -46,7 +46,7 @@ require (
github.com/eko/gocache/store/go_cache/v4 v4.2.2 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/go-jose/go-jose/v3 v3.0.4 // indirect
github.com/go-jose/go-jose/v4 v4.1.1 // indirect
github.com/go-jose/go-jose/v4 v4.1.2 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/analysis v0.23.0 // indirect
Expand Down Expand Up @@ -80,7 +80,7 @@ require (
github.com/hashicorp/go-sockaddr v1.0.7 // indirect
github.com/hashicorp/hcl v1.0.1-vault-7 // indirect
github.com/hashicorp/hcl/v2 v2.23.0 // indirect
github.com/hashicorp/vault/api v1.21.0 // indirect
github.com/hashicorp/vault/api v1.22.0 // indirect
github.com/hashicorp/vault/api/auth/kubernetes v0.10.0 // indirect
github.com/iancoleman/strcase v0.3.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
Expand Down Expand Up @@ -116,7 +116,7 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.66.1 // indirect
github.com/prometheus/common v0.67.1 // indirect
github.com/prometheus/procfs v0.17.0 // indirect
github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect
github.com/ryanuber/go-glob v1.0.0 // indirect
Expand Down Expand Up @@ -149,7 +149,7 @@ require (
go.opentelemetry.io/otel/trace v1.38.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.1 // indirect
go.uber.org/mock v0.5.0 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v2 v2.4.3 // indirect
golang.org/x/crypto v0.42.0 // indirect
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
golang.org/x/mod v0.28.0 // indirect
Expand Down
36 changes: 18 additions & 18 deletions dm-manager/go.sum
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
ariga.io/atlas v0.37.0 h1:MvbQ25CAHFslttEKEySwYNFrFUdLAPhtU1izOzjXV+o=
ariga.io/atlas v0.37.0/go.mod h1:mHE83ptCxEkd3rO3c7Rvkk6Djf6mVhEiSVhoiNu96CI=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.9-20250912141014-52f32327d4b0.1 h1:DQLS/rRxLHuugVzjJU5AvOwD57pdFl9he/0O7e5P294=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.9-20250912141014-52f32327d4b0.1/go.mod h1:aY3zbkNan5F+cGm9lITDP6oxJIwu0dn9KjJuJjWaHkg=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1 h1:31on4W/yPcV4nZHL4+UCiCvLPsMqe/vJcNg8Rci0scc=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1/go.mod h1:fUl8CEN/6ZAMk6bP8ahBJPUJw7rbp+j4x+wCcYi2IG4=
buf.build/go/protovalidate v1.0.0 h1:IAG1etULddAy93fiBsFVhpj7es5zL53AfB/79CVGtyY=
buf.build/go/protovalidate v1.0.0/go.mod h1:KQmEUrcQuC99hAw+juzOEAmILScQiKBP1Oc36vvCLW8=
cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
Expand Down Expand Up @@ -91,8 +91,8 @@ github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-jose/go-jose/v3 v3.0.4 h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY=
github.com/go-jose/go-jose/v3 v3.0.4/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI=
github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA=
github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI=
github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
Expand Down Expand Up @@ -187,8 +187,8 @@ github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y
github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM=
github.com/hashicorp/hcl/v2 v2.23.0 h1:Fphj1/gCylPxHutVSEOf2fBOh1VE4AuLV7+kbJf3qos=
github.com/hashicorp/hcl/v2 v2.23.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA=
github.com/hashicorp/vault/api v1.21.0 h1:Xej4LJETV/spWRdjreb2vzQhEZt4+B5yxHAObfQVDOs=
github.com/hashicorp/vault/api v1.21.0/go.mod h1:IUZA2cDvr4Ok3+NtK2Oq/r+lJeXkeCrHRmqdyWfpmGM=
github.com/hashicorp/vault/api v1.22.0 h1:+HYFquE35/B74fHoIeXlZIP2YADVboaPjaSicHEZiH0=
github.com/hashicorp/vault/api v1.22.0/go.mod h1:IUZA2cDvr4Ok3+NtK2Oq/r+lJeXkeCrHRmqdyWfpmGM=
github.com/hashicorp/vault/api/auth/kubernetes v0.10.0 h1:5rqWmUFxnu3S7XYq9dafURwBgabYDFzo2Wv+AMopPHs=
github.com/hashicorp/vault/api/auth/kubernetes v0.10.0/go.mod h1:cZZmhF6xboMDmDbMY52oj2DKW6gS0cQ9g0pJ5XIXQ5U=
github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
Expand Down Expand Up @@ -269,8 +269,8 @@ github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmt
github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/open-edge-platform/infra-core/inventory/v2 v2.30.8 h1:Ay3iGGELJ7VnARtmIjd8ZhfpsWiqhd0v8ZqO7vPzAqY=
github.com/open-edge-platform/infra-core/inventory/v2 v2.30.8/go.mod h1:Ezzmx/eV95f6DkmCrW8YAcGUsbqSuyggunxmFmaImMw=
github.com/open-edge-platform/infra-core/inventory/v2 v2.30.11-0.20251013154907-b094655fe7ca h1:nNV2BOnSPRy75MQa+S1b7Gq+e73NP836ONyC9B8KgT8=
github.com/open-edge-platform/infra-core/inventory/v2 v2.30.11-0.20251013154907-b094655fe7ca/go.mod h1:IDYs+Y3e7wiEg9xZeAqnEqo72LhTZ2zDVoASTiWTwS4=
github.com/open-edge-platform/orch-library/go v0.6.1 h1:IGR2ic73f3obnhlxTRfHcyYMbPbYu7BSqa9UYyEZ78Q=
github.com/open-edge-platform/orch-library/go v0.6.1/go.mod h1:3Tes/GJfwYbnQa/1scbKiLbjZrL4fJEouFk28oo5/c8=
github.com/open-edge-platform/orch-library/go/dazl v0.5.4 h1:Rx/bSAZiLjEEBjUiJEzBvT0fQv5huT5FQ2Ke3IMUhiE=
Expand All @@ -293,8 +293,8 @@ github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UH
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs=
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
github.com/prometheus/common v0.67.1 h1:OTSON1P4DNxzTg4hmKCc37o4ZAZDv0cfXLkOt0oEowI=
github.com/prometheus/common v0.67.1/go.mod h1:RpmT9v35q2Y+lsieQsdOh5sXZ6ajUGC8NjZAmr8vb0Q=
github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0=
github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw=
github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg=
Expand Down Expand Up @@ -400,8 +400,8 @@ go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
Expand Down Expand Up @@ -441,8 +441,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo=
golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
Expand Down Expand Up @@ -525,10 +525,10 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI=
google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=
google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
Expand Down
93 changes: 63 additions & 30 deletions dm-manager/pkg/device/device.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,33 +45,36 @@ const (
var log = logging.GetLogger("DeviceReconciler")

var powerMapping = map[computev1.PowerState]mps.PowerActionRequestAction{
computev1.PowerState_POWER_STATE_UNSPECIFIED: powerOn, // todo: consider removing this mapping
computev1.PowerState_POWER_STATE_ON: powerOn,
computev1.PowerState_POWER_STATE_OFF: powerOff,
computev1.PowerState_POWER_STATE_SLEEP: powerSleep,
computev1.PowerState_POWER_STATE_RESET: powerReset,
computev1.PowerState_POWER_STATE_HIBERNATE: powerHibernate,
computev1.PowerState_POWER_STATE_POWER_CYCLE: powerCycle,
computev1.PowerState_POWER_STATE_UNSPECIFIED: powerOn, // todo: consider removing this mapping
computev1.PowerState_POWER_STATE_ON: powerOn,
computev1.PowerState_POWER_STATE_OFF: powerOff,
computev1.PowerState_POWER_STATE_SLEEP: powerSleep,
computev1.PowerState_POWER_STATE_RESET: powerReset,
computev1.PowerState_POWER_STATE_HIBERNATE: powerHibernate,
computev1.PowerState_POWER_STATE_POWER_CYCLE: powerCycle,
computev1.PowerState_POWER_STATE_RESET_REPEAT: powerReset, // Same MPS action as regular reset
}

var powerMappingToInProgressState = map[computev1.PowerState]string{
computev1.PowerState_POWER_STATE_UNSPECIFIED: "Unspecified",
computev1.PowerState_POWER_STATE_ON: "Powering on",
computev1.PowerState_POWER_STATE_OFF: "Powering off",
computev1.PowerState_POWER_STATE_SLEEP: "Sleeping",
computev1.PowerState_POWER_STATE_RESET: "Resetting",
computev1.PowerState_POWER_STATE_HIBERNATE: "Hibernating",
computev1.PowerState_POWER_STATE_POWER_CYCLE: "Power cycling",
computev1.PowerState_POWER_STATE_UNSPECIFIED: "Unspecified",
computev1.PowerState_POWER_STATE_ON: "Powering on",
computev1.PowerState_POWER_STATE_OFF: "Powering off",
computev1.PowerState_POWER_STATE_SLEEP: "Sleeping",
computev1.PowerState_POWER_STATE_RESET: "Resetting",
computev1.PowerState_POWER_STATE_HIBERNATE: "Hibernating",
computev1.PowerState_POWER_STATE_POWER_CYCLE: "Power cycling",
computev1.PowerState_POWER_STATE_RESET_REPEAT: "Resetting (repeat)",
}

var powerMappingToIdleState = map[computev1.PowerState]string{
computev1.PowerState_POWER_STATE_UNSPECIFIED: "Unspecified",
computev1.PowerState_POWER_STATE_ON: "Powered on",
computev1.PowerState_POWER_STATE_OFF: "Powered off",
computev1.PowerState_POWER_STATE_SLEEP: "Sleep state",
computev1.PowerState_POWER_STATE_RESET: "Reset successful",
computev1.PowerState_POWER_STATE_HIBERNATE: "Hibernate state",
computev1.PowerState_POWER_STATE_POWER_CYCLE: "Power cycle successful",
computev1.PowerState_POWER_STATE_UNSPECIFIED: "Unspecified",
computev1.PowerState_POWER_STATE_ON: "Powered on",
computev1.PowerState_POWER_STATE_OFF: "Powered off",
computev1.PowerState_POWER_STATE_SLEEP: "Sleep state",
computev1.PowerState_POWER_STATE_RESET: "Reset successful",
computev1.PowerState_POWER_STATE_HIBERNATE: "Hibernate state",
computev1.PowerState_POWER_STATE_POWER_CYCLE: "Power cycle successful",
computev1.PowerState_POWER_STATE_RESET_REPEAT: "Reset (repeat) successful",
}

//nolint: godot // copied from swagger file
Expand All @@ -92,13 +95,14 @@ for SLEEP/HIBERNATE, as MPS it returns 2 (POWER_ON)
14 Soft reset Powered up/on Perform a shutdown and then a hardware reset N/A
*/
var allowedPowerStates = map[computev1.PowerState][]int32{
computev1.PowerState_POWER_STATE_UNSPECIFIED: {},
computev1.PowerState_POWER_STATE_ON: {2},
computev1.PowerState_POWER_STATE_OFF: {6, 8, 12, 13},
computev1.PowerState_POWER_STATE_SLEEP: {2, 3, 4},
computev1.PowerState_POWER_STATE_RESET: {2, 14},
computev1.PowerState_POWER_STATE_HIBERNATE: {2, 7},
computev1.PowerState_POWER_STATE_POWER_CYCLE: {2, 9},
computev1.PowerState_POWER_STATE_UNSPECIFIED: {},
computev1.PowerState_POWER_STATE_ON: {2},
computev1.PowerState_POWER_STATE_OFF: {6, 8, 12, 13},
computev1.PowerState_POWER_STATE_SLEEP: {2, 3, 4},
computev1.PowerState_POWER_STATE_RESET: {2, 14},
computev1.PowerState_POWER_STATE_HIBERNATE: {2, 7},
computev1.PowerState_POWER_STATE_POWER_CYCLE: {2, 9},
computev1.PowerState_POWER_STATE_RESET_REPEAT: {2, 14}, // Same allowed states as RESET
}

var mpsPowerStateToInventoryPowerState = map[int32]computev1.PowerState{
Expand Down Expand Up @@ -242,8 +246,37 @@ func (dc *Controller) shouldSyncPowerStatus(invHost *computev1.HostResource) boo
}

func (dc *Controller) shouldHandlePowerChange(invHost *computev1.HostResource) bool {
return invHost.GetCurrentAmtState() == computev1.AmtState_AMT_STATE_PROVISIONED &&
invHost.GetDesiredPowerState() != invHost.GetCurrentPowerState()
if invHost.GetCurrentAmtState() != computev1.AmtState_AMT_STATE_PROVISIONED {
return false
}

currentState := invHost.GetCurrentPowerState()
desiredState := invHost.GetDesiredPowerState()

// Standard case: different desired and current power states
if desiredState != currentState {
return true
}

// Special case for consecutive operations:
// Allow consecutive resets/power cycles even when current state matches desired state
// This enables multiple operations in sequence

// Handle consecutive RESET operations
if desiredState == computev1.PowerState_POWER_STATE_RESET &&
currentState == computev1.PowerState_POWER_STATE_RESET {
log.Info().Msgf("Allowing consecutive reset operation for host %v", invHost.GetResourceId())
return true
}

// Handle consecutive RESET_REPEAT operations
if desiredState == computev1.PowerState_POWER_STATE_RESET_REPEAT &&
currentState == computev1.PowerState_POWER_STATE_RESET_REPEAT {
log.Info().Msgf("Allowing consecutive reset repeat operation for host %v", invHost.GetResourceId())
return true
}

return false
}

func (dc *Controller) handleDeactivateAMT(
Expand Down
Loading