diff --git a/README.md b/README.md index 634f8ee3..412a4184 100644 --- a/README.md +++ b/README.md @@ -169,18 +169,24 @@ for _, task := range tasks { ```go -view, err := jenkins.CreateView(ctx, "test_view", gojenkins.LIST_VIEW) +view1, err := jenkins.CreateView(ctx, "test_view", gojenkins.LIST_VIEW) if err != nil { panic(err) } -status, err := view.AddJob(ctx, "jobName") +status, err := view1.AddJob(ctx, "jobName") if status != nil { fmt.Println("Job has been added to view") } +view2, err := jenkins.CreateViewInFolder(ctx, "test_view", gojenkins.LIST_VIEW, "parentFolder", "childFolder") + +if err != nil { + panic(err) +} + ``` ### Create nested Folders and create Jobs in them diff --git a/jenkins.go b/jenkins.go index 86dc7191..9ac9c1d5 100644 --- a/jenkins.go +++ b/jenkins.go @@ -198,6 +198,17 @@ func (j *Jenkins) CreateFolder(ctx context.Context, name string, parents ...stri return folder, nil } +// Create a new view in the folder +// Example: jenkins.CreateViewInFolder("newViewName", gojenkins.LIST_VIEW, "myFolder", "parentFolder") +func (j *Jenkins) CreateViewInFolder(ctx context.Context, viewName string, viewType string, parentIDs ...string) (*View, error) { + viewObj := &View{Jenkins: j, Raw: new(ViewResponse), Base: "/job/" + strings.Join(parentIDs, "/job/")} + view, err := viewObj.Create(ctx, viewName, viewType) + if err != nil { + return nil, err + } + return view, nil +} + // Create a new job in the folder // Example: jenkins.CreateJobInFolder("", "newJobName", "myFolder", "parentFolder") func (j *Jenkins) CreateJobInFolder(ctx context.Context, config string, jobName string, parentIDs ...string) (*Job, error) { @@ -562,27 +573,12 @@ func (j *Jenkins) GetAllViews(ctx context.Context) ([]*View, error) { // gojenkins.PIPELINE_VIEW // Example: jenkins.CreateView("newView",gojenkins.LIST_VIEW) func (j *Jenkins) CreateView(ctx context.Context, name string, viewType string) (*View, error) { - view := &View{Jenkins: j, Raw: new(ViewResponse), Base: "/view/" + name} - endpoint := "/createView" - data := map[string]string{ - "name": name, - "mode": viewType, - "Submit": "OK", - "json": makeJson(map[string]string{ - "name": name, - "mode": viewType, - }), - } - r, err := j.Requester.Post(ctx, endpoint, nil, view.Raw, data) - + viewObj := &View{Jenkins: j, Raw: new(ViewResponse), Base: "/"} + view, err := viewObj.Create(ctx, name, viewType) if err != nil { return nil, err } - - if r.StatusCode == 200 { - return j.GetView(ctx, name) - } - return nil, errors.New(strconv.Itoa(r.StatusCode)) + return view, nil } func (j *Jenkins) Poll(ctx context.Context) (int, error) { diff --git a/jenkins_test.go b/jenkins_test.go index 4f4f1af0..d8162425 100644 --- a/jenkins_test.go +++ b/jenkins_test.go @@ -384,3 +384,17 @@ func getFileAsString(path string) string { return string(buf) } + +func TestCreateViewInFolder(t *testing.T) { + if _, ok := os.LookupEnv(integration_test); !ok { + return + } + ctx := context.Background() + viewName := "view_test" + + view1, err := jenkins.CreateViewInFolder(ctx, viewName, LIST_VIEW, "folder1_test") + assert.Nil(t, err) + assert.NotNil(t, view1) + assert.Equal(t, "Some Job Description", view1.GetDescription()) + assert.Equal(t, viewName, view1.GetName()) +} diff --git a/views.go b/views.go index 4437913b..eaf4381f 100644 --- a/views.go +++ b/views.go @@ -17,6 +17,7 @@ package gojenkins import ( "context" "errors" + "path" "strconv" ) @@ -42,6 +43,32 @@ var ( PIPELINE_VIEW = "au.com.centrumsystems.hudson.plugin.buildpipeline.BuildPipelineView" ) +func (v *View) Create(ctx context.Context, name string, viewType string) (*View, error) { + data := map[string]string{ + "name": name, + "mode": viewType, + "Submit": "OK", + "json": makeJson(map[string]string{ + "name": name, + "mode": viewType, + }), + } + + endpoint := path.Join(v.Base, "/createView") + v.Base = path.Join(v.Base, "/view/", name) + + r, err := v.Jenkins.Requester.Post(ctx, endpoint, nil, v.Raw, data) + + if err != nil { + return nil, err + } + + if r.StatusCode == 200 { + return v, nil + } + return nil, errors.New(strconv.Itoa(r.StatusCode)) +} + // Returns True if successfully added Job, otherwise false func (v *View) AddJob(ctx context.Context, name string) (bool, error) { url := "/addJobToView"