func uploadTools(config UploadBinariesConfig) error { storage, err := config.State.ToolsStorage() if err != nil { return errors.Trace(err) } defer storage.Close() usedVersions := getUsedToolsVersions(config.Model) toolsUploader := config.GetToolsUploader(config.Target) for toolsVersion := range usedVersions { logger.Debugf("send tools version %s to target", toolsVersion) _, reader, err := storage.Open(toolsVersion.String()) if err != nil { return errors.Trace(err) } defer reader.Close() content, cleanup, err := streamThroughTempFile(reader) if err != nil { return errors.Trace(err) } defer cleanup() // UploadTools encapsulates the HTTP POST necessary to send the tools // to the target API server. if _, err := toolsUploader.UploadTools(content, toolsVersion); err != nil { return errors.Trace(err) } } return nil }
// populateTools stores uploaded tools in provider storage // and updates the tools metadata. func (c *BootstrapCommand) populateTools(st *state.State, env environs.Environ) error { agentConfig := c.CurrentConfig() dataDir := agentConfig.DataDir() current := version.Binary{ Number: version.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } tools, err := agenttools.ReadTools(dataDir, current) if err != nil { return errors.Trace(err) } data, err := ioutil.ReadFile(filepath.Join( agenttools.SharedToolsDir(dataDir, current), "tools.tar.gz", )) if err != nil { return errors.Trace(err) } storage, err := st.ToolsStorage() if err != nil { return errors.Trace(err) } defer storage.Close() var toolsVersions []version.Binary if strings.HasPrefix(tools.URL, "file://") { // Tools were uploaded: clone for each series of the same OS. os, err := series.GetOSFromSeries(tools.Version.Series) if err != nil { return errors.Trace(err) } osSeries := series.OSSupportedSeries(os) for _, series := range osSeries { toolsVersion := tools.Version toolsVersion.Series = series toolsVersions = append(toolsVersions, toolsVersion) } } else { // Tools were downloaded from an external source: don't clone. toolsVersions = []version.Binary{tools.Version} } for _, toolsVersion := range toolsVersions { metadata := toolstorage.Metadata{ Version: toolsVersion, Size: tools.Size, SHA256: tools.SHA256, } logger.Debugf("Adding tools: %v", toolsVersion) if err := storage.AddTools(bytes.NewReader(data), metadata); err != nil { return errors.Trace(err) } } return nil }