provision: Input servonexus address from start provision request
This CL also update the DetectOS logic. It performs fast connection
check with small timeouts first and then performs long connection checks
with larger timeouts.
BUG=None
TEST=Ran foil-provision container locally.
Change-Id: Ic3af58eba133e781936c63eb705c15ac18ef57b1
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/dev-util/+/5906017
Commit-Queue: ChromeOS Auto Runner <chromeos-auto-runner@chromeos-bot.iam.gserviceaccount.com>
Tested-by: Kshitij Pancholi <panchok@google.com>
Commit-Queue: Kshitij Pancholi <panchok@google.com>
Reviewed-by: Chris DeLaGarza <cdelagarza@google.com>
diff --git a/src/go.chromium.org/chromiumos/test/provision/v2/android-provision/executor/android_service_executor.go b/src/go.chromium.org/chromiumos/test/provision/v2/android-provision/executor/android_service_executor.go
index bf75067..18795e1 100644
--- a/src/go.chromium.org/chromiumos/test/provision/v2/android-provision/executor/android_service_executor.go
+++ b/src/go.chromium.org/chromiumos/test/provision/v2/android-provision/executor/android_service_executor.go
@@ -18,7 +18,7 @@
type AndroidProvisionExecutor struct {
}
-func (c *AndroidProvisionExecutor) GetFirstState(dut *lab_api.Dut, dutClient api.DutServiceClient, req *api.InstallRequest) (common_utils.ServiceState, error) {
+func (c *AndroidProvisionExecutor) GetFirstState(dut *lab_api.Dut, dutClient api.DutServiceClient, servoNexusAddr string, req *api.InstallRequest) (common_utils.ServiceState, error) {
svc, err := service.NewAndroidService(dut, dutClient, req)
if err != nil {
return nil, err
diff --git a/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/cross-over/utils.go b/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/cross-over/utils.go
index 36cf405..a159d7d 100644
--- a/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/cross-over/utils.go
+++ b/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/cross-over/utils.go
@@ -13,7 +13,9 @@
"go.chromium.org/chromiumos/config/go/api/test/xmlrpc"
"go.chromium.org/chromiumos/config/go/test/api"
+ "go.chromium.org/chromiumos/test/dut/cmd/cros-dut/dutssh"
"go.chromium.org/chromiumos/test/util/adb"
+ "golang.org/x/crypto/ssh"
)
type OS_TYPE int
@@ -21,19 +23,51 @@
const (
ANDROID OS_TYPE = iota
CROS
+ UNKNOWN
)
-func DetectOS(logger *log.Logger, dutAddress string) (OS_TYPE, error) {
- // TODO: If its already an android DUT, then we can optimize and avoid calling SetupAdb two times, here and in FoilPreInitState.
- if err := adb.RetrySetupAdb(logger, dutAddress, 3*time.Minute); err != nil {
- // ADB failure implies DUT is CROS.
- // TODO: Do second validation that DUT is cros by invoking GetConnectionWithRetry.
- return CROS, nil
+func checkSSH(logger *log.Logger, dutAddress string, config *ssh.ClientConfig, retryCount int, retryInterval time.Duration) bool {
+ log.Println("Checking for ssh connection.")
+ for ; retryCount >= 0; retryCount-- {
+ _, err := ssh.Dial("tcp", dutAddress, config)
+ if err == nil {
+ return true
+ }
+ log.Println("Got error while ssh. Retrying...")
+ time.Sleep(retryInterval)
+ }
+ return false
+}
+
+func checkADB(logger *log.Logger, dutAddress string, timeout time.Duration) bool {
+ err := adb.RetrySetupAdb(logger, dutAddress, timeout)
+ if err != nil {
+ return false
}
if err := adb.TeardownAdb(logger, dutAddress); err != nil {
logger.Println("Warning: TeardownAdb failed: ", err)
}
- return ANDROID, nil
+ return true
+}
+
+func DetectOS(logger *log.Logger, dutAddress string) (OS_TYPE, error) {
+ config := dutssh.GetSSHConfig()
+ // Perform fast connection check.
+ if checkSSH(logger, dutAddress, config, 2, 2*time.Second) {
+ return CROS, nil
+ }
+ if checkADB(logger, dutAddress, 10*time.Second) {
+ return ANDROID, nil
+ }
+
+ // Perform long connection check.
+ if checkSSH(logger, dutAddress, config, 5, 10*time.Second) {
+ return CROS, nil
+ }
+ if checkADB(logger, dutAddress, 3*time.Minute) {
+ return ANDROID, nil
+ }
+ return UNKNOWN, fmt.Errorf("could not detect underlining os for dut")
}
func callServod(ctx context.Context, log *log.Logger, servodClient api.ServodServiceClient, key, value, servoHostPath, servodDockerContainerName string, servodPort int32) error {
diff --git a/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/server/provision_executor.go b/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/server/provision_executor.go
index 46f87b9..2de30f2 100644
--- a/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/server/provision_executor.go
+++ b/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/server/provision_executor.go
@@ -15,6 +15,6 @@
)
type ProvisionExecutor interface {
- GetFirstState(dut *lab_api.Dut, dutClient api.DutServiceClient, req *api.InstallRequest) (common_utils.ServiceState, error)
+ GetFirstState(dut *lab_api.Dut, dutClient api.DutServiceClient, servoNexusAddr string, req *api.InstallRequest) (common_utils.ServiceState, error)
Validate(req *api.ProvisionStartupRequest) error
}
diff --git a/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/server/provision_server.go b/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/server/provision_server.go
index 8c973cf..6d2e71c 100644
--- a/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/server/provision_server.go
+++ b/src/go.chromium.org/chromiumos/test/provision/v2/common-utils/server/provision_server.go
@@ -25,11 +25,12 @@
)
type ProvisionServer struct {
- options *metadata.ServerMetadata
- dutClient api.DutServiceClient
- manager *lro.Manager
- executor ProvisionExecutor
- conns []*grpc.ClientConn
+ options *metadata.ServerMetadata
+ dutClient api.DutServiceClient
+ manager *lro.Manager
+ executor ProvisionExecutor
+ conns []*grpc.ClientConn
+ servoNexusAddr string
}
func NewProvisionServer(options *metadata.ServerMetadata, executor ProvisionExecutor) (*ProvisionServer, func(), error) {
@@ -88,6 +89,8 @@
response.Status = api.ProvisionStartupResponse_STATUS_INVALID_REQUEST
return &response, err
}
+ // TODO: Uncomment this when proto changes are made available.
+ //ps.servoNexusAddr = req.GetServoNexusAddr().GetAddress() + ":" + req.GetServoNexusAddr().GetPort()
ps.options.Dut = req.Dut
ps.options.DutAddress = fmt.Sprintf("%s:%d", req.GetDutServer().GetAddress(), req.GetDutServer().GetPort())
dutConn, err := grpc.Dial(ps.options.DutAddress, grpc.WithInsecure())
@@ -129,7 +132,7 @@
return api.InstallResponse_STATUS_PRE_PROVISION_SETUP_FAILED, nil, errors.New("error: no dut client found")
}
- fs, err := ps.executor.GetFirstState(ps.options.Dut, ps.dutClient, req)
+ fs, err := ps.executor.GetFirstState(ps.options.Dut, ps.dutClient, ps.servoNexusAddr, req)
if err != nil {
return api.InstallResponse_STATUS_INVALID_REQUEST, nil, err
}
diff --git a/src/go.chromium.org/chromiumos/test/provision/v2/cros-provision/executor/cros_service_executor.go b/src/go.chromium.org/chromiumos/test/provision/v2/cros-provision/executor/cros_service_executor.go
index e0297be..60c67c9 100644
--- a/src/go.chromium.org/chromiumos/test/provision/v2/cros-provision/executor/cros_service_executor.go
+++ b/src/go.chromium.org/chromiumos/test/provision/v2/cros-provision/executor/cros_service_executor.go
@@ -8,8 +8,8 @@
package executor
import (
- common_utils "go.chromium.org/chromiumos/test/provision/v2/common-utils"
"errors"
+ common_utils "go.chromium.org/chromiumos/test/provision/v2/common-utils"
"go.chromium.org/chromiumos/test/provision/v2/cros-provision/service"
state_machine "go.chromium.org/chromiumos/test/provision/v2/cros-provision/state-machine"
@@ -21,7 +21,7 @@
type CrOSProvisionExecutor struct {
}
-func (c *CrOSProvisionExecutor) GetFirstState(dut *lab_api.Dut, dutClient api.DutServiceClient, req *api.InstallRequest) (common_utils.ServiceState, error) {
+func (c *CrOSProvisionExecutor) GetFirstState(dut *lab_api.Dut, dutClient api.DutServiceClient, servoNexusAddr string, req *api.InstallRequest) (common_utils.ServiceState, error) {
cs, err := service.NewCrOSService(dut, dutClient, req)
if err != nil {
return nil, err
diff --git a/src/go.chromium.org/chromiumos/test/provision/v2/foil-provision/cli/server_command.go b/src/go.chromium.org/chromiumos/test/provision/v2/foil-provision/cli/server_command.go
index eb749c2..1ed72ca 100644
--- a/src/go.chromium.org/chromiumos/test/provision/v2/foil-provision/cli/server_command.go
+++ b/src/go.chromium.org/chromiumos/test/provision/v2/foil-provision/cli/server_command.go
@@ -18,11 +18,10 @@
// ServerCommand executed the provisioning as a Server
type ServerCommand struct {
- metadata *metadata.ServerMetadata
- logFileName string
- metadataFile string
- flagSet *flag.FlagSet
- crosServodAddress string
+ metadata *metadata.ServerMetadata
+ logFileName string
+ metadataFile string
+ flagSet *flag.FlagSet
}
func NewServerCommand() *ServerCommand {
@@ -34,8 +33,6 @@
sc.flagSet.IntVar(&sc.metadata.Port, "port", constants.DefaultPort, fmt.Sprintf("Specify the port for the server. Default value %d.", constants.DefaultPort))
sc.flagSet.StringVar(&sc.logFileName, "log-path", constants.DefaultLogDirectory, fmt.Sprintf("Path to record execution logs. Default value is %s", constants.DefaultLogDirectory))
sc.flagSet.StringVar(&sc.metadataFile, "metadata", "", "Specify the request jsonproto input file. Provide service paths and ProvisionState.")
- // TODO: Move crosServodAddress to ProvisionStartupRequest.
- sc.flagSet.StringVar(&sc.crosServodAddress, "crosServodAddress", "localhost:80", "The address for the cros-servod CFT service. Format should be IP:Port")
return sc
}
@@ -72,7 +69,7 @@
func (sc *ServerCommand) Run() error {
sc.metadata.Log.Printf("running server mode:")
- foilProvisionExecutor, err := executor.NewFoilProvisionExecutor(sc.metadata.Log, sc.crosServodAddress)
+ foilProvisionExecutor, err := executor.NewFoilProvisionExecutor(sc.metadata.Log)
if err != nil {
sc.metadata.Log.Fatalln("failed to create FoilProvisionExecutor: ", err)
return err
diff --git a/src/go.chromium.org/chromiumos/test/provision/v2/foil-provision/executor/foil_service_executor.go b/src/go.chromium.org/chromiumos/test/provision/v2/foil-provision/executor/foil_service_executor.go
index 22de8de..bb29426 100644
--- a/src/go.chromium.org/chromiumos/test/provision/v2/foil-provision/executor/foil_service_executor.go
+++ b/src/go.chromium.org/chromiumos/test/provision/v2/foil-provision/executor/foil_service_executor.go
@@ -23,24 +23,20 @@
type FoilProvisionExecutor struct {
Logger *log.Logger
- // TODO: CrosServodAddress should not be a part of executor. Move it to ProvisionStartupRequest.
- CrosServodAddress string
}
-func NewFoilProvisionExecutor(logger *log.Logger, crosServodAddress string) (*FoilProvisionExecutor, error) {
+func NewFoilProvisionExecutor(logger *log.Logger) (*FoilProvisionExecutor, error) {
return &FoilProvisionExecutor{
- Logger: logger,
- CrosServodAddress: crosServodAddress,
+ Logger: logger,
}, nil
}
-func (c *FoilProvisionExecutor) GetFirstState(dut *lab_api.Dut, dutClient api.DutServiceClient, req *api.InstallRequest) (common_utils.ServiceState, error) {
+func (c *FoilProvisionExecutor) GetFirstState(dut *lab_api.Dut, dutClient api.DutServiceClient, servoNexusAddr string, req *api.InstallRequest) (common_utils.ServiceState, error) {
osType, err := cross_over.DetectOS(c.Logger, fmt.Sprintf("%v:%v", dut.GetChromeos().GetSsh().GetAddress(), dut.GetChromeos().GetSsh().GetPort()))
if err != nil {
return nil, err
}
if osType == cross_over.CROS {
-
params := &cross_over.CrossOverParameters{
DutClient: dutClient,
Dut: dut,
@@ -49,7 +45,7 @@
//ServodDockerImagePath: "us-docker.pkg.dev/chromeos-partner-moblab/common-core/servod:release",
//TODO: Decide how ServodDockerContainerName and ServodDockerImagePath will be populated.
}
- conn, err := grpc.Dial(c.CrosServodAddress, grpc.WithInsecure())
+ conn, err := grpc.Dial(servoNexusAddr, grpc.WithInsecure())
if err != nil {
return nil, err
}
diff --git a/src/go.chromium.org/chromiumos/test/provision/v2/lacros-provision/executor/lacros_service_executor.go b/src/go.chromium.org/chromiumos/test/provision/v2/lacros-provision/executor/lacros_service_executor.go
index 41cf887..0cd233e 100644
--- a/src/go.chromium.org/chromiumos/test/provision/v2/lacros-provision/executor/lacros_service_executor.go
+++ b/src/go.chromium.org/chromiumos/test/provision/v2/lacros-provision/executor/lacros_service_executor.go
@@ -5,9 +5,9 @@
package executor
import (
+ "errors"
common_utils "go.chromium.org/chromiumos/test/provision/v2/common-utils"
"go.chromium.org/chromiumos/test/provision/v2/lacros-provision/service"
- "errors"
"go.chromium.org/chromiumos/config/go/test/api"
lab_api "go.chromium.org/chromiumos/config/go/test/lab/api"
@@ -18,7 +18,7 @@
type LaCrOSProvisionExecutor struct {
}
-func (c *LaCrOSProvisionExecutor) GetFirstState(dut *lab_api.Dut, dutClient api.DutServiceClient, req *api.InstallRequest) (common_utils.ServiceState, error) {
+func (c *LaCrOSProvisionExecutor) GetFirstState(dut *lab_api.Dut, dutClient api.DutServiceClient, servoNexusAddr string, req *api.InstallRequest) (common_utils.ServiceState, error) {
cs, err := service.NewLaCrOSService(dut, dutClient, req)
if err != nil {
return nil, err