diff --git a/components/infra-proxy-service/migrations/pipeline/utility.go b/components/infra-proxy-service/migrations/pipeline/utility.go index 64ca6d5d9db..dbcc8411345 100644 --- a/components/infra-proxy-service/migrations/pipeline/utility.go +++ b/components/infra-proxy-service/migrations/pipeline/utility.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/chef/automate/api/interservice/authz" "io/ioutil" "os" "path" @@ -13,7 +14,7 @@ import ( ) // StoreOrgs reads the Result struct and populate the orgs table -func StoreOrgs(ctx context.Context, st storage.Storage, mst storage.MigrationStorage, res Result) (Result, error) { +func StoreOrgs(ctx context.Context, st storage.Storage, mst storage.MigrationStorage, authzProjectClient authz.ProjectsServiceClient, res Result) (Result, error) { var err error var msg string var totalSucceeded, totalSkipped, totalFailed int64 @@ -23,7 +24,7 @@ func StoreOrgs(ctx context.Context, st storage.Storage, mst storage.MigrationSto } log.Info("Starting the organisation migration phase for migration id: ", res.Meta.MigrationID) for _, org := range res.ParsedResult.Orgs { - err, _ = StoreOrg(ctx, st, org, res.Meta.ServerID) + err, _ = StoreOrg(ctx, st, org, res.Meta.ServerID, authzProjectClient) if err != nil { totalFailed++ msg = err.Error() @@ -50,12 +51,17 @@ func StoreOrgs(ctx context.Context, st storage.Storage, mst storage.MigrationSto } // StoreOrg stores a single Org into DB -func StoreOrg(ctx context.Context, st storage.Storage, org Org, serverID string) (error, ActionOps) { +func StoreOrg(ctx context.Context, st storage.Storage, org Org, serverID string, authzProjectClient authz.ProjectsServiceClient) (error, ActionOps) { var actionTaken ActionOps var err error switch org.ActionOps { case Insert: - _, err = st.StoreOrg(ctx, org.Name, org.FullName, "", "", serverID, nil) + projects, err := createProjectFromOrgIdAndServerID(ctx, serverID, org.Name, authzProjectClient) + if err != nil { + log.Errorf("Unable to create project for serverid: %s", serverID) + return err, actionTaken + } + _, err = st.StoreOrg(ctx, org.Name, org.FullName, "", "", serverID, projects) actionTaken = Insert case Delete: _, err = st.DeleteOrg(ctx, org.Name, serverID) @@ -68,6 +74,23 @@ func StoreOrg(ctx context.Context, st storage.Storage, org Org, serverID string) return err, actionTaken } +//function to create a new iam project for each client +func createProjectFromOrgIdAndServerID(ctx context.Context, serverId string, orgId string, authzProjectClient authz.ProjectsServiceClient) ([]string, error) { + + newProject := &authz.CreateProjectReq{ + Name: serverId + "_" + orgId, + Id: serverId + "_" + orgId, + SkipPolicies: false, + } + + projectID, err := authzProjectClient.CreateProject(ctx, newProject) + if err != nil { + return nil, err + } + + return []string{projectID.Project.Name}, nil +} + func ParseOrgs(ctx context.Context, st storage.Storage, mst storage.MigrationStorage, result Result) (Result, error) { var err error log.Info("Starting with organisation parsing phase for migration id: ", result.Meta.MigrationID) diff --git a/components/infra-proxy-service/migrations/pipeline/utility_test.go b/components/infra-proxy-service/migrations/pipeline/utility_test.go index a7906708861..c0941874ffb 100644 --- a/components/infra-proxy-service/migrations/pipeline/utility_test.go +++ b/components/infra-proxy-service/migrations/pipeline/utility_test.go @@ -2,8 +2,10 @@ package pipeline import ( "context" + "github.com/chef/automate/api/interservice/authz" "github.com/chef/automate/components/infra-proxy-service/storage" "github.com/chef/automate/components/infra-proxy-service/storage/testDB" + "github.com/golang/mock/gomock" "github.com/pkg/errors" "reflect" "testing" @@ -11,25 +13,40 @@ import ( func TestStoreOrg(t *testing.T) { type args struct { - ctx context.Context - st storage.Storage - org Org - serverID string + ctx context.Context + st storage.Storage + org Org + serverID string + authzMock *authz.MockProjectsServiceClient } tests := []struct { - name string - args args - want error - want1 ActionOps + name string + errorFromProject bool + args args + want error + want1 ActionOps }{ - {name: "Test Delete Org", args: args{ctx: context.Background(), st: &testDB.TestDB{}, org: Org{Name: "org3", FullName: "Org 1", ActionOps: Delete}, serverID: "server1"}, want: nil, want1: Delete}, - {name: "Test Store Org", args: args{ctx: context.Background(), st: &testDB.TestDB{}, org: Org{Name: "org2", FullName: "Org 2", ActionOps: Insert}, serverID: "server1"}, want: nil, want1: Insert}, - {name: "Test Edit Org", args: args{ctx: context.Background(), st: &testDB.TestDB{}, org: Org{Name: "org3", FullName: "Org 3", ActionOps: Update}, serverID: "server1"}, want: nil, want1: Update}, + {name: "Test Delete Org", errorFromProject: false, args: args{ctx: context.Background(), st: &testDB.TestDB{}, org: Org{Name: "org3", FullName: "Org 1", ActionOps: Delete}, serverID: "server1", authzMock: authz.NewMockProjectsServiceClient(gomock.NewController(t))}, want: nil, want1: Delete}, + {name: "Test Store Org", errorFromProject: false, args: args{ctx: context.Background(), st: &testDB.TestDB{}, org: Org{Name: "org2", FullName: "Org 2", ActionOps: Insert}, serverID: "server1", authzMock: authz.NewMockProjectsServiceClient(gomock.NewController(t))}, want: nil, want1: Insert}, + {name: "Test Edit Org", errorFromProject: false, args: args{ctx: context.Background(), st: &testDB.TestDB{}, org: Org{Name: "org3", FullName: "Org 3", ActionOps: Update}, serverID: "server1", authzMock: authz.NewMockProjectsServiceClient(gomock.NewController(t))}, want: nil, want1: Update}, + {name: "Test Create Project Error", errorFromProject: true, args: args{ctx: context.Background(), st: &testDB.TestDB{}, org: Org{Name: "org3", FullName: "Org 3", ActionOps: Insert}, serverID: "server1", authzMock: authz.NewMockProjectsServiceClient(gomock.NewController(t))}, want: errors.New("Project already exists"), want1: 0}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, got1 := StoreOrg(tt.args.ctx, tt.args.st, tt.args.org, tt.args.serverID) - if !reflect.DeepEqual(got, tt.want) { + projectResponse := &authz.CreateProjectResp{ + Project: &authz.Project{ + Id: "testId", + Name: "test_name", + Status: "test_status", + }, + } + if tt.errorFromProject { + tt.args.authzMock.EXPECT().CreateProject(tt.args.ctx, gomock.Any(), gomock.Any()).Return(nil, errors.New("Project already exists")) + } else { + tt.args.authzMock.EXPECT().CreateProject(tt.args.ctx, gomock.Any(), gomock.Any()).Return(projectResponse, nil) + } + got, got1 := StoreOrg(tt.args.ctx, tt.args.st, tt.args.org, tt.args.serverID, tt.args.authzMock) + if got != nil && got.Error() != tt.want.Error() { t.Errorf("StoreOrg() got = %v, want %v", got, tt.want) } if got1 != tt.want1 {