blob: 7f58eccbc150d06711dc8382a777b00be743f16b [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Implements provision_service.proto (see proto for details)
package main
import (
"context"
"fmt"
"net"
"chromiumos/lro"
"go.chromium.org/chromiumos/config/go/longrunning"
"go.chromium.org/chromiumos/config/go/test/api"
"go.chromium.org/luci/common/errors"
"google.golang.org/grpc"
)
// startServer starts provision server on requested port.
func (s *provision) startServer(port int) error {
l, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
if err != nil {
return errors.Annotate(err, "start server: create listener at %d", port).Err()
}
s.manager = lro.New()
defer s.manager.Close()
server := grpc.NewServer()
api.RegisterProvisionServiceServer(server, s)
longrunning.RegisterOperationsServer(server, s.manager)
s.logger.Println("provisionservice listen to request at ", l.Addr().String())
return server.Serve(l)
}
// InstallCros installs a specified version of Chrome OS on the DUT, along
// with any specified DLCs.
//
// If the DUT already has the specified list of DLCs, only the missing DLCs
// will be provisioned.
func (s *provision) InstallCros(ctx context.Context, req *api.InstallCrosRequest) (*longrunning.Operation, error) {
s.logger.Println("Received api.InstallCrosRequest: ", *req)
op := s.manager.NewOperation()
response := api.InstallCrosResponse{}
if fr, err := s.installCros(ctx, req, op); err != nil {
response.Outcome = &api.InstallCrosResponse_Failure{
Failure: fr,
}
} else {
response.Outcome = &api.InstallCrosResponse_Success{}
}
s.manager.SetResult(op.Name, &response)
return op, nil
}
// InstallLacros installs a specified version of Lacros on the DUT.
func (s *provision) InstallLacros(ctx context.Context, req *api.InstallLacrosRequest) (*longrunning.Operation, error) {
op := s.manager.NewOperation()
response := api.InstallLacrosResponse{}
if fr, err := s.installLacros(ctx, req, op); err != nil {
response.Outcome = &api.InstallLacrosResponse_Failure{
Failure: fr,
}
} else {
response.Outcome = &api.InstallLacrosResponse_Success{}
}
s.manager.SetResult(op.Name, &response)
return op, nil
}
// InstallAsh installs a specified version of ash-chrome on the DUT.
//
// This directly overwrites the version of ash-chrome on the current root
// disk partition.
func (s *provision) InstallAsh(ctx context.Context, req *api.InstallAshRequest) (*longrunning.Operation, error) {
op := s.manager.NewOperation()
response := api.InstallAshResponse{}
if fr, err := s.installAsh(ctx, req, op); err != nil {
response.Outcome = &api.InstallAshResponse_Failure{
Failure: fr,
}
} else {
response.Outcome = &api.InstallAshResponse_Success{}
}
s.manager.SetResult(op.Name, &response)
return op, nil
}
// InstallArc installs a specified version of ARC on the DUT.
//
// This directly overwrites the version of ARC on the current root
// disk partition.
func (s *provision) InstallArc(ctx context.Context, req *api.InstallArcRequest) (*longrunning.Operation, error) {
op := s.manager.NewOperation()
response := api.InstallArcResponse{}
if fr, err := s.installArc(ctx, req, op); err != nil {
response.Outcome = &api.InstallArcResponse_Failure{
Failure: fr,
}
} else {
response.Outcome = &api.InstallArcResponse_Success{}
}
s.manager.SetResult(op.Name, &response)
return op, nil
}
// InstallFirmware installs AP/EC firmware to the DUT
func (s *provision) InstallFirmware(ctx context.Context, req *api.InstallFirmwareRequest) (*longrunning.Operation, error) {
s.logger.Println("Received api.InstallFirmwareRequest: ", *req)
op := s.manager.NewOperation()
response := api.InstallFirmwareResponse{}
if fr, err := s.installFirmware(ctx, req, op); err != nil {
response.Outcome = &api.InstallFirmwareResponse_Failure{
Failure: fr,
}
} else {
response.Outcome = &api.InstallFirmwareResponse_Success{}
}
s.manager.SetResult(op.Name, &response)
return op, nil
}