Skip to content

Commit

Permalink
support creating job in folder
Browse files Browse the repository at this point in the history
  • Loading branch information
supereagle committed May 7, 2017
1 parent e382c47 commit f273b7a
Show file tree
Hide file tree
Showing 3 changed files with 161 additions and 0 deletions.
76 changes: 76 additions & 0 deletions folder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// Copyright 2015 Vadim Kravcenko
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.

package gojenkins

import (
"errors"
"strconv"
"strings"
)

type Folder struct {
Raw *FolderResponse
Jenkins *Jenkins
Base string
}

type FolderResponse struct {
Actions []generalObj
Description string `json:"description"`
DisplayName string `json:"displayName"`
Name string `json:"name"`
URL string `json:"url"`
Jobs []InnerJob `json:"jobs"`
PrimaryView *ViewData `json:"primaryView"`
Views []ViewData `json:"views"`
}

func (f *Folder) parentBase() string {
return f.Base[:strings.LastIndex(f.Base, "/job")]
}

func (f *Folder) GetName() string {
return f.Raw.Name
}

func (f *Folder) Create(name string) (*Folder, error) {
mode := "com.cloudbees.hudson.plugins.folder.Folder"
data := map[string]string{
"name": name,
"mode": mode,
"Submit": "OK",
"json": makeJson(map[string]string{
"name": name,
"mode": mode,
}),
}
r, err := f.Jenkins.Requester.Post(f.parentBase()+"/createItem", nil, f.Raw, data)
if err != nil {
return nil, err
}
if r.StatusCode == 200 {
f.Poll()
return f, nil
}
return nil, errors.New(strconv.Itoa(r.StatusCode))
}

func (f *Folder) Poll() (int, error) {
response, err := f.Jenkins.Requester.GetJSON(f.Base, f.Raw, nil)
if err != nil {
return 0, err
}
return response.StatusCode, nil
}
38 changes: 38 additions & 0 deletions jenkins.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,32 @@ func (j *Jenkins) CreateNode(name string, numExecutors int, description string,
return nil, errors.New(strconv.Itoa(resp.StatusCode))
}

// Create a new folder
// This folder can be nested in other parent folders
// Example: jenkins.CreateFolder("newFolder", "grandparentFolder", "parentFolder")
func (j *Jenkins) CreateFolder(name string, parents ...string) (*Folder, error) {
folderObj := &Folder{Jenkins: j, Raw: new(FolderResponse), Base: "/job/" + strings.Join(append(parents, name), "/job/")}
folder, err := folderObj.Create(name)
if err != nil {
return nil, err
}
return folder, nil
}

// Create a new job in the folder
// Example: jenkins.CreateJobInFolder("<config></config>", "newJobName", "myFolder", "parentFolder")
func (j *Jenkins) CreateJobInFolder(config string, jobName string, parentIDs ...string) (*Job, error) {
jobObj := Job{Jenkins: j, Raw: new(JobResponse), Base: "/job/" + strings.Join(append(parentIDs, jobName), "/job/")}
qr := map[string]string{
"name": jobName,
}
job, err := jobObj.Create(config, qr)
if err != nil {
return nil, err
}
return job, nil
}

// Create a new job from config File
// Method takes XML string as first parameter, and if the name is not specified in the config file
// takes name as string as second parameter
Expand Down Expand Up @@ -326,6 +352,18 @@ func (j *Jenkins) GetSubJob(parentId string, childId string) (*Job, error) {
return nil, errors.New(strconv.Itoa(status))
}

func (j *Jenkins) GetFolder(id string, parents ...string) (*Folder, error) {
folder := Folder{Jenkins: j, Raw: new(FolderResponse), Base: "/job/" + strings.Join(append(parents, id), "/job/")}
status, err := folder.Poll()
if err != nil {
return nil, fmt.Errorf("trouble polling folder: %v", err)
}
if status == 200 {
return &folder, nil
}
return nil, errors.New(strconv.Itoa(status))
}

func (j *Jenkins) GetAllNodes() ([]*Node, error) {
computers := new(Computers)

Expand Down
47 changes: 47 additions & 0 deletions jenkins_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,53 @@ func TestConcurrentRequests(t *testing.T) {
}
}

func TestCreateFolder(t *testing.T) {
folder1ID := "folder1_test"
folder2ID := "folder2_test"

folder1, err := jenkins.CreateFolder(folder1ID)
assert.Nil(t, err)
assert.NotNil(t, folder1)
assert.Equal(t, folder1ID, folder1.GetName())

folder2, err := jenkins.CreateFolder(folder2ID, folder1ID)
assert.Nil(t, err)
assert.NotNil(t, folder2)
assert.Equal(t, folder2ID, folder2.GetName())
}

func TestCreateJobInFolder(t *testing.T) {
jobName := "Job_test"
job_data := getFileAsString("job.xml")

job1, err := jenkins.CreateJobInFolder(job_data, jobName, "folder1_test")
assert.Nil(t, err)
assert.NotNil(t, job1)
assert.Equal(t, "Some Job Description", job1.GetDescription())
assert.Equal(t, jobName, job1.GetName())

job2, err := jenkins.CreateJobInFolder(job_data, jobName, "folder1_test", "folder2_test")
assert.Nil(t, err)
assert.NotNil(t, job2)
assert.Equal(t, "Some Job Description", job2.GetDescription())
assert.Equal(t, jobName, job2.GetName())
}

func TestGetFolder(t *testing.T) {
folder1ID := "folder1_test"
folder2ID := "folder2_test"

folder1, err := jenkins.GetFolder(folder1ID)
assert.Nil(t, err)
assert.NotNil(t, folder1)
assert.Equal(t, folder1ID, folder1.GetName())

folder2, err := jenkins.GetFolder(folder2ID, folder1ID)
assert.Nil(t, err)
assert.NotNil(t, folder2)
assert.Equal(t, folder2ID, folder2.GetName())
}

func getFileAsString(path string) string {
buf, err := ioutil.ReadFile("_tests/" + path)
if err != nil {
Expand Down

0 comments on commit f273b7a

Please sign in to comment.