Skip to content

Commit

Permalink
Merge branch 'main' into feature/add-daemon-to-restorer
Browse files Browse the repository at this point in the history
  • Loading branch information
jkutner authored Aug 4, 2023
2 parents e84c461 + 2462349 commit ec60f3e
Show file tree
Hide file tree
Showing 15 changed files with 1,297 additions and 300 deletions.
2 changes: 2 additions & 0 deletions acceptance/acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1174,6 +1174,7 @@ func testAcceptance(
"hello_args": helloArgs,
"hello_args_prefix": helloArgsPrefix,
"image_workdir": imageWorkdir,
"rebasable": true,
},
)

Expand Down Expand Up @@ -1884,6 +1885,7 @@ func testAcceptance(
"hello_args": helloArgs,
"hello_args_prefix": helloArgsPrefix,
"image_workdir": imageWorkdir,
"rebasable": true,
},
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"remote_info": null,
"local_info": {
"stack": "pack.test.stack",
"rebasable": false,
"base_image": {
"top_layer": "{{.base_image_top_layer}}",
"reference": "{{.base_image_id}}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ image_name = "{{.image_name}}"

[local_info]
stack = "pack.test.stack"
rebasable = false

[local_info.base_image]
top_layer = "{{.base_image_top_layer}}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ image_name: "{{.image_name}}"
remote_info:
local_info:
stack: pack.test.stack
rebasable: false
base_image:
top_layer: "{{.base_image_top_layer}}"
reference: "{{.base_image_id}}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"local_info": null,
"remote_info": {
"stack": "pack.test.stack",
"rebasable": false,
"base_image": {
"top_layer": "{{.base_image_top_layer}}",
"reference": "{{.base_image_ref}}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ image_name = "{{.image_name}}"

[remote_info]
stack = "pack.test.stack"
rebasable = false

[remote_info.base_image]
top_layer = "{{.base_image_top_layer}}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ image_name: "{{.image_name}}"
local_info: null
remote_info:
stack: pack.test.stack
rebasable: false
base_image:
top_layer: "{{.base_image_top_layer}}"
reference: "{{.base_image_ref}}"
Expand Down
3 changes: 3 additions & 0 deletions internal/inspectimage/info_display.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ type InfoDisplay struct {
Buildpacks []dist.ModuleInfo `json:"buildpacks" yaml:"buildpacks" toml:"buildpacks"`
Extensions []dist.ModuleInfo `json:"extensions" yaml:"extensions" toml:"extensions"`
Processes []ProcessDisplay `json:"processes" yaml:"processes" toml:"processes"`
Rebasable bool `json:"rebasable" yaml:"rebasable" toml:"rebasable"`
}

type InspectOutput struct {
Expand All @@ -66,6 +67,7 @@ func NewInfoDisplay(info *client.ImageInfo, generalInfo GeneralInfo) *InfoDispla
Buildpacks: displayBuildpacks(info.Buildpacks),
Extensions: displayExtensions(info.Extensions),
Processes: displayProcesses(info.Processes),
Rebasable: info.Rebasable,
}
}
return &InfoDisplay{
Expand All @@ -74,6 +76,7 @@ func NewInfoDisplay(info *client.ImageInfo, generalInfo GeneralInfo) *InfoDispla
RunImageMirrors: displayMirrors(info, generalInfo),
Buildpacks: displayBuildpacks(info.Buildpacks),
Processes: displayProcesses(info.Processes),
Rebasable: info.Rebasable,
}
}

Expand Down
124 changes: 88 additions & 36 deletions internal/inspectimage/writer/human_readable.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,67 +30,110 @@ func (h *HumanReadable) Print(
if local == nil && remote == nil {
return fmt.Errorf("unable to find image '%s' locally or remotely", generalInfo.Name)
}
localDisplay := inspectimage.NewInfoDisplay(local, generalInfo)
remoteDisplay := inspectimage.NewInfoDisplay(remote, generalInfo)

logger.Infof("Inspecting image: %s\n", style.Symbol(generalInfo.Name))

logger.Info("\nREMOTE:\n")
err := writeImageInfo(logger, remoteDisplay, remoteErr)
if err != nil {
return fmt.Errorf("writing remote builder info: %w", err)
if err := writeRemoteImageInfo(logger, generalInfo, remote, remoteErr); err != nil {
return err
}
logger.Info("\nLOCAL:\n")
err = writeImageInfo(logger, localDisplay, localErr)
if err != nil {
return fmt.Errorf("writing local builder info: %w", err)

if err := writeLocalImageInfo(logger, generalInfo, local, localErr); err != nil {
return err
}

return nil
}

func writeImageInfo(
func writeLocalImageInfo(
logger logging.Logger,
info *inspectimage.InfoDisplay,
err error,
) error {
imgTpl := template.Must(template.New("runImages").
Funcs(template.FuncMap{"StringsJoin": strings.Join}).
Funcs(template.FuncMap{"StringsValueOrDefault": strs.ValueOrDefault}).
Parse(runImagesTemplate))
imgTpl = template.Must(imgTpl.New("buildpacks").
Parse(buildpacksTemplate))
if info != nil && info.Extensions != nil {
imgTpl = template.Must(imgTpl.New("extensions").Parse(extensionsTemplate))
generalInfo inspectimage.GeneralInfo,
local *client.ImageInfo,
localErr error) error {
logger.Info("\nLOCAL:\n")

if localErr != nil {
logger.Errorf("%s\n", localErr)
return nil
}
imgTpl = template.Must(imgTpl.New("processes").
Parse(processesTemplate))
if info != nil && info.Extensions != nil {
imgTpl = template.Must(imgTpl.New("image").
Parse(imageWithExtensionTemplate))
} else {
imgTpl = template.Must(imgTpl.New("image").
Parse(imageTemplate))

localDisplay := inspectimage.NewInfoDisplay(local, generalInfo)
if localDisplay == nil {
logger.Info("(not present)\n")
return nil
}

err := writeImageInfo(logger, localDisplay)
if err != nil {
logger.Errorf("%s\n", err)
return fmt.Errorf("writing local builder info: %w", err)
}

return nil
}

func writeRemoteImageInfo(
logger logging.Logger,
generalInfo inspectimage.GeneralInfo,
remote *client.ImageInfo,
remoteErr error) error {
logger.Info("\nREMOTE:\n")

if remoteErr != nil {
logger.Errorf("%s\n", remoteErr)
return nil
}

if info == nil {
remoteDisplay := inspectimage.NewInfoDisplay(remote, generalInfo)
if remoteDisplay == nil {
logger.Info("(not present)\n")
return nil
}
remoteOutput, err := inspectImageOutput(info, imgTpl)

err := writeImageInfo(logger, remoteDisplay)
if err != nil {
return fmt.Errorf("writing remote builder info: %w", err)
}

return nil
}

func writeImageInfo(
logger logging.Logger,
info *inspectimage.InfoDisplay,
) error {
imgTpl := getImageTemplate(info)
remoteOutput, err := getInspectImageOutput(imgTpl, info)
if err != nil {
logger.Error(err.Error())
return err
} else {
logger.Info(remoteOutput.String())
return nil
}
return nil
}

func inspectImageOutput(info *inspectimage.InfoDisplay, tpl *template.Template) (*bytes.Buffer, error) {
func getImageTemplate(info *inspectimage.InfoDisplay) *template.Template {
imgTpl := template.Must(template.New("runImages").
Funcs(template.FuncMap{"StringsJoin": strings.Join}).
Funcs(template.FuncMap{"StringsValueOrDefault": strs.ValueOrDefault}).
Parse(runImagesTemplate))
imgTpl = template.Must(imgTpl.New("buildpacks").Parse(buildpacksTemplate))

imgTpl = template.Must(imgTpl.New("processes").Parse(processesTemplate))

imgTpl = template.Must(imgTpl.New("rebasable").Parse(rebasableTemplate))

if info != nil && info.Extensions != nil {
imgTpl = template.Must(imgTpl.New("extensions").Parse(extensionsTemplate))
imgTpl = template.Must(imgTpl.New("image").Parse(imageWithExtensionTemplate))
} else {
imgTpl = template.Must(imgTpl.New("image").Parse(imageTemplate))
}
return imgTpl
}

func getInspectImageOutput(
tpl *template.Template,
info *inspectimage.InfoDisplay) (*bytes.Buffer, error) {
if info == nil {
return bytes.NewBuffer([]byte("(not present)")), nil
}
Expand Down Expand Up @@ -158,6 +201,13 @@ Processes:
{{- end }}
{{- end }}`

var rebasableTemplate = `
Rebasable:
{{- if or .Info.Rebasable (eq .Info.Rebasable true) }} true
{{- else }} false
{{- end }}`

var imageTemplate = `
Stack: {{ .Info.StackID }}
Expand All @@ -167,6 +217,7 @@ Base Image:
{{- end}}
Top Layer: {{ .Info.Base.TopLayer }}
{{ template "runImages" . }}
{{- template "rebasable" . }}
{{ template "buildpacks" . }}{{ template "processes" . }}`

var imageWithExtensionTemplate = `
Expand All @@ -178,6 +229,7 @@ Base Image:
{{- end}}
Top Layer: {{ .Info.Base.TopLayer }}
{{ template "runImages" . }}
{{- template "rebasable" . }}
{{ template "buildpacks" . }}
{{ template "extensions" . }}
{{ template "extensions" . -}}
{{ template "processes" . }}`
Loading

0 comments on commit ec60f3e

Please sign in to comment.