Skip to content

Commit

Permalink
update importer to output .tf code files for job
Browse files Browse the repository at this point in the history
  • Loading branch information
jgramoll committed Aug 5, 2019
1 parent d05d39a commit e9d0d95
Show file tree
Hide file tree
Showing 31 changed files with 777 additions and 20 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ sonar/

.envrc
terraform-provider-jenkins
importer
/importer/importer
report.json
coverage.out
16 changes: 1 addition & 15 deletions importer/ensure_resource_service.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package main

import (
"github.com/google/uuid"
"github.com/jgramoll/terraform-provider-jenkins/client"
)

Expand All @@ -16,20 +15,7 @@ func NewEnsureJobResourceService(jobService *client.JobService) *EnsureJobResour
}

func (s *EnsureJobResourceService) EnsureResourceIds(job *client.Job) error {
if job.Id == "" {
id, err := uuid.NewRandom()
if err != nil {
return err
}
job.Id = id.String()
}
if err := ensureJobActions(job.Actions); err != nil {
return err
}
if err := ensureJobProperties(job.Properties); err != nil {
return err
}
if err := ensureJobDefinition(job.Definition); err != nil {
if err := ensureJob(job); err != nil {
return err
}

Expand Down
65 changes: 65 additions & 0 deletions importer/generate_terraform_code_service.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package main

import (
"fmt"
"os"

"github.com/jgramoll/terraform-provider-jenkins/client"
)

type GenerateTerraformCodeService struct {
jobService *client.JobService
}

func NewGenerateTerraformCodeService(jobService *client.JobService) *GenerateTerraformCodeService {
return &GenerateTerraformCodeService{
jobService: jobService,
}
}

func (s *GenerateTerraformCodeService) GenerateCode(job *client.Job, outputDir string) error {
if err := ensureOutputDir(outputDir); err != nil {
return err
}

if err := s.generateProviderCode(outputDir); err != nil {
return err
}

if err := s.generatePipelineCode(outputDir, job); err != nil {
return err
}

return nil
}

func (s *GenerateTerraformCodeService) generateProviderCode(outputDir string) error {
tfCodeFile, err := os.Create(fmt.Sprintf("%s/provider.tf", outputDir))
if err != nil {
return err
}
defer tfCodeFile.Close()

_, err = tfCodeFile.Write([]byte(providerCode(s.jobService.Config.Address)))
return err
}

func (s *GenerateTerraformCodeService) generatePipelineCode(outputDir string, job *client.Job) error {
tfCodeFile, err := os.Create(fmt.Sprintf("%s/pipeline.tf", outputDir))
if err != nil {
return err
}
defer tfCodeFile.Close()

_, err = tfCodeFile.Write([]byte(jobCode(job)))
return err
}

func ensureOutputDir(outputDir string) error {
if err := os.Mkdir(outputDir, os.ModePerm); err != nil {
if os.IsNotExist(err) {
return err
}
}
return nil
}
11 changes: 8 additions & 3 deletions importer/job_import_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,20 @@ func NewJobImportService(jenkinsClient *client.Client) *JobImportService {
}
}

func (s *JobImportService) Import(jobName string) error {
func (s *JobImportService) Import(jobName string, skipEnsure bool, outputDir string) error {
job, err := s.jobService.GetJob(jobName)
if err != nil {
return err
}
if err := NewEnsureJobResourceService(s.jobService).EnsureResourceIds(job); err != nil {
if !skipEnsure {
if err := NewEnsureJobResourceService(s.jobService).EnsureResourceIds(job); err != nil {
return err
}
}

if err := NewGenerateTerraformCodeService(s.jobService).GenerateCode(job, outputDir); err != nil {
return err
}
// GenerateTerraformCodeService(s.jobService).Generate(job)
// GenerateTerraformImportScriptService(s.jobService).Generate(job)
return nil
}
4 changes: 3 additions & 1 deletion importer/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (

func main() {
jobName := flag.String("job", "", "name of job to import")
skipEnsure := flag.Bool("skipEnsure", false, "Do not ensure the xml structure")
outputDir := flag.String("output", "output", "Directory to output the terraform code")
flag.Parse()

if *jobName == "" {
Expand All @@ -18,7 +20,7 @@ func main() {
os.Exit(128)
}
jenkinsClient := initJenkinsClient()
err := NewJobImportService(jenkinsClient).Import(*jobName)
err := NewJobImportService(jenkinsClient).Import(*jobName, *skipEnsure, *outputDir)
if err != nil {
log.Println(err.Error())
os.Exit(1)
Expand Down
19 changes: 19 additions & 0 deletions importer/resource_cps_scm_flow_definition.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package main

import (
"fmt"

"github.com/jgramoll/terraform-provider-jenkins/client"
)

func init() {
ensureDefinitionFuncs["*client.CpsScmFlowDefinition"] = ensureCpsScmFlowDefinition
definitionCodeFuncs["*client.CpsScmFlowDefinition"] = cpsScmFlowDefinitionCode
}

func ensureCpsScmFlowDefinition(definitionInterface client.JobDefinition) error {
Expand All @@ -21,3 +24,19 @@ func ensureCpsScmFlowDefinition(definitionInterface client.JobDefinition) error
}
return ensureGitScmExtensions(definition.SCM.Extensions)
}

func cpsScmFlowDefinitionCode(definitionInterface client.JobDefinition) string {
definition := definitionInterface.(*client.CpsScmFlowDefinition)
return fmt.Sprintf(`
resource "jenkins_job_git_scm" "main" {
job = "${jenkins_job.main.id}"
config_version = "%v"
script_path = "%v"
lightweight = %v
}
`, definition.SCM.ConfigVersion, definition.ScriptPath, definition.Lightweight) +
jobGitScmUserRemoteConfigsCode(definition.SCM.UserRemoteConfigs) +
jobGitScmBranchesCode(definition.SCM.Branches) +
jobGitScmExtensionsCode(definition.SCM.Extensions)
}
16 changes: 16 additions & 0 deletions importer/resource_git_scm_branch.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package main

import (
"fmt"

"github.com/google/uuid"
"github.com/jgramoll/terraform-provider-jenkins/client"
)
Expand All @@ -20,3 +22,17 @@ func ensureGitScmBranches(branches *client.GitScmBranches) error {
}
return nil
}

func jobGitScmBranchesCode(branches *client.GitScmBranches) string {
code := ""
for i, item := range *branches.Items {
code += fmt.Sprintf(`
resource "jenkins_job_git_scm_branch" "branch_%v" {
scm = "${jenkins_job_git_scm.main.id}"
name = "%v"
}
`, i+1, item.Name)
}
return code
}
16 changes: 16 additions & 0 deletions importer/resource_git_scm_clean_before_checkout_extension.go
Original file line number Diff line number Diff line change
@@ -1 +1,17 @@
package main

import (
"github.com/jgramoll/terraform-provider-jenkins/client"
)

func init() {
jobGitScmExtensionCodeFuncs["*client.GitScmCleanBeforeCheckoutExtension"] = jobGitScmCleanBeforeCheckoutExtensionCode
}

func jobGitScmCleanBeforeCheckoutExtensionCode(client.GitScmExtension) string {
return `
resource "jenkins_job_git_scm_clean_before_checkout_extension" "main" {
scm = "${jenkins_job_git_scm.main.id}"
}
`
}
20 changes: 20 additions & 0 deletions importer/resource_git_scm_extension.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
package main

import (
"log"
"reflect"

"github.com/google/uuid"
"github.com/jgramoll/terraform-provider-jenkins/client"
)

type jobGitScmExtensionCodeFunc func(client.GitScmExtension) string

var jobGitScmExtensionCodeFuncs = map[string]jobGitScmExtensionCodeFunc{}

func ensureGitScmExtensions(extensions *client.GitScmExtensions) error {
if extensions == nil || extensions.Items == nil {
return nil
Expand All @@ -20,3 +27,16 @@ func ensureGitScmExtensions(extensions *client.GitScmExtensions) error {
}
return nil
}

func jobGitScmExtensionsCode(extensions *client.GitScmExtensions) string {
code := ""
for _, item := range *extensions.Items {
reflectType := reflect.TypeOf(item).String()
if codeFunc, ok := jobGitScmExtensionCodeFuncs[reflectType]; ok {
code += codeFunc(item)
} else {
log.Println("[WARNING] Unknown action type:", reflectType)
}
}
return code
}
22 changes: 22 additions & 0 deletions importer/resource_git_user_remote_config.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package main

import (
"fmt"

"github.com/google/uuid"
"github.com/jgramoll/terraform-provider-jenkins/client"
)

type gitUserRemoteConfigCodeFunc func(client.GitUserRemoteConfig) string

var gitUserRemoteConfigCodeFuncs = map[string]gitUserRemoteConfigCodeFunc{}

func ensureGitUserRemoteConfigs(configs *client.GitUserRemoteConfigs) error {
if configs == nil || configs.Items == nil {
return nil
Expand All @@ -20,3 +26,19 @@ func ensureGitUserRemoteConfigs(configs *client.GitUserRemoteConfigs) error {
}
return nil
}

func jobGitScmUserRemoteConfigsCode(configs *client.GitUserRemoteConfigs) string {
code := ""
for i, item := range *configs.Items {
code += fmt.Sprintf(`
resource "jenkins_job_git_scm_user_remote_config" "config_%v" {
scm = "${jenkins_job_git_scm.main.id}"
refspec = "%v"
url = "%v"
credentials_id = "%v"
}
`, i+1, item.Refspec, item.Url, item.CredentialsId)
}
return code
}
39 changes: 39 additions & 0 deletions importer/resource_job.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package main

import (
"fmt"
"strings"

"github.com/google/uuid"
"github.com/jgramoll/terraform-provider-jenkins/client"
)

func ensureJob(job *client.Job) error {
if job.Id == "" {
id, err := uuid.NewRandom()
if err != nil {
return err
}
job.Id = id.String()
}
if err := ensureJobActions(job.Actions); err != nil {
return err
}
if err := ensureJobProperties(job.Properties); err != nil {
return err
}
return ensureJobDefinition(job.Definition)
}

func jobCode(job *client.Job) string {
return strings.TrimSpace(fmt.Sprintf(`
resource "jenkins_job" "main" {
name = "%v"
plugin = "%v"
disabled = %v
}
`, job.Name, job.Plugin, job.Disabled)+
jobActionsCode(job.Actions)+
jobDefinitionCode(job.Definition)+
jobPropertiesCode(job.Properties)) + "\n"
}
20 changes: 20 additions & 0 deletions importer/resource_job_action.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
package main

import (
"log"
"reflect"

"github.com/google/uuid"
"github.com/jgramoll/terraform-provider-jenkins/client"
)

type jobActionCodeFunc func(client.JobAction) string

var jobActionCodeFuncs = map[string]jobActionCodeFunc{}

func ensureJobActions(actions *client.JobActions) error {
if actions == nil || actions.Items == nil {
return nil
Expand All @@ -20,3 +27,16 @@ func ensureJobActions(actions *client.JobActions) error {
}
return nil
}

func jobActionsCode(actions *client.JobActions) string {
code := ""
for _, item := range *actions.Items {
reflectType := reflect.TypeOf(item).String()
if codeFunc, ok := jobActionCodeFuncs[reflectType]; ok {
code += codeFunc(item)
} else {
log.Println("[WARNING] Unknown action type:", reflectType)
}
}
return code
}
18 changes: 18 additions & 0 deletions importer/resource_job_build_discarder_property.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package main

import (
"github.com/jgramoll/terraform-provider-jenkins/client"
)

func init() {
jobPropertyCodeFuncs["*client.JobBuildDiscarderProperty"] = jobBuildDiscarderPropertyCode
}

func jobBuildDiscarderPropertyCode(propertyInterface client.JobProperty) string {
property := propertyInterface.(*client.JobBuildDiscarderProperty)
return `
resource "jenkins_job_build_discarder_property" "main" {
job = "${jenkins_job.main.id}"
}
` + jobBuildDiscarderPropertyStrategyCode(property.Strategy.Item)
}
Loading

0 comments on commit e9d0d95

Please sign in to comment.