blob: 8b23db4b73277a9eb1adb2aa1660041d9cee6f5a [file] [log] [blame]
// Copyright 2022 The ChromiumOS Authors.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package service
import (
"context"
"fmt"
"log"
common_utils "go.chromium.org/chromiumos/test/publish/cmd/common-utils"
"go.chromium.org/chromiumos/config/go/test/api"
)
// TkoPublishService serves only one publish request. Not to be confused with a
// server that creates a new service instance for each request.
type TkoPublishService struct {
LocalArtifactPath string
RetryCount int
JobName string
}
func NewTkoPublishService(req *api.PublishRequest) (*TkoPublishService, error) {
metadata, err := unpackMetadata(req)
if err != nil {
return nil, err
}
if err = common_utils.ValidateTKOPublishRequest(req, metadata); err != nil {
return nil, err
}
retryCount := 0
if req.GetRetryCount() > 0 {
retryCount = int(req.GetRetryCount())
}
return &TkoPublishService{
LocalArtifactPath: req.GetArtifactDirPath().GetPath(),
RetryCount: retryCount,
JobName: metadata.GetJobName(),
}, nil
}
func (ts *TkoPublishService) UploadToTko(ctx context.Context) error {
cmd, err := tkoParseCmd(ctx, TkoParseRequest{ResultsDir: ts.LocalArtifactPath, JobName: ts.JobName})
if err != nil {
log.Printf("error while creating tko parse command: %s", err)
return fmt.Errorf("error while creating tko parse command: %s", err)
}
_, _, err = common_utils.RunCommand(ctx, cmd, "tko/parse", nil, true)
if err != nil {
log.Printf("error in tko upload: %s", err)
return fmt.Errorf("error in tko upload: %s", err)
}
return nil
}
// unpackMetadata unpacks the Any metadata field into PublishTkoMetadata
func unpackMetadata(req *api.PublishRequest) (*api.PublishTkoMetadata, error) {
var m api.PublishTkoMetadata
if err := req.Metadata.UnmarshalTo(&m); err != nil {
return &m, fmt.Errorf("improperly formatted input proto metadata, %s", err)
}
return &m, nil
}