+
+// Install Used to install a new SDK
+func (s *SDKs) Install(id, filepath string, force bool, timeout int, args []string, sess *ClientSession) (*xsapiv1.SDK, error) {
+
+ var sdk *xsapiv1.SDK
+ var err error
+ scriptDir := ""
+ sdkFilename := ""
+
+ if id != "" && filepath != "" {
+ return nil, fmt.Errorf("invalid parameter, both id and filepath are set")
+ }
+
+ s.mutex.Lock()
+ defer s.mutex.Unlock()
+
+ if id != "" {
+ curSdk, exist := s.Sdks[id]
+ if !exist {
+ return nil, fmt.Errorf("unknown id")
+ }
+
+ sdk = &curSdk.sdk
+ scriptDir = sdk.FamilyConf.ScriptsDir
+
+ // Update path when not set
+ if sdk.Path == "" {
+ sdkDef, err := GetSDKInfo(scriptDir, sdk.URL, "", "", sdk.UUID, s.Log)
+ if err != nil || sdkDef.Path == "" {
+ return nil, fmt.Errorf("cannot retrieve sdk path %v", err)
+ }
+ sdk.Path = sdkDef.Path
+ }
+
+ } else if filepath != "" {
+ // FIXME support any location and also sharing either by pathmap or Syncthing
+
+ baseDir := path.Join(xdsconfig.WorkspaceRootDir(), "sdks")
+ sdkFilename, _ = common.ResolveEnvVar(path.Join(baseDir, path.Base(filepath)))
+ if !common.Exists(sdkFilename) {
+ return nil, fmt.Errorf("SDK file not accessible, must be in %s", baseDir)
+ }
+
+ for _, sf := range s.SdksFamilies {
+ sdkDef, err := GetSDKInfo(sf.ScriptsDir, "", sdkFilename, "", "", s.Log)
+ if err == nil {
+ // OK, sdk found
+ sdk = &sdkDef
+ scriptDir = sf.ScriptsDir
+ break
+ }
+
+ s.Log.Debugf("GetSDKInfo error: family=%s, sdkFilename=%s, err=%v", sf.FamilyName, path.Base(sdkFilename), err)
+ }
+ if sdk == nil {
+ return nil, fmt.Errorf("Cannot identify SDK family for %s", path.Base(filepath))
+ }
+
+ } else {
+ return nil, fmt.Errorf("invalid parameter, id or filepath must be set")
+ }
+
+ cSdk, err := s._createNewCrossSDK(*sdk, scriptDir, true, force)
+ if err != nil {
+ return nil, err
+ }
+
+ // Launch script to install
+ // (note that add event will be generated by monitoring thread)
+ if err := cSdk.Install(sdkFilename, force, timeout, args, sess); err != nil {
+ return &cSdk.sdk, err
+ }
+
+ return &cSdk.sdk, nil
+}
+
+// AbortInstall Used to abort SDK installation
+func (s *SDKs) AbortInstall(id string, timeout int) (*xsapiv1.SDK, error) {
+
+ if id == "" {
+ return nil, fmt.Errorf("invalid parameter")
+ }
+ cSdk, exist := s.Sdks[id]
+ if !exist {
+ return nil, fmt.Errorf("unknown id")
+ }
+
+ s.mutex.Lock()
+ defer s.mutex.Unlock()
+
+ err := cSdk.AbortInstallRemove(timeout)
+
+ return &cSdk.sdk, err
+}
+
+// Remove Used to uninstall a SDK
+func (s *SDKs) Remove(id string, timeout int, sess *ClientSession) (*xsapiv1.SDK, error) {
+
+ cSdk, exist := s.Sdks[id]
+ if !exist {
+ return nil, fmt.Errorf("unknown id")
+ }
+
+ s.mutex.Lock()
+ defer s.mutex.Unlock()
+
+ // Launch script to remove/uninstall
+ // (note that remove event will be generated by monitoring thread)
+ if err := cSdk.Remove(timeout, sess); err != nil {
+ return &cSdk.sdk, err
+ }
+
+ sdk := cSdk.sdk
+
+ // Don't delete it from s.Sdks
+ // (always keep sdk reference to allow for example re-install)
+
+ return &sdk, nil
+}