From 3700480165b701a6f25af0c5fcb7420c081f7ded Mon Sep 17 00:00:00 2001 From: "Nayak, Ipsita" Date: Wed, 8 Oct 2025 07:43:11 -0700 Subject: [PATCH 01/10] Send AMT features capabilities --- .../cmd/dm-manager-mock/dm-manager-mock.go | 3 - platform-manageability-agent/go.mod | 18 +-- platform-manageability-agent/go.sum | 30 +++-- .../internal/comms/comms.go | 57 ++++++++- .../internal/comms/comms_test.go | 108 +++++++++++++++++- 5 files changed, 182 insertions(+), 34 deletions(-) diff --git a/platform-manageability-agent/cmd/dm-manager-mock/dm-manager-mock.go b/platform-manageability-agent/cmd/dm-manager-mock/dm-manager-mock.go index 37d300e9..36f0ea3d 100644 --- a/platform-manageability-agent/cmd/dm-manager-mock/dm-manager-mock.go +++ b/platform-manageability-agent/cmd/dm-manager-mock/dm-manager-mock.go @@ -43,9 +43,6 @@ func (srv *Server) ReportAMTStatus(ctx context.Context, req *proto.AMTStatusRequ if req.Status != proto.AMTStatus_ENABLED && req.Status != proto.AMTStatus_DISABLED { return nil, fmt.Errorf("incorrect status provided") } - if req.Status == proto.AMTStatus_ENABLED && req.Version == "" { - return nil, fmt.Errorf("failed to send version when AMT enabled") - } log.Printf("AMTStatusRequest: %v/n", req) return &proto.AMTStatusResponse{}, nil } diff --git a/platform-manageability-agent/go.mod b/platform-manageability-agent/go.mod index 4fcfe48f..4c86b127 100644 --- a/platform-manageability-agent/go.mod +++ b/platform-manageability-agent/go.mod @@ -1,16 +1,18 @@ module github.com/open-edge-platform/edge-node-agents/platform-manageability-agent -go 1.24.4 +go 1.24.6 + +toolchain go1.24.8 require ( github.com/cenkalti/backoff/v4 v4.3.0 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 github.com/open-edge-platform/edge-node-agents/common v1.8.0 - github.com/open-edge-platform/infra-external/dm-manager v0.3.1 - github.com/sirupsen/logrus v1.9.3 + github.com/open-edge-platform/infra-external/dm-manager v0.0.0-20251008080329-cf386899a03b + github.com/sirupsen/logrus v1.9.4-0.20230606125235-dd1b4c2e81af github.com/stretchr/testify v1.11.1 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 - google.golang.org/grpc v1.75.0 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 + google.golang.org/grpc v1.75.1 gopkg.in/yaml.v3 v3.0.1 ) @@ -41,10 +43,10 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect go.opentelemetry.io/otel/trace v1.38.0 // indirect go.opentelemetry.io/proto/otlp v1.7.1 // indirect - golang.org/x/net v0.43.0 // indirect + golang.org/x/net v0.44.0 // indirect golang.org/x/oauth2 v0.31.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/text v0.28.0 // indirect + golang.org/x/sys v0.36.0 // indirect + golang.org/x/text v0.29.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 google.golang.org/protobuf v1.36.9 // indirect diff --git a/platform-manageability-agent/go.sum b/platform-manageability-agent/go.sum index ac89cbe4..ed632632 100644 --- a/platform-manageability-agent/go.sum +++ b/platform-manageability-agent/go.sum @@ -40,8 +40,8 @@ github.com/lufia/plan9stats v0.0.0-20250827001030-24949be3fa54 h1:mFWunSatvkQQDh github.com/lufia/plan9stats v0.0.0-20250827001030-24949be3fa54/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/open-edge-platform/edge-node-agents/common v1.8.0 h1:VhVhdftyDLQWbSeEDMXnzzP8jqDhJzph8B42IWQ6fFo= github.com/open-edge-platform/edge-node-agents/common v1.8.0/go.mod h1:zTswftFqpDz/VE/RB5cUQMPLwKWbohjlNtbOgG6X0n8= -github.com/open-edge-platform/infra-external/dm-manager v0.3.1 h1:Q9Mt9ciTF8NRRoOCIhvcd7nLlmHIuH0XTH1a8ZzZ/34= -github.com/open-edge-platform/infra-external/dm-manager v0.3.1/go.mod h1:9PoYl/Z+994IeWTD1D4WGdFc/Feje9afT3iw3FBbqiQ= +github.com/open-edge-platform/infra-external/dm-manager v0.0.0-20251008080329-cf386899a03b h1:w/H+mQ3wawrjSTJ2DpvdR6JbdhfOzupbDWNgozprE60= +github.com/open-edge-platform/infra-external/dm-manager v0.0.0-20251008080329-cf386899a03b/go.mod h1:/UCvMWa+yxR/zslsV5UP+4ib64oENkUWEXiiy8YJ/iA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -53,8 +53,8 @@ github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/shirou/gopsutil/v4 v4.25.7 h1:bNb2JuqKuAu3tRlPv5piSmBZyMfecwQ+t/ILq+1JqVM= github.com/shirou/gopsutil/v4 v4.25.7/go.mod h1:XV/egmwJtd3ZQjBpJVY5kndsiOO4IRqy9TQnmm6VP7U= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.4-0.20230606125235-dd1b4c2e81af h1:Sp5TG9f7K39yfB+If0vjp97vuT74F72r8hfRpP8jLU0= +github.com/sirupsen/logrus v1.9.4-0.20230606125235-dd1b4c2e81af/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= @@ -69,8 +69,8 @@ github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= go.opentelemetry.io/contrib/instrumentation/host v0.63.0 h1:zsaUrWypCf0NtYSUby+/BS6QqhXVNxMQD5w4dLczKCQ= go.opentelemetry.io/contrib/instrumentation/host v0.63.0/go.mod h1:Ru+kuFO+ToZqBKwI59rCStOhW6LWrbGisYrFaX61bJk= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= @@ -87,28 +87,26 @@ go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJr go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +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.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= -google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= -google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +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= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/platform-manageability-agent/internal/comms/comms.go b/platform-manageability-agent/internal/comms/comms.go index 9c22cb0c..65caaae5 100644 --- a/platform-manageability-agent/internal/comms/comms.go +++ b/platform-manageability-agent/internal/comms/comms.go @@ -35,6 +35,26 @@ const ( var ErrActivationSkipped = errors.New("activation skipped") +// TO DO: Implement proper parsing of AMT info json output +// AMTInfo represents the JSON structure returned by "rpc amtinfo -json" +/* +type AMTInfo struct { + Version string `json:"version"` + BuildNumber string `json:"buildNumber"` + ControlMode string `json:"controlMode"` + DNSSuffix string `json:"dnsSuffix"` + Features string `json:"features"` + RAS struct { + NetworkStatus string `json:"networkStatus"` + RemoteStatus string `json:"remoteStatus"` + RemoteTrigger string `json:"remoteTrigger"` + MPSHostname string `json:"mpsHostname"` + } `json:"ras"` + SKU string `json:"sku"` + UUID string `json:"uuid"` +} +*/ + type Client struct { DMMgrServiceAddr string Dialer grpc.DialOption @@ -123,12 +143,14 @@ func parseAMTInfoField(output []byte, parseKey string) (string, bool) { func (cli *Client) ReportAMTStatus(ctx context.Context, hostID string) (pb.AMTStatus, error) { defaultStatus := pb.AMTStatus_DISABLED var req *pb.AMTStatusRequest + + // TODO: Implement proper parsing of AMT info json output output, err := cli.Executor.ExecuteAMTInfo() if err != nil { req = &pb.AMTStatusRequest{ HostId: hostID, Status: defaultStatus, - Version: "", + Feature: "", } _, reportErr := cli.DMMgrClient.ReportAMTStatus(ctx, req) if reportErr != nil { @@ -141,14 +163,39 @@ func (cli *Client) ReportAMTStatus(ctx context.Context, hostID string) (pb.AMTSt return defaultStatus, fmt.Errorf("failed to execute `rpc amtinfo` command: %w", err) } - value, ok := parseAMTInfoField(output, "Version") + // Parse Features field to determine if AMT or ISM is enabled + // TODO : Use json parser to fetch filed directly from json output + value, ok := parseAMTInfoField(output, "Features") if ok { + if strings.Contains(value, "AMT Pro Corporate") { + req = &pb.AMTStatusRequest{ + HostId: hostID, + Status: pb.AMTStatus_ENABLED, + Feature: "AMT", + } + } else if strings.Contains(value, "Intel Standard Manageability Corporate") { + req = &pb.AMTStatusRequest{ + HostId: hostID, + Status: pb.AMTStatus_ENABLED, + Feature: "ISM", + } + } else { + // If features field contains other values, send empty string + req = &pb.AMTStatusRequest{ + HostId: hostID, + Status: pb.AMTStatus_ENABLED, + Feature: "", + } + } + } else { + // If we can't parse the Features field, send empty string req = &pb.AMTStatusRequest{ HostId: hostID, Status: pb.AMTStatus_ENABLED, - Version: value, + Feature: "", } } + _, err = cli.DMMgrClient.ReportAMTStatus(ctx, req) if err != nil { if st, ok := status.FromError(err); ok { @@ -161,8 +208,8 @@ func (cli *Client) ReportAMTStatus(ctx context.Context, hostID string) (pb.AMTSt return defaultStatus, fmt.Errorf("failed to report AMT status: %w", err) } - log.Logger.Infof("Reported AMT status: HostID=%s, Status=%v, Version=%s", - req.HostId, req.Status, req.Version) + log.Logger.Infof("Reported AMT status: HostID=%s, Status=%v, Feature=%s", + req.HostId, req.Status, req.Feature) return req.Status, nil } diff --git a/platform-manageability-agent/internal/comms/comms_test.go b/platform-manageability-agent/internal/comms/comms_test.go index 49ac3b36..fe883bad 100644 --- a/platform-manageability-agent/internal/comms/comms_test.go +++ b/platform-manageability-agent/internal/comms/comms_test.go @@ -46,7 +46,7 @@ func (m *mockCommandExecutor) ExecuteAMTActivate(rpsAddress, profileName, passwo } func (m *mockDeviceManagementServer) ReportAMTStatus(ctx context.Context, req *pb.AMTStatusRequest) (*pb.AMTStatusResponse, error) { - log.Logger.Infof("Received ReportAMTStatus request: HostID=%s, Status=%v, Version=%s", req.HostId, req.Status, req.Version) + log.Logger.Infof("Received ReportAMTStatus request: HostID=%s, Status=%v, Feature=%s", req.HostId, req.Status, req.Feature) if m.reportAMTStatusError != nil { return nil, m.reportAMTStatusError } @@ -284,7 +284,7 @@ func TestReportAMTStatus_Success(t *testing.T) { }() mockExecutor := &mockCommandExecutor{ - amtInfoOutput: []byte("Version: 16.1.25.1424\nBuild Number: 3425\nRecovery Version: 16.1.25.1424"), + amtInfoOutput: []byte("Version: 16.1.25.1424\nBuild Number: 3425\nRecovery Version: 16.1.25.1424\nFeatures: "), amtInfoError: nil, } @@ -301,6 +301,110 @@ func TestReportAMTStatus_Success(t *testing.T) { assert.NoError(t, err, "ReportAMTStatus should succeed") } +func TestReportAMTStatus_AMT_Feature(t *testing.T) { + lis, server := runMockServer(&mockDeviceManagementServer{}) + defer func() { + server.GracefulStop() + lis.Close() + }() + + mockExecutor := &mockCommandExecutor{ + amtInfoOutput: []byte("Version: 16.1.25.1424\nBuild Number: 3425\nFeatures: AMT Pro Corporate"), + amtInfoError: nil, + } + + tlsConfig := &tls.Config{InsecureSkipVerify: true} + client := comms.NewClient("mock-service", tlsConfig, + WithBufconnDialer(lis), + WithMockExecutor(mockExecutor), + ) + + err := client.Connect(context.Background()) + assert.NoError(t, err, "Client should connect successfully") + + status, err := client.ReportAMTStatus(context.Background(), "host-id") + assert.NoError(t, err, "ReportAMTStatus should succeed") + assert.Equal(t, pb.AMTStatus_ENABLED, status, "AMT should be enabled for AMT Pro features") +} + +func TestReportAMTStatus_AMT_Pro_Corporate_Exact(t *testing.T) { + lis, server := runMockServer(&mockDeviceManagementServer{}) + defer func() { + server.GracefulStop() + lis.Close() + }() + + mockExecutor := &mockCommandExecutor{ + amtInfoOutput: []byte("Version: 16.1.25.1424\nBuild Number: 3425\nFeatures: AMT Pro Corporate"), + amtInfoError: nil, + } + + tlsConfig := &tls.Config{InsecureSkipVerify: true} + client := comms.NewClient("mock-service", tlsConfig, + WithBufconnDialer(lis), + WithMockExecutor(mockExecutor), + ) + + err := client.Connect(context.Background()) + assert.NoError(t, err, "Client should connect successfully") + + status, err := client.ReportAMTStatus(context.Background(), "host-id") + assert.NoError(t, err, "ReportAMTStatus should succeed") + assert.Equal(t, pb.AMTStatus_ENABLED, status, "AMT should be enabled for exact 'AMT Pro Corporate' features") +} + +func TestReportAMTStatus_ISM_Feature(t *testing.T) { + lis, server := runMockServer(&mockDeviceManagementServer{}) + defer func() { + server.GracefulStop() + lis.Close() + }() + + mockExecutor := &mockCommandExecutor{ + amtInfoOutput: []byte("Version: 16.1.25.1424\nBuild Number: 3425\nFeatures: Intel Standard Manageability Corporate SKU"), + amtInfoError: nil, + } + + tlsConfig := &tls.Config{InsecureSkipVerify: true} + client := comms.NewClient("mock-service", tlsConfig, + WithBufconnDialer(lis), + WithMockExecutor(mockExecutor), + ) + + err := client.Connect(context.Background()) + assert.NoError(t, err, "Client should connect successfully") + + status, err := client.ReportAMTStatus(context.Background(), "host-id") + assert.NoError(t, err, "ReportAMTStatus should succeed") + assert.Equal(t, pb.AMTStatus_ENABLED, status, "AMT should be enabled for ISM features") +} + +func TestReportAMTStatus_Unknown_Feature(t *testing.T) { + lis, server := runMockServer(&mockDeviceManagementServer{}) + defer func() { + server.GracefulStop() + lis.Close() + }() + + mockExecutor := &mockCommandExecutor{ + amtInfoOutput: []byte("Version: 16.1.25.1424\nBuild Number: 3425\nFeatures: Some Unknown Feature"), + amtInfoError: nil, + } + + tlsConfig := &tls.Config{InsecureSkipVerify: true} + client := comms.NewClient("mock-service", tlsConfig, + WithBufconnDialer(lis), + WithMockExecutor(mockExecutor), + ) + + err := client.Connect(context.Background()) + assert.NoError(t, err, "Client should connect successfully") + + status, err := client.ReportAMTStatus(context.Background(), "host-id") + assert.NoError(t, err, "ReportAMTStatus should succeed") + assert.Equal(t, pb.AMTStatus_ENABLED, status, "AMT should be enabled but with empty feature string for unknown features") +} + func TestReportAMTStatus_ErrorMessageInOutput(t *testing.T) { lis, server := runMockServer(&mockDeviceManagementServer{ reportAMTStatusError: fmt.Errorf("simulated gRPC error"), From 4e850beecab3a6bd21de1b7c95f8117cc9861474 Mon Sep 17 00:00:00 2001 From: "Nayak, Ipsita" Date: Thu, 9 Oct 2025 07:45:21 -0700 Subject: [PATCH 02/10] fix --- .../internal/comms/comms.go | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/platform-manageability-agent/internal/comms/comms.go b/platform-manageability-agent/internal/comms/comms.go index 65caaae5..3697bca5 100644 --- a/platform-manageability-agent/internal/comms/comms.go +++ b/platform-manageability-agent/internal/comms/comms.go @@ -31,6 +31,11 @@ const ( retryInterval = 10 * time.Second tickerInterval = 500 * time.Millisecond connTimeout = 5 * time.Second + + // AMT feature constants + AMTFeature = "AMT" + ISMFeature = "ISM" + ISMFeatureDetectionString = "Intel Standard Manageability Corporate" ) var ErrActivationSkipped = errors.New("activation skipped") @@ -164,22 +169,26 @@ func (cli *Client) ReportAMTStatus(ctx context.Context, hostID string) (pb.AMTSt } // Parse Features field to determine if AMT or ISM is enabled - // TODO : Use json parser to fetch filed directly from json output + // TODO : Use json parser to fetch fields directly from json output value, ok := parseAMTInfoField(output, "Features") if ok { - if strings.Contains(value, "AMT Pro Corporate") { + log.Logger.Infof("Parsed Features field value: '%s' for host %s", value, hostID) + if strings.Contains(strings.ToUpper(value), AMTFeature) { + log.Logger.Debugf("AMT detected in features for host %s", hostID) req = &pb.AMTStatusRequest{ HostId: hostID, Status: pb.AMTStatus_ENABLED, - Feature: "AMT", + Feature: AMTFeature, } - } else if strings.Contains(value, "Intel Standard Manageability Corporate") { + } else if strings.Contains(value, ISMFeatureDetectionString) { + log.Logger.Debugf("ISM detected in features for host %s", hostID) req = &pb.AMTStatusRequest{ HostId: hostID, Status: pb.AMTStatus_ENABLED, - Feature: "ISM", + Feature: ISMFeature, } } else { + log.Logger.Debugf("Unknown feature detected: '%s' for host %s", value, hostID) // If features field contains other values, send empty string req = &pb.AMTStatusRequest{ HostId: hostID, @@ -188,6 +197,7 @@ func (cli *Client) ReportAMTStatus(ctx context.Context, hostID string) (pb.AMTSt } } } else { + log.Logger.Debugf("Features field not found or empty for host %s", hostID) // If we can't parse the Features field, send empty string req = &pb.AMTStatusRequest{ HostId: hostID, @@ -195,7 +205,7 @@ func (cli *Client) ReportAMTStatus(ctx context.Context, hostID string) (pb.AMTSt Feature: "", } } - + // Send the AMT status to the device manager _, err = cli.DMMgrClient.ReportAMTStatus(ctx, req) if err != nil { if st, ok := status.FromError(err); ok { From 7c16045c8a0d58fb772da545a56f99385d52d72d Mon Sep 17 00:00:00 2001 From: "Nayak, Ipsita" Date: Thu, 9 Oct 2025 08:01:34 -0700 Subject: [PATCH 03/10] fix --- platform-manageability-agent/internal/comms/comms.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform-manageability-agent/internal/comms/comms.go b/platform-manageability-agent/internal/comms/comms.go index 3697bca5..4a293a26 100644 --- a/platform-manageability-agent/internal/comms/comms.go +++ b/platform-manageability-agent/internal/comms/comms.go @@ -32,7 +32,7 @@ const ( tickerInterval = 500 * time.Millisecond connTimeout = 5 * time.Second - // AMT feature constants + // AMT and ISM feature constants - replaces hardcoded strings AMTFeature = "AMT" ISMFeature = "ISM" ISMFeatureDetectionString = "Intel Standard Manageability Corporate" From a15f286243c8a859bef4fda140c310d9a15bb7fc Mon Sep 17 00:00:00 2001 From: "Nayak, Ipsita" Date: Thu, 9 Oct 2025 08:04:53 -0700 Subject: [PATCH 04/10] fix --- platform-manageability-agent/internal/comms/comms.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform-manageability-agent/internal/comms/comms.go b/platform-manageability-agent/internal/comms/comms.go index 4a293a26..9fa38e46 100644 --- a/platform-manageability-agent/internal/comms/comms.go +++ b/platform-manageability-agent/internal/comms/comms.go @@ -32,7 +32,7 @@ const ( tickerInterval = 500 * time.Millisecond connTimeout = 5 * time.Second - // AMT and ISM feature constants - replaces hardcoded strings + // AMT and ISM feature constants. AMTFeature = "AMT" ISMFeature = "ISM" ISMFeatureDetectionString = "Intel Standard Manageability Corporate" From 5b117e5a8353a9336980be3ac3887bfa460c62d8 Mon Sep 17 00:00:00 2001 From: ipsita-npg Date: Fri, 10 Oct 2025 08:57:28 +0530 Subject: [PATCH 05/10] Update VERSION --- platform-manageability-agent/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform-manageability-agent/VERSION b/platform-manageability-agent/VERSION index 70426f85..0c62199f 100644 --- a/platform-manageability-agent/VERSION +++ b/platform-manageability-agent/VERSION @@ -1 +1 @@ -0.2.0-dev +0.2.1 From 185627651ab970446a2696a57b139ade55327ed4 Mon Sep 17 00:00:00 2001 From: ipsita-npg Date: Fri, 10 Oct 2025 09:24:19 +0530 Subject: [PATCH 06/10] Update VERSION --- platform-manageability-agent/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform-manageability-agent/VERSION b/platform-manageability-agent/VERSION index 0c62199f..70426f85 100644 --- a/platform-manageability-agent/VERSION +++ b/platform-manageability-agent/VERSION @@ -1 +1 @@ -0.2.1 +0.2.0-dev From a5ac89f7f0a323fb6a009ec513ac48fc8b63478d Mon Sep 17 00:00:00 2001 From: "Nayak, Ipsita" Date: Thu, 9 Oct 2025 21:45:01 -0700 Subject: [PATCH 07/10] Fixed integration test failure and bump version --- ena-manifest.yaml | 4 ++-- platform-manageability-agent/VERSION | 2 +- .../platform-manageability-agent_test.go | 8 +++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ena-manifest.yaml b/ena-manifest.yaml index 4a16221e..3f65539c 100644 --- a/ena-manifest.yaml +++ b/ena-manifest.yaml @@ -4,7 +4,7 @@ --- metadata: schemaVersion: 2.0.0 - release: 1.3.1 + release: 1.3.2 repository: codename: 3.1 component: main @@ -19,7 +19,7 @@ packages: version: 1.7.3 ociArtifact: edge-orch/en/deb/node-agent - name: platform-manageability-agent - version: 0.1.8 + version: 0.2.1 ociArtifact: edge-orch/en/deb/platform-manageability-agent - name: platform-observability-agent version: 1.9.0 diff --git a/platform-manageability-agent/VERSION b/platform-manageability-agent/VERSION index 70426f85..0c62199f 100644 --- a/platform-manageability-agent/VERSION +++ b/platform-manageability-agent/VERSION @@ -1 +1 @@ -0.2.0-dev +0.2.1 diff --git a/platform-manageability-agent/cmd/platform-manageability-agent/platform-manageability-agent_test.go b/platform-manageability-agent/cmd/platform-manageability-agent/platform-manageability-agent_test.go index f7fadb67..5fc99f93 100644 --- a/platform-manageability-agent/cmd/platform-manageability-agent/platform-manageability-agent_test.go +++ b/platform-manageability-agent/cmd/platform-manageability-agent/platform-manageability-agent_test.go @@ -10,6 +10,7 @@ import ( "io" "os" "os/exec" + "strings" "testing" "time" @@ -57,10 +58,15 @@ func TestDeviceConfiguration(t *testing.T) { pmaCmd, err := startPlatformManageabilityAgent(ctx, platformManageabilityAgentBinary) require.NoError(t, err) - time.Sleep(20 * time.Second) + time.Sleep(25 * time.Second) require.Contains(t, pmaBuffer.String(), "Platform Manageability Agent started successfully") require.Contains(t, pmaBuffer.String(), "Successfully reported AMT status for host") require.Contains(t, pmaBuffer.String(), "Successfully retrieved activation details for host") + + // Wait a bit more for status to become ready after activation completes + if !strings.Contains(pmaBuffer.String(), "Status Ready") { + time.Sleep(5 * time.Second) + } require.Contains(t, pmaBuffer.String(), "Status Ready") require.Contains(t, mockBuffer.String(), "AMTStatusRequest") require.Contains(t, mockBuffer.String(), "ActivationRequest") From 9a3825577d38fe15053568d5894bdad73813d820 Mon Sep 17 00:00:00 2001 From: ipsita-npg Date: Fri, 10 Oct 2025 10:27:57 +0530 Subject: [PATCH 08/10] Update VERSION --- platform-manageability-agent/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform-manageability-agent/VERSION b/platform-manageability-agent/VERSION index 0c62199f..0ea3a944 100644 --- a/platform-manageability-agent/VERSION +++ b/platform-manageability-agent/VERSION @@ -1 +1 @@ -0.2.1 +0.2.0 From f0c5adfd1384660e3afbac147fd71d4739cd6c52 Mon Sep 17 00:00:00 2001 From: ipsita-npg Date: Fri, 10 Oct 2025 10:28:31 +0530 Subject: [PATCH 09/10] Update ena-manifest.yaml --- ena-manifest.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ena-manifest.yaml b/ena-manifest.yaml index 3f65539c..5d0f32bf 100644 --- a/ena-manifest.yaml +++ b/ena-manifest.yaml @@ -19,7 +19,7 @@ packages: version: 1.7.3 ociArtifact: edge-orch/en/deb/node-agent - name: platform-manageability-agent - version: 0.2.1 + version: 0.2.0 ociArtifact: edge-orch/en/deb/platform-manageability-agent - name: platform-observability-agent version: 1.9.0 From fa7d5caa4ce45dc84e3edfdb219ffa7f0bad08b3 Mon Sep 17 00:00:00 2001 From: Ipsita Nayak Date: Mon, 13 Oct 2025 09:30:31 +0530 Subject: [PATCH 10/10] updated dm-manager dep --- platform-manageability-agent/go.mod | 2 +- platform-manageability-agent/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platform-manageability-agent/go.mod b/platform-manageability-agent/go.mod index 4c86b127..85cff286 100644 --- a/platform-manageability-agent/go.mod +++ b/platform-manageability-agent/go.mod @@ -8,7 +8,7 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 github.com/open-edge-platform/edge-node-agents/common v1.8.0 - github.com/open-edge-platform/infra-external/dm-manager v0.0.0-20251008080329-cf386899a03b + github.com/open-edge-platform/infra-external/dm-manager v0.5.0 github.com/sirupsen/logrus v1.9.4-0.20230606125235-dd1b4c2e81af github.com/stretchr/testify v1.11.1 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 diff --git a/platform-manageability-agent/go.sum b/platform-manageability-agent/go.sum index ed632632..6b57ddb6 100644 --- a/platform-manageability-agent/go.sum +++ b/platform-manageability-agent/go.sum @@ -40,8 +40,8 @@ github.com/lufia/plan9stats v0.0.0-20250827001030-24949be3fa54 h1:mFWunSatvkQQDh github.com/lufia/plan9stats v0.0.0-20250827001030-24949be3fa54/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/open-edge-platform/edge-node-agents/common v1.8.0 h1:VhVhdftyDLQWbSeEDMXnzzP8jqDhJzph8B42IWQ6fFo= github.com/open-edge-platform/edge-node-agents/common v1.8.0/go.mod h1:zTswftFqpDz/VE/RB5cUQMPLwKWbohjlNtbOgG6X0n8= -github.com/open-edge-platform/infra-external/dm-manager v0.0.0-20251008080329-cf386899a03b h1:w/H+mQ3wawrjSTJ2DpvdR6JbdhfOzupbDWNgozprE60= -github.com/open-edge-platform/infra-external/dm-manager v0.0.0-20251008080329-cf386899a03b/go.mod h1:/UCvMWa+yxR/zslsV5UP+4ib64oENkUWEXiiy8YJ/iA= +github.com/open-edge-platform/infra-external/dm-manager v0.5.0 h1:bpMsyznc8Ys515PhcKy9jngTsDCdL+ZgVZuOQijiHfc= +github.com/open-edge-platform/infra-external/dm-manager v0.5.0/go.mod h1:/UCvMWa+yxR/zslsV5UP+4ib64oENkUWEXiiy8YJ/iA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=