github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/pkg/packager/mirror.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // SPDX-FileCopyrightText: 2021-Present The Jackal Authors
     3  
     4  // Package packager contains functions for interacting with, managing and deploying Jackal packages.
     5  package packager
     6  
     7  import (
     8  	"fmt"
     9  	"runtime"
    10  	"strings"
    11  
    12  	"github.com/Racer159/jackal/src/config"
    13  	"github.com/Racer159/jackal/src/pkg/message"
    14  	"github.com/Racer159/jackal/src/pkg/packager/filters"
    15  	"github.com/Racer159/jackal/src/types"
    16  )
    17  
    18  // Mirror pulls resources from a package (images, git repositories, etc) and pushes them to remotes in the air gap without deploying them
    19  func (p *Packager) Mirror() (err error) {
    20  	filter := filters.Combine(
    21  		filters.ByLocalOS(runtime.GOOS),
    22  		filters.BySelectState(p.cfg.PkgOpts.OptionalComponents),
    23  	)
    24  
    25  	p.cfg.Pkg, p.warnings, err = p.source.LoadPackage(p.layout, filter, true)
    26  	if err != nil {
    27  		return fmt.Errorf("unable to load the package: %w", err)
    28  	}
    29  
    30  	var sbomWarnings []string
    31  	p.sbomViewFiles, sbomWarnings, err = p.layout.SBOMs.StageSBOMViewFiles()
    32  	if err != nil {
    33  		return err
    34  	}
    35  
    36  	p.warnings = append(p.warnings, sbomWarnings...)
    37  
    38  	// Confirm the overall package mirror
    39  	if !p.confirmAction(config.JackalMirrorStage) {
    40  		return fmt.Errorf("mirror cancelled")
    41  	}
    42  
    43  	p.cfg.State = &types.JackalState{
    44  		RegistryInfo: p.cfg.InitOpts.RegistryInfo,
    45  		GitServer:    p.cfg.InitOpts.GitServer,
    46  	}
    47  
    48  	for _, component := range p.cfg.Pkg.Components {
    49  		if err := p.mirrorComponent(component); err != nil {
    50  			return err
    51  		}
    52  	}
    53  	return nil
    54  }
    55  
    56  // mirrorComponent mirrors a Jackal Component.
    57  func (p *Packager) mirrorComponent(component types.JackalComponent) error {
    58  	componentPaths := p.layout.Components.Dirs[component.Name]
    59  
    60  	// All components now require a name
    61  	message.HeaderInfof("📦 %s COMPONENT", strings.ToUpper(component.Name))
    62  
    63  	hasImages := len(component.Images) > 0
    64  	hasRepos := len(component.Repos) > 0
    65  
    66  	if hasImages {
    67  		if err := p.pushImagesToRegistry(component.Images, p.cfg.MirrorOpts.NoImgChecksum); err != nil {
    68  			return fmt.Errorf("unable to push images to the registry: %w", err)
    69  		}
    70  	}
    71  
    72  	if hasRepos {
    73  		if err := p.pushReposToRepository(componentPaths.Repos, component.Repos); err != nil {
    74  			return fmt.Errorf("unable to push the repos to the repository: %w", err)
    75  		}
    76  	}
    77  
    78  	return nil
    79  }