github.com/criteo/command-launcher@v0.0.0-20230407142452-fb616f546e98/internal/repository/default-pkg-repository.go (about) 1 package repository 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 8 "github.com/criteo/command-launcher/internal/command" 9 log "github.com/sirupsen/logrus" 10 ) 11 12 const ( 13 FILE_REGISTRY = "repoIndex.json" 14 ) 15 16 type defaultPackageRepository struct { 17 ID string 18 RepoDir string 19 repoIndex RepoIndex 20 } 21 22 func newDefaultPackageRepository(id string, repoDirname string, index RepoIndex) *defaultPackageRepository { 23 return &defaultPackageRepository{ 24 ID: id, 25 RepoDir: repoDirname, 26 repoIndex: index, 27 } 28 } 29 30 func (repo *defaultPackageRepository) load() error { 31 _, err := os.Stat(repo.RepoDir) 32 if os.IsNotExist(err) { 33 err := os.MkdirAll(repo.RepoDir, 0755) 34 if err != nil { 35 return fmt.Errorf("cannot create the repo folder (%v)", err) 36 } 37 } 38 39 if err = repo.repoIndex.Load(repo.RepoDir); err != nil { 40 return fmt.Errorf("cannot load the packages: %v", err) 41 } 42 43 log.Debugf("Commands loaded: %v", func() []string { 44 names := []string{} 45 for _, cmd := range repo.repoIndex.AllCommands() { 46 name := fmt.Sprintf("%s.%s", cmd.Group(), cmd.Name()) 47 names = append(names, name) 48 } 49 return names 50 }()) 51 52 return nil 53 } 54 55 func (repo defaultPackageRepository) Name() string { 56 return repo.ID 57 } 58 59 func (repo *defaultPackageRepository) Install(pkg command.Package) error { 60 if pkg.Name() == "" { 61 return fmt.Errorf("invalid package manifest: empty package name, please make sure manifest.mf contains a 'pkgName'") 62 } 63 64 pkgDir := filepath.Join(repo.RepoDir, pkg.Name()) 65 err := os.MkdirAll(pkgDir, 0755) 66 if err != nil { 67 return fmt.Errorf("cannot create the commmand package folder (%v)", err) 68 } 69 70 _, err = pkg.InstallTo(pkgDir) 71 if err != nil { 72 return fmt.Errorf("cannot install the command package %s: %v", pkg.Name(), err) 73 } 74 75 err = repo.repoIndex.Add(pkg, repo.RepoDir, pkg.Name()) 76 if err != nil { 77 return fmt.Errorf("cannot add the command package %s: %v", pkg.Name(), err) 78 } 79 80 return nil 81 } 82 83 func (repo *defaultPackageRepository) Uninstall(name string) error { 84 err := repo.repoIndex.Remove(name, repo.RepoDir) 85 if err != nil { 86 return fmt.Errorf("cannot remove the command %s: %v", name, err) 87 } 88 89 err = os.RemoveAll(filepath.Join(repo.RepoDir, name)) 90 if err != nil { 91 return fmt.Errorf("cannot remove the command folder %v", err) 92 } 93 94 return nil 95 } 96 97 func (repo *defaultPackageRepository) Update(pkg command.Package) error { 98 err := repo.Uninstall(pkg.Name()) 99 if err != nil { 100 return err 101 } 102 103 return repo.Install(pkg) 104 } 105 106 func (repo *defaultPackageRepository) InstalledPackages() []command.PackageManifest { 107 return repo.repoIndex.AllPackages() 108 } 109 110 func (repo *defaultPackageRepository) InstalledCommands() []command.Command { 111 return repo.repoIndex.AllCommands() 112 } 113 114 func (repo *defaultPackageRepository) InstalledGroupCommands() []command.Command { 115 return repo.repoIndex.GroupCommands() 116 } 117 118 func (repo *defaultPackageRepository) InstalledExecutableCommands() []command.Command { 119 return repo.repoIndex.ExecutableCommands() 120 } 121 122 func (repo *defaultPackageRepository) InstalledSystemCommands() SystemCommands { 123 return SystemCommands{ 124 Login: repo.repoIndex.SystemLoginCommand(), 125 Metrics: repo.repoIndex.SystemMetricsCommand(), 126 } 127 } 128 129 func (repo *defaultPackageRepository) Package(name string) (command.PackageManifest, error) { 130 return repo.repoIndex.Package(name) 131 } 132 133 func (repo *defaultPackageRepository) Command(pkg string, group string, name string) (command.Command, error) { 134 cmd, err := repo.repoIndex.Command(pkg, group, name) 135 if err != nil { 136 return nil, fmt.Errorf("cannot find the command %s", name) 137 } 138 return cmd, nil 139 } 140 141 func (repo *defaultPackageRepository) RepositoryFolder() (string, error) { 142 return repo.RepoDir, nil 143 }