From a93832c2e3058c55e183c487dde595bd42238bb0 Mon Sep 17 00:00:00 2001
From: Sebastien Douheret <sebastien.douheret@iot.bzh>
Date: Wed, 27 Jun 2018 15:52:14 +0200
Subject: Fixed sdk from local file installation

Rework sdk uuid management because previous code prevented to install
local sdk using following command:
 xds-cli sdks install --file $HOME/xds-workspace/my_local_sdk.sh

Change-Id: I20bac8a76d32b005a6775e936756c96048651766
Signed-off-by: Sebastien Douheret <sebastien.douheret@iot.bzh>
---
 lib/xdsserver/sdk.go          | 7 +++++--
 lib/xdsserver/sdks.go         | 4 ++--
 lib/xsapiv1/sdks.go           | 1 +
 scripts/sdks/README.md        | 2 ++
 scripts/sdks/agl/add          | 2 ++
 scripts/sdks/agl/db-dump      | 9 +++++++--
 scripts/sdks/agl/get-sdk-info | 3 +++
 7 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/lib/xdsserver/sdk.go b/lib/xdsserver/sdk.go
index 7c912c4..68c92b4 100644
--- a/lib/xdsserver/sdk.go
+++ b/lib/xdsserver/sdk.go
@@ -92,7 +92,7 @@ func ListCrossSDK(scriptDir string, update bool, log *logrus.Logger) ([]xsapiv1.
 }
 
 // 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{}
@@ -106,6 +106,9 @@ func GetSDKInfo(scriptDir, url, filename, md5sum string, log *logrus.Logger) (xs
 	} 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()
@@ -327,7 +330,7 @@ func (s *CrossSDK) Install(file string, force bool, timeout int, args []string,
 			// (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
diff --git a/lib/xdsserver/sdks.go b/lib/xdsserver/sdks.go
index 4a7ba84..ee6a269 100644
--- a/lib/xdsserver/sdks.go
+++ b/lib/xdsserver/sdks.go
@@ -340,7 +340,7 @@ func (s *SDKs) Install(id, filepath string, force bool, timeout int, args []stri
 
 		// Update path when not set
 		if sdk.Path == "" {
-			sdkDef, err := GetSDKInfo(scriptDir, sdk.URL, "", "", s.Log)
+			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)
 			}
@@ -356,7 +356,7 @@ func (s *SDKs) Install(id, filepath string, force bool, timeout int, args []stri
 		}
 
 		for _, sf := range s.SdksFamilies {
-			sdkDef, err := GetSDKInfo(sf.ScriptsDir, "", sdkFilename, "", s.Log)
+			sdkDef, err := GetSDKInfo(sf.ScriptsDir, "", sdkFilename, "", "", s.Log)
 			if err == nil {
 				// OK, sdk found
 				sdk = &sdkDef
diff --git a/lib/xsapiv1/sdks.go b/lib/xsapiv1/sdks.go
index abb5d4a..54b941b 100644
--- a/lib/xsapiv1/sdks.go
+++ b/lib/xsapiv1/sdks.go
@@ -30,6 +30,7 @@ const (
 type SDK struct {
 	ID          string `json:"id" binding:"required"`
 	Name        string `json:"name"`
+	UUID        string `json:"uuid"`
 	Description string `json:"description"`
 	Profile     string `json:"profile"`
 	Version     string `json:"version"`
diff --git a/scripts/sdks/README.md b/scripts/sdks/README.md
index 97bae21..c887293 100644
--- a/scripts/sdks/README.md
+++ b/scripts/sdks/README.md
@@ -35,6 +35,7 @@ Returned the list all SDKs (available and installed) using JSON format.
 [
   {
     "name":         "My SDK name",
+    "uuid":         "a-unique-id",
     "description":  "A description",
     "profile":      "profile",
     "version":      "version",
@@ -102,6 +103,7 @@ returned the following JSON structure:
 ```json
 {
     "name":         "My SDK name",
+    "uuid":         "a-unique-id",
     "description":  "A description",
     "profile":      "profile",
     "version":      "version",
diff --git a/scripts/sdks/agl/add b/scripts/sdks/agl/add
index 839d647..f602fa9 100755
--- a/scripts/sdks/agl/add
+++ b/scripts/sdks/agl/add
@@ -93,6 +93,8 @@ fi
 # Compute uuid when needed
 if [ "$UUID" = "" ] && [ "$URL" != "" ]; then
     UUID=$(echo "$URL" | md5sum |cut -d' ' -f1)
+elif [ "$SDK_FILE" != "" ]; then
+    UUID=$(echo $(basename $SDK_FILE) | md5sum |cut -d' ' -f1)
 else
     echo "UUID value must be specify using --uuid option."
     exit 1
diff --git a/scripts/sdks/agl/db-dump b/scripts/sdks/agl/db-dump
index 027fdcf..ec2b1d8 100755
--- a/scripts/sdks/agl/db-dump
+++ b/scripts/sdks/agl/db-dump
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 #
-#/**************************************************************************
+# /**************************************************************************
 # * Copyright 2017-2018 IoT.bzh
 # *
 # * author: Romain Forlot <romain.forlot@iot.bzh>
@@ -46,7 +46,7 @@ SCRIPT_PATH = os.path.dirname(os.path.abspath(
 ENV = subprocess.check_output(
     [os.path.join(SCRIPT_PATH, './_env-init.sh'), '-print']).splitlines()
 
-SDK_ROOT_DIR=None
+SDK_ROOT_DIR = None
 for elt in ENV:
     k, v = elt.decode().split('=', 1)
     if k == 'SDK_ROOT_DIR':
@@ -71,6 +71,7 @@ SDK_DB_JSON = json.load(open(SDK_DB_FILEPATH, 'r'))
 
 for one_sdk in SDK_DB_JSON:
     one_sdk['status'] = 'Not Installed'
+    one_sdk['uuid'] = ''
 
 INSTALLED_SDK = []
 for root, dirs, files in os.walk(SDK_ROOT_DIR):
@@ -106,6 +107,8 @@ for one_sdk in INSTALLED_SDK:
         logging.debug('Path not compliant, skipping')
         continue
 
+    UUID = os.path.basename(os.path.normpath(DIR))
+
     SDK_DATE = ''
     for line in open(one_sdk['VERSION_FILE']).readlines():
         if line.startswith('Timestamp'):
@@ -126,6 +129,7 @@ for one_sdk in INSTALLED_SDK:
             sdk['date'] = SDK_DATE
             sdk['setupFile'] = one_sdk['ENV_FILE']
             sdk['path'] = DIR
+            sdk['uuid'] = UUID
             break
 
     if not found:
@@ -133,6 +137,7 @@ for one_sdk in INSTALLED_SDK:
                       PROFILE + '-' + ARCH + '-' + VERSION)
         NEW_SDK = {
             'name': PROFILE + '-' + ARCH + '-' + VERSION,
+            'uuid': UUID,
             'description': 'AGL SDK ' + ARCH + ' (version ' + VERSION + ')',
             'profile': PROFILE,
             'version': VERSION,
diff --git a/scripts/sdks/agl/get-sdk-info b/scripts/sdks/agl/get-sdk-info
index c28f2e4..485d5fe 100755
--- a/scripts/sdks/agl/get-sdk-info
+++ b/scripts/sdks/agl/get-sdk-info
@@ -131,6 +131,8 @@ if [ "${UUID}" = "" ]; then
         UUID="basename ${curInstDir}"
     elif [ "$URL" != "" ]; then
         UUID=$(echo "$URL" | md5sum |cut -d' ' -f1)
+    elif [ "$filename" != "" ]; then
+        UUID=$(echo $(basename $filename) | md5sum |cut -d' ' -f1)
     else
         echo "UUID value must be specify using --uuid option."
         exit 1
@@ -147,6 +149,7 @@ fi
 read -r -d '' res <<- EndOfMessage
 {
     "name":         "${profile}_${arch}_${version}",
+    "uuid":         "${UUID}",
     "description":  "AGL SDK ${arch} (version ${version})",
     "profile":      "${profile}",
     "version":      "${version}",
-- 
cgit