2019-11-24 17:28:39 +00:00
// Copyright © 2019 Ettore Di Giacinto <mudler@gentoo.org>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see <http://www.gnu.org/licenses/>.
package cmd
import (
"os"
2021-01-18 16:58:32 +00:00
"path/filepath"
2019-11-24 17:28:39 +00:00
2021-04-12 17:00:36 +00:00
helpers "github.com/mudler/luet/cmd/helpers"
2021-10-20 22:13:02 +00:00
"github.com/mudler/luet/cmd/util"
2020-01-28 16:46:32 +00:00
"github.com/mudler/luet/pkg/compiler"
2021-04-12 17:00:36 +00:00
"github.com/mudler/luet/pkg/compiler/types/compression"
2019-11-24 17:28:39 +00:00
installer "github.com/mudler/luet/pkg/installer"
2021-04-15 10:26:39 +00:00
// . "github.com/mudler/luet/pkg/logger"
2019-11-24 17:28:39 +00:00
pkg "github.com/mudler/luet/pkg/package"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var createrepoCmd = & cobra . Command {
Use : "create-repo" ,
Short : "Create a luet repository from a build" ,
2020-12-02 22:15:23 +00:00
Long : ` Builds tree metadata from a set of packages and a tree definition :
$ luet create - repo
Provide specific paths for packages , tree , and metadata output which is generated :
$ luet create - repo -- packages my / packages / path -- tree my / tree / path -- output my / packages / path ...
Provide name and description of the repository :
$ luet create - repo -- name "foo" -- description "bar" ...
Change compression method :
$ luet create - repo -- tree - compression gzip -- meta - compression gzip
Create a repository from the metadata description defined in the luet . yaml config file :
$ luet create - repo -- repo repository1
` ,
2019-11-25 18:55:30 +00:00
PreRun : func ( cmd * cobra . Command , args [ ] string ) {
viper . BindPFlag ( "packages" , cmd . Flags ( ) . Lookup ( "packages" ) )
viper . BindPFlag ( "tree" , cmd . Flags ( ) . Lookup ( "tree" ) )
viper . BindPFlag ( "output" , cmd . Flags ( ) . Lookup ( "output" ) )
2021-01-18 16:58:32 +00:00
viper . BindPFlag ( "backend" , cmd . Flags ( ) . Lookup ( "backend" ) )
2019-11-25 18:55:30 +00:00
viper . BindPFlag ( "name" , cmd . Flags ( ) . Lookup ( "name" ) )
2019-12-31 00:21:06 +00:00
viper . BindPFlag ( "descr" , cmd . Flags ( ) . Lookup ( "descr" ) )
viper . BindPFlag ( "urls" , cmd . Flags ( ) . Lookup ( "urls" ) )
2019-11-25 18:55:30 +00:00
viper . BindPFlag ( "type" , cmd . Flags ( ) . Lookup ( "type" ) )
2020-01-28 16:46:32 +00:00
viper . BindPFlag ( "tree-compression" , cmd . Flags ( ) . Lookup ( "tree-compression" ) )
2020-03-24 17:30:52 +00:00
viper . BindPFlag ( "tree-filename" , cmd . Flags ( ) . Lookup ( "tree-filename" ) )
2020-03-23 22:56:29 +00:00
viper . BindPFlag ( "meta-compression" , cmd . Flags ( ) . Lookup ( "meta-compression" ) )
2020-03-24 17:30:52 +00:00
viper . BindPFlag ( "meta-filename" , cmd . Flags ( ) . Lookup ( "meta-filename" ) )
2020-01-03 23:31:11 +00:00
viper . BindPFlag ( "reset-revision" , cmd . Flags ( ) . Lookup ( "reset-revision" ) )
2020-02-02 10:29:05 +00:00
viper . BindPFlag ( "repo" , cmd . Flags ( ) . Lookup ( "repo" ) )
2021-09-16 10:58:12 +00:00
viper . BindPFlag ( "from-metadata" , cmd . Flags ( ) . Lookup ( "from-metadata" ) )
2021-01-19 11:00:51 +00:00
viper . BindPFlag ( "force-push" , cmd . Flags ( ) . Lookup ( "force-push" ) )
viper . BindPFlag ( "push-images" , cmd . Flags ( ) . Lookup ( "push-images" ) )
2019-11-25 18:55:30 +00:00
} ,
2019-11-24 17:28:39 +00:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2020-02-02 10:29:05 +00:00
var err error
2021-04-12 17:00:36 +00:00
var repo * installer . LuetSystemRepository
2019-11-24 17:28:39 +00:00
2020-05-10 18:18:10 +00:00
treePaths := viper . GetStringSlice ( "tree" )
2019-11-24 17:28:39 +00:00
dst := viper . GetString ( "output" )
2021-09-16 10:58:12 +00:00
2019-11-24 17:28:39 +00:00
name := viper . GetString ( "name" )
2019-12-31 00:21:06 +00:00
descr := viper . GetString ( "descr" )
urls := viper . GetStringSlice ( "urls" )
2019-11-24 17:28:39 +00:00
t := viper . GetString ( "type" )
2020-01-03 23:31:11 +00:00
reset := viper . GetBool ( "reset-revision" )
2020-01-28 16:46:32 +00:00
treetype := viper . GetString ( "tree-compression" )
2020-03-24 17:30:52 +00:00
treeName := viper . GetString ( "tree-filename" )
2020-03-23 22:56:29 +00:00
metatype := viper . GetString ( "meta-compression" )
2020-03-24 17:30:52 +00:00
metaName := viper . GetString ( "meta-filename" )
2020-02-02 10:29:05 +00:00
source_repo := viper . GetString ( "repo" )
2021-01-18 16:58:32 +00:00
backendType := viper . GetString ( "backend" )
2021-04-15 10:25:34 +00:00
fromRepo , _ := cmd . Flags ( ) . GetBool ( "from-repositories" )
2020-02-02 10:29:05 +00:00
2020-03-23 22:56:29 +00:00
treeFile := installer . NewDefaultTreeRepositoryFile ( )
metaFile := installer . NewDefaultMetaRepositoryFile ( )
2021-10-20 22:13:02 +00:00
compilerBackend , err := compiler . NewBackend ( util . DefaultContext , backendType )
2021-04-12 17:00:36 +00:00
helpers . CheckErr ( err )
2021-01-19 11:00:51 +00:00
force := viper . GetBool ( "force-push" )
imagePush := viper . GetBool ( "push-images" )
2020-03-23 22:56:29 +00:00
2021-09-16 10:58:12 +00:00
opts := [ ] installer . RepositoryOption {
installer . WithSource ( viper . GetString ( "packages" ) ) ,
installer . WithPushImages ( imagePush ) ,
installer . WithForce ( force ) ,
installer . FromRepository ( fromRepo ) ,
installer . WithImagePrefix ( dst ) ,
installer . WithDatabase ( pkg . NewInMemoryDatabase ( false ) ) ,
installer . WithCompilerBackend ( compilerBackend ) ,
installer . FromMetadata ( viper . GetBool ( "from-metadata" ) ) ,
2021-10-20 22:13:02 +00:00
installer . WithContext ( util . DefaultContext ) ,
2021-09-16 10:58:12 +00:00
}
2020-02-02 10:29:05 +00:00
if source_repo != "" {
// Search for system repository
2021-10-20 22:13:02 +00:00
lrepo , err := util . DefaultContext . Config . GetSystemRepository ( source_repo )
2021-04-15 10:25:34 +00:00
helpers . CheckErr ( err )
2020-02-02 10:29:05 +00:00
2020-05-10 18:18:10 +00:00
if len ( treePaths ) <= 0 {
treePaths = [ ] string { lrepo . TreePath }
2020-02-02 10:29:05 +00:00
}
if t == "" {
t = lrepo . Type
}
2021-09-16 10:58:12 +00:00
opts = append ( opts ,
installer . WithName ( lrepo . Name ) ,
installer . WithDescription ( lrepo . Description ) ,
installer . WithType ( t ) ,
installer . WithUrls ( lrepo . Urls ... ) ,
installer . WithPriority ( lrepo . Priority ) ,
installer . WithTree ( treePaths ... ) ,
)
2020-02-02 10:29:05 +00:00
} else {
2021-09-16 10:58:12 +00:00
opts = append ( opts ,
installer . WithName ( name ) ,
installer . WithDescription ( descr ) ,
installer . WithType ( t ) ,
installer . WithUrls ( urls ... ) ,
installer . WithTree ( treePaths ... ) ,
)
2019-11-24 17:28:39 +00:00
}
2020-02-02 10:29:05 +00:00
2021-09-16 10:58:12 +00:00
repo , err = installer . GenerateRepository ( opts ... )
helpers . CheckErr ( err )
2020-01-28 16:46:32 +00:00
if treetype != "" {
2021-04-12 17:00:36 +00:00
treeFile . SetCompressionType ( compression . Implementation ( treetype ) )
2020-03-23 22:56:29 +00:00
}
if treeName != "" {
2020-03-24 17:30:52 +00:00
treeFile . SetFileName ( treeName )
2020-01-28 16:46:32 +00:00
}
2020-03-23 22:56:29 +00:00
if metatype != "" {
2021-04-12 17:00:36 +00:00
metaFile . SetCompressionType ( compression . Implementation ( metatype ) )
2020-01-28 16:46:32 +00:00
}
2020-03-23 22:56:29 +00:00
if metaName != "" {
2020-03-24 17:30:52 +00:00
metaFile . SetFileName ( metaName )
2020-03-23 22:56:29 +00:00
}
repo . SetRepositoryFile ( installer . REPOFILE_TREE_KEY , treeFile )
repo . SetRepositoryFile ( installer . REPOFILE_META_KEY , metaFile )
2021-10-20 22:13:02 +00:00
err = repo . Write ( util . DefaultContext , dst , reset , true )
2021-04-15 10:25:34 +00:00
helpers . CheckErr ( err )
2019-11-24 17:28:39 +00:00
} ,
}
func init ( ) {
path , err := os . Getwd ( )
2021-04-15 10:25:34 +00:00
helpers . CheckErr ( err )
2021-01-18 16:58:32 +00:00
createrepoCmd . Flags ( ) . String ( "packages" , filepath . Join ( path , "build" ) , "Packages folder (output from build)" )
2021-01-18 09:40:41 +00:00
createrepoCmd . Flags ( ) . StringSliceP ( "tree" , "t" , [ ] string { path } , "Path of the source trees to use." )
2021-01-18 16:58:32 +00:00
createrepoCmd . Flags ( ) . String ( "output" , filepath . Join ( path , "build" ) , "Destination for generated archives. With 'docker' repository type, it should be an image reference (e.g 'foo/bar')" )
2019-11-24 17:28:39 +00:00
createrepoCmd . Flags ( ) . String ( "name" , "luet" , "Repository name" )
2019-12-31 00:21:06 +00:00
createrepoCmd . Flags ( ) . String ( "descr" , "luet" , "Repository description" )
createrepoCmd . Flags ( ) . StringSlice ( "urls" , [ ] string { } , "Repository URLs" )
2021-01-22 14:38:49 +00:00
createrepoCmd . Flags ( ) . String ( "type" , "disk" , "Repository type (disk, http, docker)" )
2020-01-03 23:31:11 +00:00
createrepoCmd . Flags ( ) . Bool ( "reset-revision" , false , "Reset repository revision." )
2020-02-02 10:29:05 +00:00
createrepoCmd . Flags ( ) . String ( "repo" , "" , "Use repository defined in configuration." )
2021-01-18 16:58:32 +00:00
createrepoCmd . Flags ( ) . String ( "backend" , "docker" , "backend used (docker,img)" )
2019-11-24 17:28:39 +00:00
2021-01-22 10:49:24 +00:00
createrepoCmd . Flags ( ) . Bool ( "force-push" , false , "Force overwrite of docker images if already present online" )
2021-01-19 11:00:51 +00:00
createrepoCmd . Flags ( ) . Bool ( "push-images" , false , "Enable/Disable docker image push for docker repositories" )
2021-09-16 10:58:12 +00:00
createrepoCmd . Flags ( ) . Bool ( "from-metadata" , false , "Consider metadata files from the packages folder while indexing the new tree" )
2021-01-19 11:00:51 +00:00
2020-12-18 20:23:04 +00:00
createrepoCmd . Flags ( ) . String ( "tree-compression" , "gzip" , "Compression alg: none, gzip, zstd" )
2020-03-24 17:30:52 +00:00
createrepoCmd . Flags ( ) . String ( "tree-filename" , installer . TREE_TARBALL , "Repository tree filename" )
2020-12-18 20:23:04 +00:00
createrepoCmd . Flags ( ) . String ( "meta-compression" , "none" , "Compression alg: none, gzip, zstd" )
2020-03-24 17:30:52 +00:00
createrepoCmd . Flags ( ) . String ( "meta-filename" , installer . REPOSITORY_METAFILE + ".tar" , "Repository metadata filename" )
2021-04-15 10:25:34 +00:00
createrepoCmd . Flags ( ) . Bool ( "from-repositories" , false , "Consume the user-defined repositories to pull specfiles from" )
2020-01-28 16:46:32 +00:00
2019-11-24 17:28:39 +00:00
RootCmd . AddCommand ( createrepoCmd )
}