"strings"
"time"
- common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib"
- "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib/eows"
- "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1"
+ common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git"
+ "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/eows"
+ "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xsapiv1"
"github.com/Sirupsen/logrus"
uuid "github.com/satori/go.uuid"
)
}
// ListCrossSDK List all available and installed SDK (call "db-dump" script)
-func ListCrossSDK(scriptDir string, log *logrus.Logger) ([]xsapiv1.SDK, error) {
+func ListCrossSDK(scriptDir string, update bool, log *logrus.Logger) ([]xsapiv1.SDK, error) {
sdksList := []xsapiv1.SDK{}
+ // First update sdk DB when requested
+ if update {
+ out, err := UpdateSDKDb(scriptDir, log)
+ if err != nil {
+ log.Errorf("SDK DB update failure (%v): %v", err, out)
+ return sdksList, fmt.Errorf("Error while updating SDK DB (%v)", err)
+ }
+ }
+
// Retrieve SDKs list and info
cmd := exec.Command(path.Join(scriptDir, scriptDbDump))
stdout, err := cmd.CombinedOutput()
}
// GetSDKInfo Used get-sdk-info script to extract SDK get info from a SDK file/tarball
-func GetSDKInfo(scriptDir, url, filename, md5sum string, log *logrus.Logger) (xsapiv1.SDK, error) {
+func GetSDKInfo(scriptDir, url, filename, md5sum, uuid string, log *logrus.Logger) (xsapiv1.SDK, error) {
sdk := xsapiv1.SDK{}
args := []string{}
} else {
return sdk, fmt.Errorf("url of filename must be set")
}
+ if uuid != "" {
+ args = append(args, "--uuid", uuid)
+ }
cmd := exec.Command(path.Join(scriptDir, scriptGetSdkInfo), args...)
stdout, err := cmd.CombinedOutput()
return sdk, nil
}
+// UpdateSDKDb Used db-update script to update SDK database
+func UpdateSDKDb(scriptDir string, log *logrus.Logger) (string, error) {
+ args := []string{}
+ cmd := exec.Command(path.Join(scriptDir, scriptDbUpdate), args...)
+ stdout, err := cmd.CombinedOutput()
+
+ return string(stdout), err
+}
+
// NewCrossSDK creates a new instance of CrossSDK
func NewCrossSDK(ctx *Context, sdk xsapiv1.SDK, scriptDir string) (*CrossSDK, error) {
s := CrossSDK{
// Install a SDK (non blocking command, IOW run in background)
func (s *CrossSDK) Install(file string, force bool, timeout int, args []string, sess *ClientSession) error {
- if s.sdk.Status == xsapiv1.SdkStatusInstalled {
+ if s.sdk.Status == xsapiv1.SdkStatusInstalled && !force {
return fmt.Errorf("already installed")
}
if s.sdk.Status == xsapiv1.SdkStatusInstalling {
// Create new instance to execute command and sent output over WS
s.installCmd = eows.New(s.scripts[scriptAdd], cmdArgs, sess.IOSocket, sess.ID, cmdID)
s.installCmd.Log = s.Log
+ // TODO: enable Term s.installCmd.PtyMode = true
s.installCmd.LineTimeSpan = 500 * time.Millisecond.Nanoseconds()
if timeout > 0 {
s.installCmd.CmdExecTimeout = timeout
}
// Define callback for output (stdout+stderr)
- s.installCmd.OutputCB = func(e *eows.ExecOverWS, stdout, stderr string) {
+ s.installCmd.OutputCB = func(e *eows.ExecOverWS, bStdout, bStderr []byte) {
+
+ stdout := string(bStdout)
+ stderr := string(bStderr)
+
// paranoia
data := e.UserData
sdkID := (*data)["SDKID"].(string)
if sdkID != s.sdk.ID {
- s.Log.Errorln("BUG: sdk ID differs: %v != %v", sdkID, s.sdk.ID)
+ s.Log.Errorf("BUG: sdk ID differs: %v != %v", sdkID, s.sdk.ID)
}
// IO socket can be nil when disconnected
// Define callback for output
s.installCmd.ExitCB = func(e *eows.ExecOverWS, code int, exitError error) {
+ defer LockXdsUpdateCounter(s.Context, false)
+
// paranoia
data := e.UserData
sdkID := (*data)["SDKID"].(string)
if sdkID != s.sdk.ID {
- s.Log.Errorln("BUG: sdk ID differs: %v != %v", sdkID, s.sdk.ID)
+ s.Log.Errorf("BUG: sdk ID differs: %v != %v", sdkID, s.sdk.ID)
}
s.Log.Infof("Command SDK ID %s [Cmd ID %s] exited: code %d, exitError: %v", sdkID[:16], e.CmdID, code, exitError)
// (see sdks.go / monitorSDKInstallation )
// Update SetupFile when n
if s.sdk.SetupFile == "" {
- sdkDef, err := GetSDKInfo(s.sdk.FamilyConf.ScriptsDir, s.sdk.URL, "", "", s.Log)
+ sdkDef, err := GetSDKInfo(s.sdk.FamilyConf.ScriptsDir, s.sdk.URL, "", "", s.sdk.UUID, s.Log)
if err != nil || sdkDef.SetupFile == "" {
+ s.Log.Errorf("GetSDKInfo error: %v", err)
code = 1
s.sdk.LastError = "Installation failed (cannot init SetupFile path)"
s.sdk.Status = xsapiv1.SdkStatusNotInstalled
s.sdk.Status = xsapiv1.SdkStatusInstalling
s.sdk.LastError = ""
+ if err := s.events.Emit(xsapiv1.EVTSDKStateChange, s.sdk, sess.ID); err != nil {
+ s.Log.Errorf("WS Emit EVTSDKStateChange installing : %v", err)
+ }
+
err := s.installCmd.Start()
return err