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