Initialize script to create org, partner and roles

We should probably have the role creation moved into adminsrv, but
since we are only creating new orgs like this as of now let us
continue with this.
This commit is contained in:
Abin Simon
2022-03-14 12:33:19 +05:30
parent b049ebaf28
commit 8184c23a8f
3 changed files with 102 additions and 126 deletions
@@ -40,7 +40,7 @@ func addResourcePermissions(dao pg.EntityDAO, basePath string) error {
}
}
fmt.Println("Adding", len(items), "resouces permissions")
fmt.Println("Adding", len(items), "resource permissions")
_, err = dao.Create(context.Background(), &items)
return err
}
@@ -1,125 +0,0 @@
package main
import (
"context"
"database/sql"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
"path"
"github.com/RafaySystems/rcloud-base/internal/models"
"github.com/RafaySystems/rcloud-base/internal/persistence/provider/pg"
"github.com/google/uuid"
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/pgdialect"
"github.com/uptrace/bun/driver/pgdriver"
)
func addRole(dao pg.EntityDAO, name string, scope string, orgId uuid.UUID, partnerId uuid.UUID, permissions []string) error {
entity, err := dao.GetM(context.Background(), map[string]interface{}{"name": name, "scope": scope, "organization_id": orgId, "partner_id": partnerId}, &models.Role{})
if err != nil && err.Error() != "sql: no rows in result set" {
return err
}
role := models.Role{
Name: name,
OrganizationId: orgId,
PartnerId: partnerId,
Scope: scope,
}
if r, ok := entity.(*models.Role); ok {
// I could technically do an update, but just to make it simpler
fmt.Printf("%v alrady exists, deleting and adding again\n", name)
err := dao.DeleteX(context.Background(), "resource_role_id", r.ID, &models.ResourceRolePermission{})
if err != nil {
log.Fatalf("unable to delete permissions for '%v'", name)
}
err = dao.Delete(context.Background(), r.ID, &models.Role{})
if err != nil {
log.Fatalf("unable to delete '%v'", name)
}
}
createdRole, err := dao.Create(context.Background(), &role)
if err != nil {
return err
}
if r, ok := createdRole.(*models.Role); ok {
for _, p := range permissions {
entity, err := dao.GetByName(context.Background(), p, &models.ResourcePermission{})
if err != nil {
log.Fatalf("unable to get rolepermission '%v'", p)
}
if rlp, ok := entity.(*models.ResourcePermission); ok {
rolepermissionmapping := models.ResourceRolePermission{
ResourceRoleId: r.ID,
ResourcePermissionId: rlp.ID,
}
_, err := dao.Create(context.Background(), &rolepermissionmapping)
if err != nil {
return err
}
} else {
log.Fatalf("unable to get rolepermission '%v'", p)
}
}
} else {
return fmt.Errorf("unable to create role")
}
return nil
}
func main() {
dsn := "postgres://admindbuser:admindbpassword@localhost:5432/admindb?sslmode=disable"
sqldb := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(dsn)))
db := bun.NewDB(sqldb, pgdialect.New())
// db.AddQueryHook(bundebug.NewQueryHook(
// bundebug.WithVerbose(true),
// bundebug.FromEnv("BUNDEBUG"),
// ))
dao := pg.NewEntityDAO(db)
if len(os.Args) != 3 {
// this step happens after org creation and so we will have org and partner id
log.Fatal("Usage: ", os.Args[0], " <organizatin_id> ", " <partner_id>")
}
content, err := ioutil.ReadFile(path.Join("scripts", "resourceroles", "data.json"))
if err != nil {
log.Fatal(err)
}
orgId, err := uuid.Parse(os.Args[1])
if err != nil {
log.Fatal(err)
}
partnerId, err := uuid.Parse(os.Args[2])
if err != nil {
log.Fatal(err)
}
var data map[string]map[string][]string
err = json.Unmarshal(content, &data)
if err != nil {
log.Fatal(err)
}
for scope := range data {
for name := range data[scope] {
perms := data[scope][name]
fmt.Println(scope, name, len(perms))
err := addRole(dao, name, scope, orgId, partnerId, perms)
if err != nil {
log.Fatal(err)
}
}
}
}
+101
View File
@@ -0,0 +1,101 @@
package main
import (
"context"
"database/sql"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
"path"
"github.com/RafaySystems/rcloud-base/pkg/enforcer"
"github.com/RafaySystems/rcloud-base/pkg/service"
commonv3 "github.com/RafaySystems/rcloud-base/proto/types/commonpb/v3"
rolev3 "github.com/RafaySystems/rcloud-base/proto/types/rolepb/v3"
systemv3 "github.com/RafaySystems/rcloud-base/proto/types/systempb/v3"
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/pgdialect"
"github.com/uptrace/bun/driver/pgdriver"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
// This script will be run in an init container after we crate all the
// permissions. It will take care of the initialization, namely:
// - creating partner
// - creating org
// - creating roles in org
//
// We make use of service instead of just insserting to db as that way
// all the dependent items will be taken care of automatically.
func main() {
if len(os.Args) != 3 {
// this step happens after org creation and so we will have org and partner id
log.Fatal("Usage: ", os.Args[0], " <organizatin_id> ", " <partner_id>")
}
org := os.Args[1]
partner := os.Args[2]
content, err := ioutil.ReadFile(path.Join("scripts", "resourceroles", "data.json"))
if err != nil {
log.Fatal("unable to read file: ", err)
}
var data map[string]map[string][]string
err = json.Unmarshal(content, &data)
if err != nil {
log.Fatal("unable to parse data file", err)
}
dsn := "postgres://admindbuser:admindbpassword@localhost:5432/admindb?sslmode=disable"
sqldb := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(dsn)))
db := bun.NewDB(sqldb, pgdialect.New())
// authz services
gormDb, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("unable to create db connection", "error", err)
}
enforcer, err := enforcer.NewCasbinEnforcer(gormDb).Init()
if err != nil {
log.Fatal("unable to init enforcer", "error", err)
}
as := service.NewAuthzService(gormDb, enforcer)
ps := service.NewPartnerService(db)
os := service.NewOrganizationService(db)
rs := service.NewRoleService(db, as)
_, err = ps.Create(context.Background(), &systemv3.Partner{
Metadata: &commonv3.Metadata{Name: partner, Description: "..."},
Spec: &systemv3.PartnerSpec{Host: ""},
})
if err != nil {
log.Fatal("unable to create partner", err)
}
_, err = os.Create(context.Background(), &systemv3.Organization{
Metadata: &commonv3.Metadata{Name: org, Partner: partner, Description: "..."},
Spec: &systemv3.OrganizationSpec{Active: true},
})
if err != nil {
log.Fatal("unable to create organization", err)
}
for scope := range data {
for name := range data[scope] {
perms := data[scope][name]
fmt.Println(scope, name, len(perms))
_, err := rs.Create(context.Background(), &rolev3.Role{
Metadata: &commonv3.Metadata{Name: name, Partner: partner, Organization: org, Description: "..."},
Spec: &rolev3.RoleSpec{IsGlobal: true, Scope: "cluster", Rolepermissions: perms}, // TODO: look into scope
})
if err != nil {
log.Fatal(err)
}
}
}
}