// Execute fetches the expansions from the API server func (incCmd *IncCommand) Execute(pluginLogger plugin.Logger, pluginCom plugin.PluginCommunicator, conf *model.TaskConfig, stop chan bool) error { err := plugin.ExpandValues(incCmd, conf.Expansions) if err != nil { return err } keyVal := &KeyVal{} resp, err := pluginCom.TaskPostJSON(IncRoute, incCmd.Key) if err != nil { return err } if resp == nil { return fmt.Errorf("received nil response from inc API call") } else { defer resp.Body.Close() } if resp.StatusCode != http.StatusOK { return fmt.Errorf("unexpected status code: %v", resp.StatusCode) } err = util.ReadJSONInto(resp.Body, keyVal) if err != nil { return fmt.Errorf("Failed to read JSON reply: %v", err) } conf.Expansions.Put(incCmd.Destination, fmt.Sprintf("%d", keyVal.Value)) return nil }
func (jsc *JSONSendCommand) Execute(log plugin.Logger, com plugin.PluginCommunicator, conf *model.TaskConfig, stop chan bool) error { if jsc.File == "" { return fmt.Errorf("'file' param must not be blank") } if jsc.DataName == "" { return fmt.Errorf("'name' param must not be blank") } errChan := make(chan error) go func() { // attempt to open the file fileLoc := filepath.Join(conf.WorkDir, jsc.File) jsonFile, err := os.Open(fileLoc) if err != nil { errChan <- fmt.Errorf("Couldn't open json file: '%v'", err) return } jsonData := map[string]interface{}{} err = util.ReadJSONInto(jsonFile, &jsonData) if err != nil { errChan <- fmt.Errorf("File contained invalid json: %v", err) return } retriablePost := util.RetriableFunc( func() error { log.LogTask(slogger.INFO, "Posting JSON") resp, err := com.TaskPostJSON(fmt.Sprintf("data/%v", jsc.DataName), jsonData) if resp != nil { defer resp.Body.Close() } if err != nil { return util.RetriableError{err} } if resp.StatusCode != http.StatusOK { return util.RetriableError{fmt.Errorf("unexpected status code %v", resp.StatusCode)} } return nil }, ) _, err = util.Retry(retriablePost, 10, 3*time.Second) errChan <- err }() select { case err := <-errChan: if err != nil { log.LogTask(slogger.ERROR, "Sending json data failed: %v", err) } return err case <-stop: log.LogExecution(slogger.INFO, "Received abort signal, stopping.") return nil } }
// S3Copy is responsible for carrying out the core of the S3CopyPlugin's // function - it makes an API calls to copy a given staged file to it's final // production destination func (scc *S3CopyCommand) S3Copy(taskConfig *model.TaskConfig, pluginLogger plugin.Logger, pluginCom plugin.PluginCommunicator) error { for _, s3CopyFile := range scc.S3CopyFiles { if len(s3CopyFile.BuildVariants) > 0 && !util.SliceContains( s3CopyFile.BuildVariants, taskConfig.BuildVariant.Name) { continue } pluginLogger.LogExecution(slogger.INFO, "Making API push copy call to "+ "transfer %v/%v => %v/%v", s3CopyFile.Source.Bucket, s3CopyFile.Source.Path, s3CopyFile.Destination.Bucket, s3CopyFile.Destination.Path) s3CopyReq := S3CopyRequest{ AwsKey: scc.AwsKey, AwsSecret: scc.AwsSecret, S3SourceBucket: s3CopyFile.Source.Bucket, S3SourcePath: s3CopyFile.Source.Path, S3DestinationBucket: s3CopyFile.Destination.Bucket, S3DestinationPath: s3CopyFile.Destination.Path, S3DisplayName: s3CopyFile.DisplayName, } resp, err := pluginCom.TaskPostJSON(s3CopyAPIEndpoint, s3CopyReq) if resp != nil { defer resp.Body.Close() } if resp != nil && resp.StatusCode != http.StatusOK { body, _ := ioutil.ReadAll(resp.Body) return fmt.Errorf("S3 push copy failed (%v): %v", resp.StatusCode, string(body)) } if err != nil { body, _ := ioutil.ReadAll(resp.Body) return fmt.Errorf("S3 push copy failed (%v): %v", resp.StatusCode, string(body)) } pluginLogger.LogExecution(slogger.INFO, "API push copy call succeeded") err = scc.AttachTaskFiles(pluginLogger, pluginCom, s3CopyReq) if err != nil { body, readAllErr := ioutil.ReadAll(resp.Body) if readAllErr != nil { return fmt.Errorf("Error: %v", err) } return fmt.Errorf("Error: %v, (%v): %v", resp.StatusCode, err, string(body)) } } return nil }
// SendJSONResults is responsible for sending the // specified file to the API Server func (self *AttachTaskFilesCommand) SendTaskFiles(taskConfig *model.TaskConfig, pluginLogger plugin.Logger, pluginCom plugin.PluginCommunicator) error { // log each file attachment for name, link := range self.Files { pluginLogger.LogTask(slogger.INFO, "Attaching file: %v -> %v", name, link) } retriableSendFile := util.RetriableFunc( func() error { resp, err := pluginCom.TaskPostJSON( AttachTaskFilesAPIEndpoint, self.Files.Array(), ) if resp != nil { defer resp.Body.Close() } if resp != nil && resp.StatusCode == http.StatusConflict { body, _ := ioutil.ReadAll(resp.Body) msg := fmt.Sprintf( "secret conflict while posting task files: %v", string(body)) pluginLogger.LogTask(slogger.ERROR, msg) return fmt.Errorf(msg) } if resp != nil && resp.StatusCode == http.StatusBadRequest { body, _ := ioutil.ReadAll(resp.Body) msg := fmt.Sprintf( "error posting task files (%v): %v", resp.StatusCode, string(body)) pluginLogger.LogTask(slogger.ERROR, msg) return fmt.Errorf(msg) } if resp != nil && resp.StatusCode != http.StatusOK { body, _ := ioutil.ReadAll(resp.Body) msg := fmt.Sprintf("error posting task files (%v): %v", resp.StatusCode, string(body)) pluginLogger.LogExecution(slogger.WARN, msg) return util.RetriableError{err} } if err != nil { msg := fmt.Sprintf("error posting files: %v", err) pluginLogger.LogExecution(slogger.WARN, msg) return util.RetriableError{fmt.Errorf(msg)} } return nil }, ) retryFail, err := util.Retry(retriableSendFile, AttachResultsPostRetries, AttachResultsRetrySleepSec) if retryFail { return fmt.Errorf("Attach files failed after %v tries: %v", AttachResultsPostRetries, err) } if err != nil { return fmt.Errorf("Attach files failed: %v", err) } pluginLogger.LogExecution(slogger.INFO, "API attach files call succeeded") return nil }