modify.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package nodeacls
  2. import (
  3. "github.com/gravitl/netmaker/database"
  4. "github.com/gravitl/netmaker/logic/acls"
  5. )
  6. // CreateNodeACL - inserts or updates a node ACL on given network and adds to state
  7. func CreateNodeACL(networkID NetworkID, nodeID NodeID, defaultVal byte) (acls.ACL, error) {
  8. var currentNetworkACL, err = FetchAllACLs(networkID)
  9. if err != nil {
  10. if database.IsEmptyRecord(err) {
  11. currentNetworkACL, err = currentNetworkACL.New(acls.ContainerID(networkID))
  12. if err != nil {
  13. return nil, err
  14. }
  15. } else {
  16. return nil, err
  17. }
  18. }
  19. var newNodeACL = make(acls.ACL)
  20. for existingNodeID := range currentNetworkACL {
  21. currentNetworkACL[existingNodeID][acls.AclID(nodeID)] = defaultVal // set the old nodes to default value for new node
  22. newNodeACL[existingNodeID] = defaultVal // set the old nodes in new node ACL to default value
  23. }
  24. currentNetworkACL[acls.AclID(nodeID)] = newNodeACL // append the new node's ACL
  25. retNetworkACL, err := currentNetworkACL.Save(acls.ContainerID(networkID)) // insert into db
  26. if err != nil {
  27. return nil, err
  28. }
  29. return retNetworkACL[acls.AclID(nodeID)], nil
  30. }
  31. // AllowNode - allow access between two nodes in memory
  32. func AllowNodes(networkID NetworkID, node1, node2 NodeID) (acls.ACLContainer, error) {
  33. container, err := FetchAllACLs(networkID)
  34. if err != nil {
  35. return nil, err
  36. }
  37. container[acls.AclID(node1)].Allow(acls.AclID(node2))
  38. container[acls.AclID(node2)].Allow(acls.AclID(node1))
  39. return container, nil
  40. }
  41. // DisallowNodes - deny access between two nodes
  42. func DisallowNodes(networkID NetworkID, node1, node2 NodeID) (acls.ACLContainer, error) {
  43. container, err := FetchAllACLs(networkID)
  44. if err != nil {
  45. return nil, err
  46. }
  47. container[acls.AclID(node1)].Disallow(acls.AclID(node2))
  48. container[acls.AclID(node2)].Disallow(acls.AclID(node1))
  49. return container, nil
  50. }
  51. // UpdateNodeACL - updates a node's ACL in state
  52. func UpdateNodeACL(networkID NetworkID, nodeID NodeID, acl acls.ACL) (acls.ACL, error) {
  53. var currentNetworkACL, err = FetchAllACLs(networkID)
  54. if err != nil {
  55. return nil, err
  56. }
  57. currentNetworkACL[acls.AclID(nodeID)] = acl
  58. return currentNetworkACL[acls.AclID(nodeID)].Save(acls.ContainerID(networkID), acls.AclID(nodeID))
  59. }
  60. // RemoveNodeACL - removes a specific Node's ACL, returns the NetworkACL and error
  61. func RemoveNodeACL(networkID NetworkID, nodeID NodeID) (acls.ACLContainer, error) {
  62. var currentNetworkACL, err = FetchAllACLs(networkID)
  63. if err != nil {
  64. return nil, err
  65. }
  66. for currentNodeID := range currentNetworkACL {
  67. if NodeID(currentNodeID) != nodeID {
  68. currentNetworkACL[currentNodeID].Remove(acls.AclID(nodeID))
  69. }
  70. }
  71. delete(currentNetworkACL, acls.AclID(nodeID))
  72. return currentNetworkACL.Save(acls.ContainerID(networkID))
  73. }
  74. // DeleteACLContainer - removes an ACLContainer state from db
  75. func DeleteACLContainer(network NetworkID) error {
  76. err := database.DeleteRecord(database.NODE_ACLS_TABLE_NAME, string(network))
  77. if err != nil {
  78. return err
  79. }
  80. acls.DeleteAclFromCache(acls.ContainerID(network))
  81. return nil
  82. }