155 lines
5.1 KiB
Go
155 lines
5.1 KiB
Go
package app
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
|
|
"gitea.maximumdirect.net/eric/distributor/internal/config"
|
|
"gitea.maximumdirect.net/eric/distributor/internal/publish"
|
|
"gitea.maximumdirect.net/eric/distributor/internal/storage"
|
|
)
|
|
|
|
func writePlanLine(w io.Writer, backend string, plan publish.Plan, planErr error) {
|
|
if w == nil {
|
|
return
|
|
}
|
|
if planErr != nil {
|
|
destinationID := plan.DestinationID
|
|
if destinationID == "" {
|
|
destinationID = "unknown"
|
|
}
|
|
fmt.Fprintf(w, " - bundle=%s destination=%s backend=%s%s action=error reason=%q\n", storage.DisplayPath(plan.BundlePath), destinationID, backend, pathMappingSummary(plan), planErr.Error())
|
|
return
|
|
}
|
|
fmt.Fprintf(w, " - bundle=%s destination=%s backend=%s%s action=%s outputs=%s reason=%q\n", storage.DisplayPath(plan.BundlePath), plan.DestinationID, backend, pathMappingSummary(plan), plan.Action, outputSummary(plan.Outputs), plan.Reason)
|
|
}
|
|
|
|
func pathMappingSummary(plan publish.Plan) string {
|
|
if plan.PathMapping != config.PathMappingFixed {
|
|
return ""
|
|
}
|
|
return fmt.Sprintf(" path_mapping=fixed target=%s", storage.DisplayPath(plan.DestinationBundlePath))
|
|
}
|
|
|
|
func writeErrorLine(w io.Writer, bundlePath, destinationID, backend string, err error) {
|
|
if w == nil {
|
|
return
|
|
}
|
|
fmt.Fprintf(w, " - bundle=%s destination=%s backend=%s action=error reason=%q\n", storage.DisplayPath(bundlePath), destinationID, backend, err.Error())
|
|
}
|
|
|
|
func outputSummary(outputs []publish.Output) string {
|
|
if len(outputs) == 0 {
|
|
return "none"
|
|
}
|
|
paths := make([]string, 0, len(outputs))
|
|
for _, output := range outputs {
|
|
paths = append(paths, output.DestinationPath)
|
|
}
|
|
return strings.Join(paths, ",")
|
|
}
|
|
|
|
type runResult struct {
|
|
DryRun bool `json:"dry_run"`
|
|
Pipelines []runPipelineResult `json:"pipelines"`
|
|
Actions []runActionResult `json:"actions"`
|
|
Summary runSummaryResult `json:"summary"`
|
|
}
|
|
|
|
type runPipelineResult struct {
|
|
ID string `json:"id"`
|
|
SourceBackend string `json:"source_backend"`
|
|
BundleCount int `json:"bundle_count"`
|
|
Destinations []string `json:"destinations"`
|
|
}
|
|
|
|
type runActionResult struct {
|
|
PipelineID string `json:"pipeline_id,omitempty"`
|
|
DestinationID string `json:"destination_id"`
|
|
Backend string `json:"backend"`
|
|
BundleID string `json:"bundle_id,omitempty"`
|
|
BundlePath string `json:"bundle_path"`
|
|
DestinationPath string `json:"destination_path"`
|
|
PathMapping string `json:"path_mapping,omitempty"`
|
|
Action string `json:"action"`
|
|
PrimaryURL string `json:"primary_url,omitempty"`
|
|
Reason string `json:"reason,omitempty"`
|
|
Outputs []runOutputResult `json:"outputs"`
|
|
}
|
|
|
|
type runOutputResult struct {
|
|
Path string `json:"path"`
|
|
Kind string `json:"kind"`
|
|
SourcePath string `json:"source_path,omitempty"`
|
|
Transform string `json:"transform,omitempty"`
|
|
URL string `json:"url,omitempty"`
|
|
SHA256 string `json:"sha256"`
|
|
Size int64 `json:"size"`
|
|
}
|
|
|
|
func runActionFromPlan(backend string, plan publish.Plan, planErr error) runActionResult {
|
|
if planErr != nil {
|
|
destinationID := plan.DestinationID
|
|
if destinationID == "" {
|
|
destinationID = "unknown"
|
|
}
|
|
return runActionResult{
|
|
PipelineID: plan.PipelineID,
|
|
DestinationID: destinationID,
|
|
Backend: backend,
|
|
BundleID: plan.BundleID,
|
|
BundlePath: storage.DisplayPath(plan.BundlePath),
|
|
DestinationPath: storage.DisplayPath(plan.DestinationBundlePath),
|
|
PathMapping: plan.PathMapping,
|
|
Action: "error",
|
|
PrimaryURL: plan.PrimaryURL,
|
|
Reason: planErr.Error(),
|
|
Outputs: []runOutputResult{},
|
|
}
|
|
}
|
|
return runActionResult{
|
|
PipelineID: plan.PipelineID,
|
|
DestinationID: plan.DestinationID,
|
|
Backend: backend,
|
|
BundleID: plan.BundleID,
|
|
BundlePath: storage.DisplayPath(plan.BundlePath),
|
|
DestinationPath: storage.DisplayPath(plan.DestinationBundlePath),
|
|
PathMapping: plan.PathMapping,
|
|
Action: string(plan.Action),
|
|
PrimaryURL: plan.PrimaryURL,
|
|
Reason: plan.Reason,
|
|
Outputs: runOutputsFromPlan(plan.Outputs),
|
|
}
|
|
}
|
|
|
|
func errorAction(pipelineID, destinationID, backend, bundlePath string, err error) runActionResult {
|
|
return runActionResult{
|
|
PipelineID: pipelineID,
|
|
DestinationID: destinationID,
|
|
Backend: backend,
|
|
BundlePath: storage.DisplayPath(bundlePath),
|
|
DestinationPath: storage.DisplayPath(bundlePath),
|
|
Action: "error",
|
|
Reason: err.Error(),
|
|
Outputs: []runOutputResult{},
|
|
}
|
|
}
|
|
|
|
func runOutputsFromPlan(outputs []publish.Output) []runOutputResult {
|
|
results := make([]runOutputResult, 0, len(outputs))
|
|
for _, output := range outputs {
|
|
stateOutput := output.StateOutputFile()
|
|
results = append(results, runOutputResult{
|
|
Path: stateOutput.Path,
|
|
Kind: stateOutput.Kind,
|
|
SourcePath: stateOutput.SourcePath,
|
|
Transform: stateOutput.Transform,
|
|
URL: stateOutput.URL,
|
|
SHA256: stateOutput.SHA256,
|
|
Size: stateOutput.Size,
|
|
})
|
|
}
|
|
return results
|
|
}
|