2
0

migrate.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. package logic
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/google/uuid"
  6. "github.com/gravitl/netmaker/database"
  7. "github.com/gravitl/netmaker/logic"
  8. "github.com/gravitl/netmaker/models"
  9. )
  10. func MigrateToUUIDs() {
  11. roles, err := ListNetworkRoles()
  12. if err != nil {
  13. return
  14. }
  15. rolesMapping := make(map[models.UserRoleID]models.UserRoleID)
  16. for _, role := range roles {
  17. if role.Default {
  18. continue
  19. }
  20. _, err := uuid.Parse(string(role.ID))
  21. if err == nil {
  22. // role id is already an uuid, so no need to update
  23. continue
  24. }
  25. oldRoleID := role.ID
  26. role.ID = models.UserRoleID(uuid.NewString())
  27. rolesMapping[oldRoleID] = role.ID
  28. roleBytes, err := json.Marshal(role)
  29. if err != nil {
  30. continue
  31. }
  32. err = database.Insert(role.ID.String(), string(roleBytes), database.USER_PERMISSIONS_TABLE_NAME)
  33. if err != nil {
  34. continue
  35. }
  36. err = database.DeleteRecord(database.USER_PERMISSIONS_TABLE_NAME, oldRoleID.String())
  37. if err != nil {
  38. continue
  39. }
  40. }
  41. groups, err := ListUserGroups()
  42. if err != nil {
  43. return
  44. }
  45. groupsMapping := make(map[models.UserGroupID]models.UserGroupID)
  46. for _, group := range groups {
  47. if group.Default {
  48. continue
  49. }
  50. _, err := uuid.Parse(string(group.ID))
  51. if err == nil {
  52. // group id is already an uuid, so no need to update
  53. continue
  54. }
  55. oldGroupID := group.ID
  56. group.ID = models.UserGroupID(uuid.NewString())
  57. groupsMapping[oldGroupID] = group.ID
  58. var groupPermissions = make(map[models.NetworkID]map[models.UserRoleID]struct{})
  59. for networkID, networkRoles := range group.NetworkRoles {
  60. groupPermissions[networkID] = make(map[models.UserRoleID]struct{})
  61. for roleID := range networkRoles {
  62. newRoleID, ok := rolesMapping[roleID]
  63. if !ok {
  64. groupPermissions[networkID][roleID] = struct{}{}
  65. } else {
  66. groupPermissions[networkID][newRoleID] = struct{}{}
  67. }
  68. }
  69. }
  70. group.NetworkRoles = groupPermissions
  71. groupBytes, err := json.Marshal(group)
  72. if err != nil {
  73. continue
  74. }
  75. err = database.Insert(group.ID.String(), string(groupBytes), database.USER_GROUPS_TABLE_NAME)
  76. if err != nil {
  77. continue
  78. }
  79. err = database.DeleteRecord(database.USER_GROUPS_TABLE_NAME, oldGroupID.String())
  80. if err != nil {
  81. continue
  82. }
  83. }
  84. // if no changes were made, there are no references to be updated.
  85. if len(rolesMapping) == 0 && len(groupsMapping) == 0 {
  86. return
  87. }
  88. users, err := logic.GetUsersDB()
  89. if err != nil {
  90. return
  91. }
  92. for _, user := range users {
  93. userGroups := make(map[models.UserGroupID]struct{})
  94. for groupID := range user.UserGroups {
  95. newGroupID, ok := groupsMapping[groupID]
  96. if !ok {
  97. userGroups[groupID] = struct{}{}
  98. } else {
  99. userGroups[newGroupID] = struct{}{}
  100. }
  101. }
  102. user.UserGroups = userGroups
  103. err = logic.UpsertUser(user)
  104. if err != nil {
  105. continue
  106. }
  107. }
  108. for _, acl := range logic.ListAcls() {
  109. srcList := make([]models.AclPolicyTag, len(acl.Src))
  110. for i, src := range acl.Src {
  111. if src.ID == models.UserGroupAclID {
  112. newGroupID, ok := groupsMapping[models.UserGroupID(src.Value)]
  113. if ok {
  114. src.Value = newGroupID.String()
  115. }
  116. }
  117. srcList[i] = src
  118. }
  119. dstList := make([]models.AclPolicyTag, len(acl.Dst))
  120. for i, dst := range acl.Dst {
  121. if dst.ID == models.UserGroupAclID {
  122. newGroupID, ok := groupsMapping[models.UserGroupID(dst.Value)]
  123. if ok {
  124. dst.Value = newGroupID.String()
  125. }
  126. }
  127. dstList[i] = dst
  128. }
  129. err = logic.UpsertAcl(acl)
  130. if err != nil {
  131. continue
  132. }
  133. }
  134. invites, err := logic.ListUserInvites()
  135. if err != nil {
  136. return
  137. }
  138. for _, invite := range invites {
  139. userGroups := make(map[models.UserGroupID]struct{})
  140. for groupID := range invite.UserGroups {
  141. newGroupID, ok := groupsMapping[groupID]
  142. if !ok {
  143. invite.UserGroups[groupID] = struct{}{}
  144. } else {
  145. invite.UserGroups[newGroupID] = struct{}{}
  146. }
  147. }
  148. invite.UserGroups = userGroups
  149. userPermissions := make(map[models.NetworkID]map[models.UserRoleID]struct{})
  150. for networkID, networkRoles := range invite.NetworkRoles {
  151. userPermissions[networkID] = make(map[models.UserRoleID]struct{})
  152. for roleID := range networkRoles {
  153. newRoleID, ok := rolesMapping[roleID]
  154. if !ok {
  155. userPermissions[networkID][roleID] = struct{}{}
  156. } else {
  157. userPermissions[networkID][newRoleID] = struct{}{}
  158. }
  159. }
  160. }
  161. invite.NetworkRoles = userPermissions
  162. err = logic.InsertUserInvite(invite)
  163. if err != nil {
  164. continue
  165. }
  166. }
  167. }
  168. func MigrateUserRoleAndGroups(user models.User) {
  169. if user.PlatformRoleID == models.AdminRole || user.PlatformRoleID == models.SuperAdminRole {
  170. return
  171. }
  172. if len(user.RemoteGwIDs) > 0 {
  173. // define user roles for network
  174. // assign relevant network role to user
  175. for remoteGwID := range user.RemoteGwIDs {
  176. gwNode, err := logic.GetNodeByID(remoteGwID)
  177. if err != nil {
  178. continue
  179. }
  180. var groupID models.UserGroupID
  181. if user.PlatformRoleID == models.ServiceUser {
  182. groupID = GetDefaultNetworkUserGroupID(models.NetworkID(gwNode.Network))
  183. } else {
  184. groupID = GetDefaultNetworkAdminGroupID(models.NetworkID(gwNode.Network))
  185. }
  186. if err != nil {
  187. continue
  188. }
  189. user.UserGroups[groupID] = struct{}{}
  190. }
  191. }
  192. if len(user.NetworkRoles) > 0 {
  193. for netID, netRoles := range user.NetworkRoles {
  194. var groupID models.UserGroupID
  195. adminAccess := false
  196. for netRoleID := range netRoles {
  197. permTemplate, err := logic.GetRole(netRoleID)
  198. if err == nil {
  199. if permTemplate.FullAccess {
  200. adminAccess = true
  201. }
  202. }
  203. }
  204. if user.PlatformRoleID == models.ServiceUser {
  205. groupID = GetDefaultNetworkUserGroupID(netID)
  206. } else {
  207. if adminAccess {
  208. groupID = GetDefaultNetworkAdminGroupID(netID)
  209. } else {
  210. groupID = GetDefaultNetworkUserGroupID(netID)
  211. }
  212. }
  213. user.UserGroups[groupID] = struct{}{}
  214. user.NetworkRoles = make(map[models.NetworkID]map[models.UserRoleID]struct{})
  215. }
  216. }
  217. logic.UpsertUser(user)
  218. }
  219. func MigrateToGws() {
  220. nodes, err := logic.GetAllNodes()
  221. if err != nil {
  222. return
  223. }
  224. for _, node := range nodes {
  225. if node.IsIngressGateway || node.IsRelay || node.IsInternetGateway {
  226. node.IsGw = true
  227. node.IsIngressGateway = true
  228. node.IsRelay = true
  229. if node.Tags == nil {
  230. node.Tags = make(map[models.TagID]struct{})
  231. }
  232. node.Tags[models.TagID(fmt.Sprintf("%s.%s", node.Network, models.GwTagName))] = struct{}{}
  233. delete(node.Tags, models.TagID(fmt.Sprintf("%s.%s", node.Network, models.OldRemoteAccessTagName)))
  234. logic.UpsertNode(&node)
  235. }
  236. if node.IsInternetGateway && len(node.InetNodeReq.InetNodeClientIDs) > 0 {
  237. node.RelayedNodes = append(node.RelayedNodes, node.InetNodeReq.InetNodeClientIDs...)
  238. node.RelayedNodes = logic.UniqueStrings(node.RelayedNodes)
  239. for _, nodeID := range node.InetNodeReq.InetNodeClientIDs {
  240. relayedNode, err := logic.GetNodeByID(nodeID)
  241. if err == nil {
  242. relayedNode.IsRelayed = true
  243. relayedNode.RelayedBy = node.ID.String()
  244. logic.UpsertNode(&relayedNode)
  245. }
  246. }
  247. logic.UpsertNode(&node)
  248. }
  249. }
  250. acls := logic.ListAcls()
  251. for _, acl := range acls {
  252. upsert := false
  253. for i, srcI := range acl.Src {
  254. if srcI.ID == models.NodeTagID && srcI.Value == fmt.Sprintf("%s.%s", acl.NetworkID.String(), models.OldRemoteAccessTagName) {
  255. srcI.Value = fmt.Sprintf("%s.%s", acl.NetworkID.String(), models.GwTagName)
  256. acl.Src[i] = srcI
  257. upsert = true
  258. }
  259. }
  260. for i, dstI := range acl.Dst {
  261. if dstI.ID == models.NodeTagID && dstI.Value == fmt.Sprintf("%s.%s", acl.NetworkID.String(), models.OldRemoteAccessTagName) {
  262. dstI.Value = fmt.Sprintf("%s.%s", acl.NetworkID.String(), models.GwTagName)
  263. acl.Dst[i] = dstI
  264. upsert = true
  265. }
  266. }
  267. if upsert {
  268. logic.UpsertAcl(acl)
  269. }
  270. }
  271. nets, _ := logic.GetNetworks()
  272. for _, netI := range nets {
  273. DeleteTag(models.TagID(fmt.Sprintf("%s.%s", netI.NetID, models.OldRemoteAccessTagName)), true)
  274. }
  275. }