main.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gophercloud/gophercloud/openstack/identity/v3/projects"
  5. "github.com/gophercloud/gophercloud/openstack/identity/v3/roles"
  6. )
  7. func main() {
  8. osclient := initIdentityClient()
  9. fmt.Println("Syncing projects...")
  10. osclient.syncProjects()
  11. // fmt.Println("Deleting projects...")
  12. // osclient.deleteAllProjects()
  13. fmt.Println("Syncing role assignments...")
  14. osclient.syncRoleAssignments()
  15. // fmt.Println("Deleting role assignments...")
  16. // osclient.deleteAllRoleAssignments()
  17. }
  18. func (osclient OpenstackIdentityClient) syncProjects() {
  19. allUnits := getCleanUnitsPersNumberMap(osclient.config)
  20. allProjects := osclient.getProjectsMap()
  21. for persNumber, unit := range allUnits {
  22. if _, ok := allProjects[persNumber]; ok {
  23. updateOpts := makeUpdateOpts(unit, osclient.domainID)
  24. projectID := allProjects[persNumber].ID
  25. updateResult := projects.Update(osclient.client, projectID, updateOpts)
  26. checkErr(updateResult.Err)
  27. fmt.Printf("Project \"%s\" updated\n", *unit.BriefName)
  28. } else {
  29. createOpts := makeCreateOpts(unit, osclient.domainID)
  30. createResult := projects.Create(osclient.client, createOpts)
  31. checkErr(createResult.Err)
  32. fmt.Printf("Project \"%s\" created\n", *unit.BriefName)
  33. }
  34. }
  35. }
  36. func (osclient OpenstackIdentityClient) deleteAllProjects() {
  37. allProjects := osclient.getProjectsMap()
  38. index := 1
  39. amount := len(allProjects)
  40. for _, project := range allProjects {
  41. deleteResult := projects.Delete(osclient.client, project.ID)
  42. checkErr(deleteResult.ExtractErr())
  43. fmt.Printf("[%v/%v] Project \"%s\" deleted\n", index, amount, project.Name)
  44. index++
  45. }
  46. }
  47. func (osclient OpenstackIdentityClient) syncRoleAssignments() {
  48. osclient.deleteAllRoleAssignments()
  49. openstackProjects := osclient.getProjectsMap()
  50. openstackUsers := osclient.getOpenstackUsersMap()
  51. units := getCleanUnitsCodeMap(osclient.config)
  52. people := getPeopleMap(osclient.config)
  53. roleList := getRoles(osclient.config)
  54. for _, role := range roleList {
  55. // Get project ID from unit code
  56. unitCode := unitCodeToInt(role.Extra)
  57. unit := units[unitCode]
  58. // Check if unit doesn't exist in units map
  59. if unit.Id == 0 {
  60. continue
  61. }
  62. projectID := openstackProjects[*unit.PersNumber].ID
  63. person := people[role.PersonId]
  64. var userID string
  65. for _, login := range person.Logins {
  66. user := openstackUsers[login]
  67. if user.ID != "" {
  68. userID = user.ID
  69. break
  70. }
  71. }
  72. // Check if user doesn't exist in Openstack
  73. if userID == "" {
  74. continue
  75. }
  76. assignOpts := roles.AssignOpts{
  77. UserID: userID,
  78. ProjectID: projectID,
  79. }
  80. var roleID string
  81. if role.RoleName == "openstack_admin" {
  82. roleID = osclient.adminRoleID
  83. } else {
  84. roleID = osclient.userRoleID
  85. }
  86. assignmentResult := roles.Assign(osclient.client, roleID, assignOpts)
  87. checkErr(assignmentResult.ExtractErr())
  88. fmt.Printf("Role %s on project %s assigned to %s\n", roleID, projectID, userID)
  89. }
  90. }
  91. func (osclient OpenstackIdentityClient) deleteAllRoleAssignments() {
  92. listAssignmentsOpts := roles.ListAssignmentsOpts{
  93. RoleID: osclient.userRoleID,
  94. }
  95. allPages, err := roles.ListAssignments(osclient.client, listAssignmentsOpts).AllPages()
  96. checkErr(err)
  97. allRoleAssignments, err := roles.ExtractRoleAssignments(allPages)
  98. checkErr(err)
  99. index := 1
  100. amount := len(allRoleAssignments)
  101. for _, roleAssignment := range allRoleAssignments {
  102. unassignOpts := roles.UnassignOpts{
  103. UserID: roleAssignment.User.ID,
  104. ProjectID: roleAssignment.Scope.Project.ID,
  105. }
  106. unassignmentResult := roles.Unassign(osclient.client, osclient.userRoleID, unassignOpts)
  107. checkErr(unassignmentResult.ExtractErr())
  108. fmt.Printf("[%v/%v] Role of user %s on project %s deleted\n", index, amount, roleAssignment.User.ID, roleAssignment.Scope.Project.ID)
  109. index++
  110. }
  111. }