blob: c3bf162b4f55aecc9c5896ad5c1312ec45717b31 [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.
// Fourth and final step in the CrOSInstall State Machine. Installs DLCs
package crosservice
import (
"chromiumos/test/provision/cmd/provisionserver/bootstrap/info"
"chromiumos/test/provision/cmd/provisionserver/bootstrap/services"
"context"
"fmt"
"go.chromium.org/chromiumos/config/go/test/api"
)
type CrOSProvisionDLCState struct {
service CrOSService
}
func (s CrOSProvisionDLCState) Execute(ctx context.Context) error {
if len(s.service.dlcSpecs) == 0 {
return nil
}
s.service.StopDLCService(ctx)
defer s.service.StartDLCService(ctx)
root, err := s.service.GetRoot(ctx)
if err != nil {
return fmt.Errorf("failed to get root device from DUT, %s", err)
}
rpn, err := s.service.GetRootPartNumber(ctx, root)
if err != nil {
return fmt.Errorf("failed to get root device from DUT, %s", err)
}
activeSlot := info.ActiveDlcMap[rpn]
errCh := make(chan error)
for _, spec := range s.service.dlcSpecs {
go func(spec *api.InstallCrosRequest_DLCSpec) {
errCh <- s.service.InstallDLC(ctx, spec, activeSlot)
}(spec)
}
for range s.service.dlcSpecs {
errTmp := <-errCh
if errTmp == nil {
continue
}
err = fmt.Errorf("%s, %s", err, errTmp)
}
if err != nil {
return fmt.Errorf("failed to install the following DLCs (%s)", err)
}
return nil
}
func (s CrOSProvisionDLCState) Next() services.ServiceState {
return nil
}
func (s CrOSProvisionDLCState) Name() string {
return "CrOS Provision DLC"
}