1// +build acceptance
2
3package v3
4
5import (
6	"testing"
7
8	"github.com/gophercloud/gophercloud/acceptance/clients"
9	"github.com/gophercloud/gophercloud/acceptance/tools"
10	"github.com/gophercloud/gophercloud/openstack/identity/v3/projects"
11	th "github.com/gophercloud/gophercloud/testhelper"
12)
13
14func TestProjectsListAvailable(t *testing.T) {
15	clients.RequireNonAdmin(t)
16
17	client, err := clients.NewIdentityV3Client()
18	th.AssertNoErr(t, err)
19
20	allPages, err := projects.ListAvailable(client).AllPages()
21	th.AssertNoErr(t, err)
22
23	allProjects, err := projects.ExtractProjects(allPages)
24	th.AssertNoErr(t, err)
25
26	for _, project := range allProjects {
27		tools.PrintResource(t, project)
28	}
29}
30
31func TestProjectsList(t *testing.T) {
32	clients.RequireAdmin(t)
33
34	client, err := clients.NewIdentityV3Client()
35	th.AssertNoErr(t, err)
36
37	var iTrue bool = true
38	listOpts := projects.ListOpts{
39		Enabled: &iTrue,
40	}
41
42	allPages, err := projects.List(client, listOpts).AllPages()
43	th.AssertNoErr(t, err)
44
45	allProjects, err := projects.ExtractProjects(allPages)
46	th.AssertNoErr(t, err)
47
48	var found bool
49	for _, project := range allProjects {
50		tools.PrintResource(t, project)
51
52		if project.Name == "admin" {
53			found = true
54		}
55	}
56
57	th.AssertEquals(t, found, true)
58
59	listOpts.Filters = map[string]string{
60		"name__contains": "dmi",
61	}
62
63	allPages, err = projects.List(client, listOpts).AllPages()
64	th.AssertNoErr(t, err)
65
66	allProjects, err = projects.ExtractProjects(allPages)
67	th.AssertNoErr(t, err)
68
69	found = false
70	for _, project := range allProjects {
71		tools.PrintResource(t, project)
72
73		if project.Name == "admin" {
74			found = true
75		}
76	}
77
78	th.AssertEquals(t, found, true)
79
80	listOpts.Filters = map[string]string{
81		"name__contains": "foo",
82	}
83
84	allPages, err = projects.List(client, listOpts).AllPages()
85	th.AssertNoErr(t, err)
86
87	allProjects, err = projects.ExtractProjects(allPages)
88	th.AssertNoErr(t, err)
89
90	found = false
91	for _, project := range allProjects {
92		tools.PrintResource(t, project)
93
94		if project.Name == "admin" {
95			found = true
96		}
97	}
98
99	th.AssertEquals(t, found, false)
100}
101
102func TestProjectsGet(t *testing.T) {
103	clients.RequireAdmin(t)
104
105	client, err := clients.NewIdentityV3Client()
106	th.AssertNoErr(t, err)
107
108	allPages, err := projects.List(client, nil).AllPages()
109	th.AssertNoErr(t, err)
110
111	allProjects, err := projects.ExtractProjects(allPages)
112	th.AssertNoErr(t, err)
113
114	project := allProjects[0]
115	p, err := projects.Get(client, project.ID).Extract()
116	if err != nil {
117		t.Fatalf("Unable to get project: %v", err)
118	}
119
120	tools.PrintResource(t, p)
121
122	th.AssertEquals(t, project.Name, p.Name)
123}
124
125func TestProjectsCRUD(t *testing.T) {
126	clients.RequireAdmin(t)
127
128	client, err := clients.NewIdentityV3Client()
129	th.AssertNoErr(t, err)
130
131	project, err := CreateProject(t, client, nil)
132	th.AssertNoErr(t, err)
133	defer DeleteProject(t, client, project.ID)
134
135	tools.PrintResource(t, project)
136
137	description := ""
138	iFalse := false
139	updateOpts := projects.UpdateOpts{
140		Description: &description,
141		Enabled:     &iFalse,
142	}
143
144	updatedProject, err := projects.Update(client, project.ID, updateOpts).Extract()
145	th.AssertNoErr(t, err)
146
147	tools.PrintResource(t, updatedProject)
148	th.AssertEquals(t, updatedProject.Description, description)
149	th.AssertEquals(t, updatedProject.Enabled, iFalse)
150}
151
152func TestProjectsDomain(t *testing.T) {
153	clients.RequireAdmin(t)
154
155	client, err := clients.NewIdentityV3Client()
156	th.AssertNoErr(t, err)
157
158	var iTrue = true
159	createOpts := projects.CreateOpts{
160		IsDomain: &iTrue,
161	}
162
163	projectDomain, err := CreateProject(t, client, &createOpts)
164	th.AssertNoErr(t, err)
165	defer DeleteProject(t, client, projectDomain.ID)
166
167	tools.PrintResource(t, projectDomain)
168
169	createOpts = projects.CreateOpts{
170		DomainID: projectDomain.ID,
171	}
172
173	project, err := CreateProject(t, client, &createOpts)
174	th.AssertNoErr(t, err)
175	defer DeleteProject(t, client, project.ID)
176
177	tools.PrintResource(t, project)
178
179	th.AssertEquals(t, project.DomainID, projectDomain.ID)
180
181	var iFalse = false
182	updateOpts := projects.UpdateOpts{
183		Enabled: &iFalse,
184	}
185
186	_, err = projects.Update(client, projectDomain.ID, updateOpts).Extract()
187	th.AssertNoErr(t, err)
188}
189
190func TestProjectsNested(t *testing.T) {
191	clients.RequireAdmin(t)
192
193	client, err := clients.NewIdentityV3Client()
194	th.AssertNoErr(t, err)
195
196	projectMain, err := CreateProject(t, client, nil)
197	th.AssertNoErr(t, err)
198	defer DeleteProject(t, client, projectMain.ID)
199
200	tools.PrintResource(t, projectMain)
201
202	createOpts := projects.CreateOpts{
203		ParentID: projectMain.ID,
204	}
205
206	project, err := CreateProject(t, client, &createOpts)
207	th.AssertNoErr(t, err)
208	defer DeleteProject(t, client, project.ID)
209
210	tools.PrintResource(t, project)
211
212	th.AssertEquals(t, project.ParentID, projectMain.ID)
213}
214
215func TestProjectsTags(t *testing.T) {
216	clients.SkipRelease(t, "stable/mitaka")
217	clients.SkipRelease(t, "stable/newton")
218	clients.SkipRelease(t, "stable/ocata")
219	clients.RequireAdmin(t)
220
221	client, err := clients.NewIdentityV3Client()
222	th.AssertNoErr(t, err)
223
224	createOpts := projects.CreateOpts{
225		Tags: []string{"Tag1", "Tag2"},
226	}
227
228	projectMain, err := CreateProject(t, client, &createOpts)
229	th.AssertNoErr(t, err)
230	defer DeleteProject(t, client, projectMain.ID)
231
232	// Search using all tags
233	listOpts := projects.ListOpts{
234		Tags: "Tag1,Tag2",
235	}
236
237	allPages, err := projects.List(client, listOpts).AllPages()
238	th.AssertNoErr(t, err)
239
240	allProjects, err := projects.ExtractProjects(allPages)
241	th.AssertNoErr(t, err)
242
243	found := false
244	for _, project := range allProjects {
245		tools.PrintResource(t, project)
246
247		if project.Name == projectMain.Name {
248			found = true
249		}
250	}
251
252	th.AssertEquals(t, found, true)
253
254	// Search using all tags, including a not existing one
255	listOpts = projects.ListOpts{
256		Tags: "Tag1,Tag2,Tag3",
257	}
258
259	allPages, err = projects.List(client, listOpts).AllPages()
260	th.AssertNoErr(t, err)
261
262	allProjects, err = projects.ExtractProjects(allPages)
263	th.AssertNoErr(t, err)
264
265	th.AssertEquals(t, len(allProjects), 0)
266
267	// Search matching at least one tag
268	listOpts = projects.ListOpts{
269		TagsAny: "Tag1,Tag2,Tag3",
270	}
271
272	allPages, err = projects.List(client, listOpts).AllPages()
273	th.AssertNoErr(t, err)
274
275	allProjects, err = projects.ExtractProjects(allPages)
276	th.AssertNoErr(t, err)
277
278	found = false
279	for _, project := range allProjects {
280		tools.PrintResource(t, project)
281
282		if project.Name == projectMain.Name {
283			found = true
284		}
285	}
286
287	th.AssertEquals(t, found, true)
288
289	// Search not matching any single tag
290	listOpts = projects.ListOpts{
291		NotTagsAny: "Tag1",
292	}
293
294	allPages, err = projects.List(client, listOpts).AllPages()
295	th.AssertNoErr(t, err)
296
297	allProjects, err = projects.ExtractProjects(allPages)
298	th.AssertNoErr(t, err)
299
300	found = false
301	for _, project := range allProjects {
302		tools.PrintResource(t, project)
303
304		if project.Name == projectMain.Name {
305			found = true
306		}
307	}
308
309	th.AssertEquals(t, found, false)
310
311	// Search matching not all tags
312	listOpts = projects.ListOpts{
313		NotTags: "Tag1,Tag2,Tag3",
314	}
315
316	allPages, err = projects.List(client, listOpts).AllPages()
317	th.AssertNoErr(t, err)
318
319	allProjects, err = projects.ExtractProjects(allPages)
320	th.AssertNoErr(t, err)
321
322	found = false
323	for _, project := range allProjects {
324		tools.PrintResource(t, project)
325
326		if project.Name == "admin" {
327			found = true
328		}
329	}
330
331	th.AssertEquals(t, found, true)
332
333	// Update the tags
334	updateOpts := projects.UpdateOpts{
335		Tags: &[]string{"Tag1"},
336	}
337
338	updatedProject, err := projects.Update(client, projectMain.ID, updateOpts).Extract()
339	th.AssertNoErr(t, err)
340
341	tools.PrintResource(t, updatedProject)
342	th.AssertEquals(t, len(updatedProject.Tags), 1)
343	th.AssertEquals(t, updatedProject.Tags[0], "Tag1")
344
345	// Update the project, but not its tags
346	description := "Test description"
347	updateOpts = projects.UpdateOpts{
348		Description: &description,
349	}
350
351	updatedProject, err = projects.Update(client, projectMain.ID, updateOpts).Extract()
352	th.AssertNoErr(t, err)
353
354	tools.PrintResource(t, updatedProject)
355	th.AssertEquals(t, len(updatedProject.Tags), 1)
356	th.AssertEquals(t, updatedProject.Tags[0], "Tag1")
357
358	// Remove all Tags
359	updateOpts = projects.UpdateOpts{
360		Tags: &[]string{},
361	}
362
363	updatedProject, err = projects.Update(client, projectMain.ID, updateOpts).Extract()
364	th.AssertNoErr(t, err)
365
366	tools.PrintResource(t, updatedProject)
367	th.AssertEquals(t, len(updatedProject.Tags), 0)
368}
369