diff --git a/go.mod b/go.mod index 6df1655..4fa5d43 100644 --- a/go.mod +++ b/go.mod @@ -10,9 +10,9 @@ require ( github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 github.com/mitchellh/go-homedir v1.1.0 github.com/relex/aini v1.2.1 + github.com/sirupsen/logrus v1.2.0 github.com/spf13/cobra v1.1.1 github.com/spf13/viper v1.7.1 github.com/stretchr/testify v1.3.0 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 - k8s.io/klog/v2 v2.4.0 ) diff --git a/go.sum b/go.sum index 1dee044..f4ba0fe 100644 --- a/go.sum +++ b/go.sum @@ -47,8 +47,6 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= @@ -116,6 +114,7 @@ github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgy github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -170,6 +169,7 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -331,6 +331,4 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/internal/ansible/playbook.go b/internal/ansible/playbook.go index 9950c2e..4d39604 100644 --- a/internal/ansible/playbook.go +++ b/internal/ansible/playbook.go @@ -3,59 +3,27 @@ package ansible import ( "fmt" "github.com/ca-gip/dploy/internal/utils" + "github.com/ghodss/yaml" "github.com/karrick/godirwalk" - "gopkg.in/yaml.v2" + log "github.com/sirupsen/logrus" "io/ioutil" "path/filepath" "strings" ) -type Playbook struct { - absolutePath string - rootPath *string - Plays []Play +type Tasks struct { + Tags []string `yaml:"tags,omitempty" yaml:"tags,omitempty"` } -const decoderTagName = "tags" - -func (playbook *Playbook) AllTags() (tags *utils.Set) { - tags = utils.NewSet() - for _, play := range playbook.Plays { - tags.Concat(play.AllTags().List()) - } - return +type Playbook struct { + AbsolutePath string + RootPath *string + Plays []Play + AllTags utils.Set } func (playbook *Playbook) RelativePath() string { - return strings.TrimPrefix(playbook.absolutePath, *playbook.rootPath+"/") -} - -func ReadFromFile(osPathname string) (playbook Playbook) { - // Try to check playbook content - binData, err := ioutil.ReadFile(osPathname) - - // IMPORTANT: Yaml and Json parser need a root element, - // They can't read a raw list. - content := fmt.Sprintf("plays:\n%s", string(binData)) - - if err != nil { - fmt.Println("Cannot read playbook", osPathname, ". Error: ", err.Error()) - return - } - err = yaml.Unmarshal([]byte(content), &playbook) - if err != nil { - fmt.Println("Skip", osPathname, " not a playbook ", err.Error()) - return - } - if len(playbook.Plays) == 0 { - fmt.Println("No play found inside the playbook: ", osPathname) - return - } - if playbook.Plays[0].Hosts == utils.EmptyString { - fmt.Println("No play found inside the playbook: ", osPathname) - return - } - return + return strings.TrimPrefix(playbook.AbsolutePath, *playbook.RootPath+"/") } // Gather playbook files from a Parent directory @@ -68,13 +36,12 @@ func readPlaybook(rootPath string) (result []*Playbook, err error) { return } - fmt.Println("reading playbook") // Merge Play, Role and Task Tags for a playbook allTags := utils.NewSet() err = godirwalk.Walk(absRoot, &godirwalk.Options{ Callback: func(osPathname string, de *godirwalk.Dirent) error { - if strings.Contains(de.Name(), "vars") || de.Name() == "template" || de.Name() == "roles" { + if strings.Contains(osPathname, "vars") || strings.Contains(osPathname, "template") { return godirwalk.SkipThis } @@ -83,25 +50,43 @@ func readPlaybook(rootPath string) (result []*Playbook, err error) { } // Try to check playbook content - playbook := ReadFromFile(osPathname) + var plays []Play + binData, err := ioutil.ReadFile(osPathname) + if err != nil { + log.Error("Cannot read playbook", osPathname, ". Error: ", err.Error()) + return nil + } + err = yaml.Unmarshal([]byte(binData), &plays) + if err != nil { + log.Error("Cannot unmashal playbook data", osPathname, ". Error: ", err.Error()) + return nil + } + if plays == nil || len(plays) == 0 { + log.Debug("No play found inside the playbook: ", osPathname) + return nil + } + if plays[0].Hosts == utils.EmptyString { + log.Debug("No play found inside the playbook: ", osPathname) + return nil + } // Browse Role Tags - for _, play := range playbook.Plays { - - allTags.Concat(play.AllTags().List()) - fmt.Println("Play tags are: ", play.Tags) + for _, play := range plays { + allTags.Concat(play.Tags) for _, role := range play.Roles { - role.ReadRoleTasks(rootPath) - fmt.Println(" Role info", role.AllTags()) - allTags.Concat(role.AllTags().List()) + role.ReadRole(rootPath) + allTags.Concat(role.Tags) } } - playbook.absolutePath = osPathname - playbook.rootPath = &rootPath - + playbook := Playbook{ + RootPath: &rootPath, + AbsolutePath: osPathname, + Plays: plays, + AllTags: *allTags, + } result = append(result, &playbook) - fmt.Println("Available tags are :", playbook.AllTags()) + log.Debug("Available tags are :", playbook.AllTags) return nil }, ErrorCallback: func(osPathname string, err error) godirwalk.ErrorAction { diff --git a/internal/ansible/role.go b/internal/ansible/role.go index 9061346..c733572 100644 --- a/internal/ansible/role.go +++ b/internal/ansible/role.go @@ -1,10 +1,10 @@ package ansible import ( - "fmt" "github.com/ca-gip/dploy/internal/utils" + "github.com/ghodss/yaml" "github.com/karrick/godirwalk" - "gopkg.in/yaml.v2" + log "github.com/sirupsen/logrus" "io/ioutil" "path/filepath" "strings" @@ -12,63 +12,49 @@ import ( type Role struct { AbsolutePath string - Name string `yaml:"role"` - Tasks []Task `yaml:"tasks"` - Tags utils.Set `yaml:"tags"` -} - -func (role *Role) AllTags() (tags *utils.Set) { - tags = utils.NewSet() - for _, task := range role.Tasks { - tags.Concat(task.Tags.List()) - } - tags.Concat(role.Tags.List()) - return + Name string `yaml:"role"` + Tasks []Tasks + Tags []string `yaml:"tags,omitempty" yaml:"tags,omitempty"` } // Gather inventory files from a Parent directory // Using a recursive scan. All non inventory files are ignored ( not .ini file ) // All sub parent directory added like label in the inventory -func (role *Role) ReadRoleTasks(rootPath string, pathTags ...string) (err error) { +func (role *Role) ReadRole(rootPath string, pathTags ...string) (err error) { absRoot, err := filepath.Abs(rootPath + "/roles/" + role.Name) - fmt.Println("reading ", role.Name, "at: ", absRoot) if err != nil { - fmt.Println("The role ", role.Name, "can't be read. Error:", err.Error()) + log.Error("The role ", role.Name, "can't be read. Error:", err.Error()) return } - fmt.Println(role.Name) err = godirwalk.Walk(absRoot, &godirwalk.Options{ Callback: func(osPathname string, de *godirwalk.Dirent) error { + tags := utils.NewSet() + if !strings.Contains(filepath.Base(osPathname), ".yml") { return nil } binData, err := ioutil.ReadFile(osPathname) if err != nil { - fmt.Println("Cannot read file: ", osPathname, ". Error:", err.Error()) + log.Error("Cannot read file: ", osPathname, ". Error:", err.Error()) } var tasks []Task err = yaml.Unmarshal([]byte(binData), &tasks) - - if err != nil { - fmt.Println("Error reading role", osPathname, "err:", err.Error()) - } else { - fmt.Println("Task is", tasks) - } - for _, task := range tasks { - role.Tasks = append(role.Tasks, task) + tags.Concat(task.Tags) } - fmt.Println(osPathname, "tags in role tags:", role.AllTags()) + tasks = append(tasks, Task{Tags: tags.List()}) + if len(tags.List()) > 0 { + log.Info("Task tags:", tags.List()) + } return nil }, ErrorCallback: func(osPathname string, err error) godirwalk.ErrorAction { - fmt.Println(err.Error()) return godirwalk.SkipNode }, Unsorted: true,