func sdkInstall()

in commands/sdk.go [154:249]


func sdkInstall(componentName string) error {
	targetFile := sdkMap[componentName].FileName
	if _, err := os.Stat(targetFile); err == nil {
		whisk.Debug(whisk.DbgError, "os.Stat reports file '%s' exists\n", targetFile)
		errStr := wski18n.T("The file '{{.name}}' already exists.  Delete it and retry.",
			map[string]interface{}{"name": targetFile})
		werr := whisk.MakeWskError(errors.New(errStr), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
		return werr
	}

	resp, err := Client.Sdks.Install(sdkMap[componentName].UrlPath)
	if err != nil {
		whisk.Debug(whisk.DbgError, "Client.Sdks.Install(%s) failed: %s\n", sdkMap[componentName].UrlPath, err)
		errStr := wski18n.T("Unable to retrieve '{{.urlpath}}' SDK: {{.err}}",
			map[string]interface{}{"urlpath": sdkMap[componentName].UrlPath, "err": err})
		werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
		return werr
	}

	if resp.Body == nil {
		whisk.Debug(whisk.DbgError, "SDK Install HTTP response has no body\n")
		errStr := wski18n.T("Server failed to send the '{{.component}}' SDK: {{.err}}",
			map[string]interface{}{"name": componentName, "err": err})
		werr := whisk.MakeWskError(errors.New(errStr), whisk.EXIT_CODE_ERR_NETWORK, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
		return werr
	}

	// Create the SDK file
	sdkfile, err := os.Create(targetFile)
	if err != nil {
		whisk.Debug(whisk.DbgError, "os.Create(%s) failure: %s\n", targetFile, err)
		errStr := wski18n.T("Error creating SDK file '{{.name}}': {{.err}}",
			map[string]interface{}{"name": targetFile, "err": err})
		werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
		return werr
	}

	// Read the HTTP response body and write it to the SDK file
	whisk.Debug(whisk.DbgInfo, "Reading SDK file from HTTP response body\n")
	_, err = io.Copy(sdkfile, resp.Body)
	if err != nil {
		whisk.Debug(whisk.DbgError, "io.Copy() of resp.Body into sdkfile failure: %s\n", err)
		errStr := wski18n.T("Error copying server response into file: {{.err}}",
			map[string]interface{}{"err": err})
		werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
		sdkfile.Close()
		return werr

	}
	sdkfile.Close() // Don't use 'defer' since this file might need to be deleted after unpack

	// At this point, the entire file is downloaded from the server
	// Check if there is any special post-download processing (i.e. unpack)
	if sdkMap[componentName].Unpack {
		// Make sure the target directory does not already exist
		defer os.Remove(targetFile)
		targetdir := sdkMap[componentName].UnpackDir
		if _, err = os.Stat(targetdir); err == nil {
			whisk.Debug(whisk.DbgError, "os.Stat reports that directory '%s' exists\n", targetdir)
			errStr := wski18n.T("The directory '{{.name}}' already exists.  Delete it and retry.",
				map[string]interface{}{"name": targetdir})
			werr := whisk.MakeWskError(errors.New(errStr), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
			return werr
		}

		// If the packed SDK is a .tgz file, unpack it in two steps
		// 1. UnGzip into temp .tar file
		// 2. Untar the contents into the current folder
		if sdkMap[componentName].isGzTar {
			whisk.Debug(whisk.DbgInfo, "unGzipping downloaded file\n")
			err := unpackGzip(targetFile, "temp.tar")
			if err != nil {
				whisk.Debug(whisk.DbgError, "unpackGzip(%s,temp.tar) failure: %s\n", targetFile, err)
				errStr := wski18n.T("Error unGzipping file '{{.name}}': {{.err}}",
					map[string]interface{}{"name": targetFile, "err": err})
				werr := whisk.MakeWskError(errors.New(errStr), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
				return werr
			}
			defer os.Remove("temp.tar")

			whisk.Debug(whisk.DbgInfo, "unTarring unGzipped file\n")
			err = unpackTar("temp.tar")
			if err != nil {
				whisk.Debug(whisk.DbgError, "unpackTar(temp.tar) failure: %s\n", err)
				errStr := wski18n.T("Error untarring file '{{.name}}': {{.err}}",
					map[string]interface{}{"name": "temp.tar", "err": err})
				werr := whisk.MakeWskError(errors.New(errStr), whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
				return werr
			}
		}

		// Future SDKs may require other unpacking procedures not yet covered here....
	}

	return nil
}