Skip to content

Commit

Permalink
Add project tag functionalities in identity v3
Browse files Browse the repository at this point in the history
  • Loading branch information
georgeb committed May 7, 2024
1 parent 543d9fd commit 713cad7
Show file tree
Hide file tree
Showing 7 changed files with 170 additions and 0 deletions.
20 changes: 20 additions & 0 deletions internal/acceptance/openstack/identity/v3/projects_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -393,3 +393,23 @@ func TestProjectsTagsCRUD(t *testing.T) {
err = projects.DeleteTags(context.TODO(), client, projectMain.ID).ExtractErr()
th.AssertNoErr(t, err)
}

func TestTagCRUD(t *testing.T) {
clients.RequireAdmin(t)

client, err := clients.NewIdentityV3Client()
th.AssertNoErr(t, err)

projectMain, err := CreateProject(t, client, nil)
th.AssertNoErr(t, err)
defer DeleteProject(t, client, projectMain.ID)

err = projects.AddTag(context.TODO(), client, projectMain.ID, "Tag1").ExtractErr()
th.AssertNoErr(t, err)

err = projects.CheckTag(context.TODO(), client, projectMain.ID, "Tag1").ExtractErr()
th.AssertNoErr(t, err)

err = projects.DeleteTag(context.TODO(), client, projectMain.ID, "Tag1").ExtractErr()
th.AssertNoErr(t, err)
}
27 changes: 27 additions & 0 deletions openstack/identity/v3/projects/doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,5 +89,32 @@ Example to Delete all tags of a Project
if err != nil {
panic(err)
}
Example to Check if a project contains a Tag
projectID := "966b3c7d36a24facaf20b7e458bf2192"
tag:= "atag"
err := projects.CheckTag(context.TODO(), identityClient, projectID, tag).ExtractErr()
if err != nil {
panic(err)
}
Example to Add a Tag to a project
projectID := "966b3c7d36a24facaf20b7e458bf2192"
tag:= "atag"
err := projects.AddTag(context.TODO(), identityClient, projectID, tag).ExtractErr()
if err != nil {
panic(err)
}
Example to Delete a Project Tag
projectID := "966b3c7d36a24facaf20b7e458bf2192"
tag:= "atag"
err := projects.DeleteTag(context.TODO(), identityClient, projectID, tag).ExtractErr()
if err != nil {
panic(err)
}
*/
package projects
27 changes: 27 additions & 0 deletions openstack/identity/v3/projects/requests.go
Original file line number Diff line number Diff line change
Expand Up @@ -298,3 +298,30 @@ func DeleteTags(ctx context.Context, client *gophercloud.ServiceClient, projectI
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

// CheckTag checks if a a tag exists in a project.
func CheckTag(ctx context.Context, client *gophercloud.ServiceClient, projectID string, tag string) (r CheckTagResult) {
resp, err := client.Get(ctx, getTagURL(client, projectID, tag), nil, &gophercloud.RequestOpts{
OkCodes: []int{204},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

// AddTag adds a tag to a project.
func AddTag(ctx context.Context, client *gophercloud.ServiceClient, projectID string, tag string) (r AddTagResult) {
resp, err := client.Put(ctx, addTagURL(client, projectID, tag), nil, nil, &gophercloud.RequestOpts{
OkCodes: []int{201},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

// DeleteTag deletes a tag from a project.
func DeleteTag(ctx context.Context, client *gophercloud.ServiceClient, projectID string, tag string) (r DeleteTagResult) {
resp, err := client.Delete(ctx, deleteTagURL(client, projectID, tag), &gophercloud.RequestOpts{
OkCodes: []int{204},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
18 changes: 18 additions & 0 deletions openstack/identity/v3/projects/results.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,3 +200,21 @@ func (r ModifyTagsResult) Extract() (*ProjectTags, error) {
type DeleteTagsResult struct {
gophercloud.ErrResult
}

// GetProjectTag is the result of a Get tag request. Call its Extract method to
// interpret it.
type CheckTagResult struct {
gophercloud.ErrResult
}

// AddProjectTagResult is the result of a Delete request. Call its ExtractErr method to
// determine if the request succeeded or failed.
type AddTagResult struct {
gophercloud.ErrResult
}

// DeleteProjectTagResult is the result of a Delete request. Call its ExtractErr method to
// determine if the request succeeded or failed.
type DeleteTagResult struct {
gophercloud.ErrResult
}
33 changes: 33 additions & 0 deletions openstack/identity/v3/projects/testing/fixtures_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -382,3 +382,36 @@ func HandleDeleteProjectTagsSuccessfully(t *testing.T) {
w.WriteHeader(http.StatusNoContent)
})
}

// HandleCheckProjectTagSuccessfully creates an HTTP handler at `/projects/966b3c7d36a24facaf20b7e458bf2192/tags/atag` on the
// test handler mux that tests if project has a specific tag.
func HandleCheckProjectTagSuccessfully(t *testing.T) {
th.Mux.HandleFunc("/projects/966b3c7d36a24facaf20b7e458bf2192/tags/atag", func(w http.ResponseWriter, r *http.Request) {
th.TestMethod(t, r, "GET")
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)

w.WriteHeader(http.StatusNoContent)
})
}

// HandleAddProjectTagSuccessfully creates an HTTP handler at `/projects/966b3c7d36a24facaf20b7e458bf2192/tags/atag` on the
// test handler mux that tests adding a project tag succesfully.
func HandleAddProjectTagSuccessfully(t *testing.T) {
th.Mux.HandleFunc("/projects/966b3c7d36a24facaf20b7e458bf2192/tags/atag", func(w http.ResponseWriter, r *http.Request) {
th.TestMethod(t, r, "PUT")
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)

w.WriteHeader(http.StatusCreated)
})
}

// HandleDeleteProjectTagSuccessfully creates an HTTP handler at `/projects/966b3c7d36a24facaf20b7e458bf2192/tags/atag` on the
// test handler mux that tests project deletion.
func HandleDeleteProjectTagSuccessfully(t *testing.T) {
th.Mux.HandleFunc("/projects/966b3c7d36a24facaf20b7e458bf2192/tags/atag", func(w http.ResponseWriter, r *http.Request) {
th.TestMethod(t, r, "DELETE")
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)

w.WriteHeader(http.StatusNoContent)
})
}
33 changes: 33 additions & 0 deletions openstack/identity/v3/projects/testing/requests_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,3 +168,36 @@ func TestDeleteTags(t *testing.T) {
err := projects.DeleteTags(context.TODO(), client.ServiceClient(), "966b3c7d36a24facaf20b7e458bf2192").ExtractErr()
th.AssertNoErr(t, err)
}

func TestCheckTag(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleCheckProjectTagSuccessfully(t)

projectID := "966b3c7d36a24facaf20b7e458bf2192"
tag := "atag"
res := projects.CheckTag(context.TODO(), client.ServiceClient(), projectID, tag)
th.AssertNoErr(t, res.Err)
}

func TestAddTag(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleAddProjectTagSuccessfully(t)

projectID := "966b3c7d36a24facaf20b7e458bf2192"
tag := "atag"
res := projects.AddTag(context.TODO(), client.ServiceClient(), projectID, tag)
th.AssertNoErr(t, res.Err)
}

func TestDeleteTag(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleDeleteProjectTagSuccessfully(t)

projectID := "966b3c7d36a24facaf20b7e458bf2192"
tag := "atag"
res := projects.DeleteTag(context.TODO(), client.ServiceClient(), projectID, tag)
th.AssertNoErr(t, res.Err)
}
12 changes: 12 additions & 0 deletions openstack/identity/v3/projects/urls.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,15 @@ func modifyTagsURL(client *gophercloud.ServiceClient, projectID string) string {
func deleteTagsURL(client *gophercloud.ServiceClient, projectID string) string {
return client.ServiceURL("projects", projectID, "tags")
}

func getTagURL(client *gophercloud.ServiceClient, projectID string, tag string) string {
return client.ServiceURL("projects", projectID, "tags", tag)
}

func addTagURL(client *gophercloud.ServiceClient, projectID string, tag string) string {
return client.ServiceURL("projects", projectID, "tags", tag)
}

func deleteTagURL(client *gophercloud.ServiceClient, projectID string, tag string) string {
return client.ServiceURL("projects", projectID, "tags", tag)
}

0 comments on commit 713cad7

Please sign in to comment.