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
}