diff --git a/dm-manager/VERSION b/dm-manager/VERSION index 8f0916f7..a918a2aa 100644 --- a/dm-manager/VERSION +++ b/dm-manager/VERSION @@ -1 +1 @@ -0.5.0 +0.6.0 diff --git a/dm-manager/go.mod b/dm-manager/go.mod index 20854fe0..c4d06afc 100644 --- a/dm-manager/go.mod +++ b/dm-manager/go.mod @@ -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.31.0 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 @@ -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 @@ -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 @@ -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 @@ -149,16 +149,16 @@ 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 - golang.org/x/crypto v0.42.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + golang.org/x/crypto v0.43.0 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect - golang.org/x/mod v0.28.0 // indirect - golang.org/x/net v0.44.0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/text v0.29.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect golang.org/x/time v0.13.0 // indirect - golang.org/x/tools v0.37.0 // indirect + golang.org/x/tools v0.38.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/dm-manager/go.sum b/dm-manager/go.sum index 91d4c0c7..90a8f254 100644 --- a/dm-manager/go.sum +++ b/dm-manager/go.sum @@ -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= @@ -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= @@ -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= @@ -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.31.0 h1:Iu3CjahX9c0mK2MX+xmjm/0Uz7PwOL3r/LyWLjWmjeo= +github.com/open-edge-platform/infra-core/inventory/v2 v2.31.0/go.mod h1:7bHaRxSL+e5XFt2cGCFS3DuI405Nz2u6q0vlMv6/twY= 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= @@ -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= @@ -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= @@ -409,8 +409,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= @@ -423,8 +423,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -438,11 +438,11 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 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/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= 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= @@ -472,8 +472,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -485,8 +485,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -501,8 +501,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= -golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -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= diff --git a/dm-manager/pkg/device/device.go b/dm-manager/pkg/device/device.go index de33cb34..474cedc4 100644 --- a/dm-manager/pkg/device/device.go +++ b/dm-manager/pkg/device/device.go @@ -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", } 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 successful", } //nolint: godot // copied from swagger file @@ -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{ @@ -237,13 +241,38 @@ func (dc *Controller) shouldDeactivateAMT(invHost *computev1.HostResource) bool } func (dc *Controller) shouldSyncPowerStatus(invHost *computev1.HostResource) bool { + // Exclude action based power states to allow proper state transitions + desiredState := invHost.GetDesiredPowerState() + if desiredState == computev1.PowerState_POWER_STATE_RESET_REPEAT || + desiredState == computev1.PowerState_POWER_STATE_RESET { + return false + } return invHost.GetCurrentAmtState() == computev1.AmtState_AMT_STATE_PROVISIONED && invHost.GetDesiredPowerState() == invHost.GetCurrentPowerState() } func (dc *Controller) shouldHandlePowerChange(invHost *computev1.HostResource) bool { - return invHost.GetCurrentAmtState() == computev1.AmtState_AMT_STATE_PROVISIONED && - invHost.GetDesiredPowerState() != invHost.GetCurrentPowerState() + hostID := invHost.GetResourceId() + currentAmtState := invHost.GetCurrentAmtState() + currentState := invHost.GetCurrentPowerState() + desiredState := invHost.GetDesiredPowerState() + + log.Info().Msgf("Host %v states - AMT: %v, Current Power: %v, Desired Power: %v", + hostID, currentAmtState, currentState, desiredState) + + if currentAmtState != computev1.AmtState_AMT_STATE_PROVISIONED { + log.Debug().Msgf("Host %v not provisioned (AMT state: %v), skipping power change", hostID, currentAmtState) + return false + } + + // different desired and current power states + if desiredState != currentState { + log.Info().Msgf("Host %v standard power change: %v -> %v", hostID, currentState, desiredState) + return true + } + + log.Debug().Msgf("Host %v no power change needed (current=%v, desired=%v)", hostID, currentState, desiredState) + return false } func (dc *Controller) handleDeactivateAMT( @@ -392,6 +421,7 @@ func (dc *Controller) syncPowerStatus( } return request.Ack() } + if contains(allowedPowerStates[invHost.GetDesiredPowerState()], powerStateCode) && invHost.GetPowerStatusIndicator() != statusv1.StatusIndication_STATUS_INDICATION_IDLE { err = dc.updateHost(ctx, invHost.GetTenantId(), invHost.GetResourceId(), @@ -414,14 +444,43 @@ func (dc *Controller) syncPowerStatus( return request.Ack() } +//nolint:cyclop,funlen // Power change handling requires complex state management and MPS integration func (dc *Controller) handlePowerChange( ctx context.Context, request rec_v2.Request[ID], invHost *computev1.HostResource, desiredPowerState computev1.PowerState, ) (rec_v2.Directive[ID], statusv1.StatusIndication, error) { - log.Info().Msgf("trying to change power state for %v from %v to %v", request.ID, - invHost.GetCurrentPowerState(), desiredPowerState) + hostID := request.ID.GetHostUUID() + currentState := invHost.GetCurrentPowerState() + + log.Info().Msgf("Performing power change for host %v: %v -> %v", + hostID, currentState, desiredPowerState) + + // Check if this is a consecutive reset operation + // for debugging purpose only + switch desiredPowerState { + case computev1.PowerState_POWER_STATE_UNSPECIFIED: + log.Info().Msgf("Processing unspecified power operation for host %v", hostID) + case computev1.PowerState_POWER_STATE_ON: + log.Info().Msgf("Processing power ON operation for host %v", hostID) + case computev1.PowerState_POWER_STATE_OFF: + log.Info().Msgf("Processing power OFF operation for host %v", hostID) + case computev1.PowerState_POWER_STATE_SLEEP: + log.Info().Msgf("Processing power SLEEP operation for host %v", hostID) + case computev1.PowerState_POWER_STATE_HIBERNATE: + log.Info().Msgf("Processing power HIBERNATE operation for host %v", hostID) + case computev1.PowerState_POWER_STATE_POWER_CYCLE: + log.Info().Msgf("Processing power CYCLE operation for host %v", hostID) + case computev1.PowerState_POWER_STATE_RESET_REPEAT: + log.Info().Msgf("Processing consecutive RESET_REPEAT operation for host %v", hostID) + case computev1.PowerState_POWER_STATE_RESET: + if currentState == computev1.PowerState_POWER_STATE_RESET { + log.Info().Msgf("Processing consecutive RESET operation for host %v", hostID) + } else { + log.Info().Msgf("Processing standard RESET operation for host %v", hostID) + } + } err := dc.updateHost(ctx, request.ID.GetTenantID(), invHost.GetResourceId(), &fieldmaskpb.FieldMask{Paths: []string{ @@ -432,23 +491,31 @@ func (dc *Controller) handlePowerChange( PowerStatusIndicator: statusv1.StatusIndication_STATUS_INDICATION_IN_PROGRESS, }) if err != nil { - log.Err(err).Msgf("failed to update device info") + log.Err(err).Msgf("Failed to update device info for host %v", hostID) return request.Fail(err), statusv1.StatusIndication_STATUS_INDICATION_ERROR, err } + // MPS action being sent + mpsAction := powerMapping[desiredPowerState] + log.Info().Msgf("Sending MPS power action for host %v: state=%v -> mps_action=%v", + hostID, desiredPowerState, mpsAction) + // assumption is that we don't have to check if power actions are supported, as AMT supports it since 1.0.0 // https://en.wikipedia.org/wiki/Intel_AMT_versions updatedCtx := context.WithValue(ctx, contextValue("tenantId"), request.ID.GetTenantID()) powerAction, err := dc.MpsClient.PostApiV1AmtPowerActionGuidWithResponse(updatedCtx, request.ID.GetHostUUID(), mps.PostApiV1AmtPowerActionGuidJSONRequestBody{ - Action: powerMapping[desiredPowerState], + Action: mpsAction, }, clientCallback()) if err != nil { - log.Err(err).Msgf("failed to send power action to MPS") + log.Err(err).Msgf("Failed to send power action to MPS for host %v", hostID) return request.Fail(err), statusv1.StatusIndication_STATUS_INDICATION_ERROR, err } + log.Info().Msgf("MPS power action sent successfully for host %v, response code: %v", + hostID, powerAction.StatusCode()) + log.Debug().Msgf("power action response for %v with status code %v - %v", request.ID.GetHostUUID(), powerAction.HTTPResponse, string(powerAction.Body)) diff --git a/dm-manager/pkg/device/device_test.go b/dm-manager/pkg/device/device_test.go index 1e0de87c..34e4f812 100644 --- a/dm-manager/pkg/device/device_test.go +++ b/dm-manager/pkg/device/device_test.go @@ -519,3 +519,101 @@ func TestDeviceController_MPS_HeaderValidation_UserAgent(t *testing.T) { mpsMock.AssertExpectations(t) } + +// Tests for consecutive reset functionality. +func TestConsecutiveResetLogic(t *testing.T) { + dc := &Controller{} + + tests := []struct { + name string + currentAmt computev1.AmtState + currentPower computev1.PowerState + desiredPower computev1.PowerState + expectedResult bool + description string + }{ + { + name: "Standard Reset - First Time", + currentAmt: computev1.AmtState_AMT_STATE_PROVISIONED, + currentPower: computev1.PowerState_POWER_STATE_ON, + desiredPower: computev1.PowerState_POWER_STATE_RESET, + expectedResult: true, + description: "First reset should be allowed", + }, + { + name: "Consecutive Reset - RESET to RESET", + currentAmt: computev1.AmtState_AMT_STATE_PROVISIONED, + currentPower: computev1.PowerState_POWER_STATE_RESET, + desiredPower: computev1.PowerState_POWER_STATE_RESET, + expectedResult: false, + description: "Same reset states don't trigger action", // handling by apiv2 + }, + { + name: "Consecutive Reset - RESET_REPEAT to RESET_REPEAT", + currentAmt: computev1.AmtState_AMT_STATE_PROVISIONED, + currentPower: computev1.PowerState_POWER_STATE_RESET_REPEAT, + desiredPower: computev1.PowerState_POWER_STATE_RESET_REPEAT, + expectedResult: false, + description: "Same reset_repeat states don't trigger action", // handling by apiv2 + }, + { + name: "Mixed Consecutive - RESET to RESET_REPEAT", + currentAmt: computev1.AmtState_AMT_STATE_PROVISIONED, + currentPower: computev1.PowerState_POWER_STATE_RESET, + desiredPower: computev1.PowerState_POWER_STATE_RESET_REPEAT, + expectedResult: true, + description: "RESET_REPEAT after RESET should be allowed", + }, + { + name: "Not Provisioned - Should Skip", + currentAmt: computev1.AmtState_AMT_STATE_UNPROVISIONED, + currentPower: computev1.PowerState_POWER_STATE_ON, + desiredPower: computev1.PowerState_POWER_STATE_RESET, + expectedResult: false, + description: "Unprovisioned devices should not handle power changes", + }, + { + name: "Same Non-Reset States", + currentAmt: computev1.AmtState_AMT_STATE_PROVISIONED, + currentPower: computev1.PowerState_POWER_STATE_ON, + desiredPower: computev1.PowerState_POWER_STATE_ON, + expectedResult: false, + description: "Same non-reset states should not trigger power change", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Create a mock host resource + hostResource := &computev1.HostResource{ + ResourceId: "test-host-123", + CurrentAmtState: tt.currentAmt, + CurrentPowerState: tt.currentPower, + DesiredPowerState: tt.desiredPower, + } + + result := dc.shouldHandlePowerChange(hostResource) + assert.Equal(t, tt.expectedResult, result, tt.description) + }) + } +} + +func TestPowerStateMapping(t *testing.T) { + t.Run("RESET_REPEAT maps to correct MPS action", func(t *testing.T) { + action := powerMapping[computev1.PowerState_POWER_STATE_RESET_REPEAT] + expectedAction := powerReset // Should be same as regular RESET + assert.Equal(t, expectedAction, action, "RESET_REPEAT should map to same MPS action as RESET") + }) + + t.Run("RESET_REPEAT has correct progress state", func(t *testing.T) { + progressState := powerMappingToInProgressState[computev1.PowerState_POWER_STATE_RESET_REPEAT] + expectedState := "Resetting" + assert.Equal(t, expectedState, progressState, "RESET_REPEAT should have correct progress state") + }) + + t.Run("RESET_REPEAT has correct idle state", func(t *testing.T) { + idleState := powerMappingToIdleState[computev1.PowerState_POWER_STATE_RESET_REPEAT] + expectedState := "Reset successful" + assert.Equal(t, expectedState, idleState, "RESET_REPEAT should have correct idle state") + }) +}