many incidents

This commit is contained in:
jules 2023-10-10 16:31:42 -07:00
parent 3656e04676
commit b093334dce
5 changed files with 108 additions and 15 deletions

View File

@ -186,15 +186,15 @@ func (suite *SharePointIntegrationSuite) SetupSuite() {
si := NewSuiteInfoImpl(suite.T(), ctx, tconfig.M365SiteID(suite.T()), path.SharePointService) si := NewSuiteInfoImpl(suite.T(), ctx, tconfig.M365SiteID(suite.T()), path.SharePointService)
// users needed for permissions // users needed for permissions
user, err := si.controller.AC.Users().GetByID(ctx, si.user) user, err := si.controller.AC.Users().IsLicenseReconciliationNeeded(ctx, si.user)
require.NoError(t, err, "fetching user", si.user, clues.ToCore(err)) require.NoError(t, err, "fetching user", si.user, clues.ToCore(err))
si.userID = ptr.Val(user.GetId()) si.userID = ptr.Val(user.GetId())
secondaryUser, err := si.controller.AC.Users().GetByID(ctx, si.secondaryUser) secondaryUser, err := si.controller.AC.Users().IsLicenseReconciliationNeeded(ctx, si.secondaryUser)
require.NoError(t, err, "fetching user", si.secondaryUser, clues.ToCore(err)) require.NoError(t, err, "fetching user", si.secondaryUser, clues.ToCore(err))
si.secondaryUserID = ptr.Val(secondaryUser.GetId()) si.secondaryUserID = ptr.Val(secondaryUser.GetId())
tertiaryUser, err := si.controller.AC.Users().GetByID(ctx, si.tertiaryUser) tertiaryUser, err := si.controller.AC.Users().IsLicenseReconciliationNeeded(ctx, si.tertiaryUser)
require.NoError(t, err, "fetching user", si.tertiaryUser, clues.ToCore(err)) require.NoError(t, err, "fetching user", si.tertiaryUser, clues.ToCore(err))
si.tertiaryUserID = ptr.Val(tertiaryUser.GetId()) si.tertiaryUserID = ptr.Val(tertiaryUser.GetId())
@ -255,15 +255,15 @@ func (suite *OneDriveIntegrationSuite) SetupSuite() {
si := NewSuiteInfoImpl(t, ctx, tconfig.M365UserID(t), path.OneDriveService) si := NewSuiteInfoImpl(t, ctx, tconfig.M365UserID(t), path.OneDriveService)
user, err := si.controller.AC.Users().GetByID(ctx, si.user) user, err := si.controller.AC.Users().IsLicenseReconciliationNeeded(ctx, si.user)
require.NoError(t, err, "fetching user", si.user, clues.ToCore(err)) require.NoError(t, err, "fetching user", si.user, clues.ToCore(err))
si.userID = ptr.Val(user.GetId()) si.userID = ptr.Val(user.GetId())
secondaryUser, err := si.controller.AC.Users().GetByID(ctx, si.secondaryUser) secondaryUser, err := si.controller.AC.Users().IsLicenseReconciliationNeeded(ctx, si.secondaryUser)
require.NoError(t, err, "fetching user", si.secondaryUser, clues.ToCore(err)) require.NoError(t, err, "fetching user", si.secondaryUser, clues.ToCore(err))
si.secondaryUserID = ptr.Val(secondaryUser.GetId()) si.secondaryUserID = ptr.Val(secondaryUser.GetId())
tertiaryUser, err := si.controller.AC.Users().GetByID(ctx, si.tertiaryUser) tertiaryUser, err := si.controller.AC.Users().IsLicenseReconciliationNeeded(ctx, si.tertiaryUser)
require.NoError(t, err, "fetching user", si.tertiaryUser, clues.ToCore(err)) require.NoError(t, err, "fetching user", si.tertiaryUser, clues.ToCore(err))
si.tertiaryUserID = ptr.Val(tertiaryUser.GetId()) si.tertiaryUserID = ptr.Val(tertiaryUser.GetId())
@ -319,15 +319,15 @@ func (suite *OneDriveNightlySuite) SetupSuite() {
si := NewSuiteInfoImpl(t, ctx, tconfig.M365UserID(t), path.OneDriveService) si := NewSuiteInfoImpl(t, ctx, tconfig.M365UserID(t), path.OneDriveService)
user, err := si.controller.AC.Users().GetByID(ctx, si.user) user, err := si.controller.AC.Users().IsLicenseReconciliationNeeded(ctx, si.user)
require.NoError(t, err, "fetching user", si.user, clues.ToCore(err)) require.NoError(t, err, "fetching user", si.user, clues.ToCore(err))
si.userID = ptr.Val(user.GetId()) si.userID = ptr.Val(user.GetId())
secondaryUser, err := si.controller.AC.Users().GetByID(ctx, si.secondaryUser) secondaryUser, err := si.controller.AC.Users().IsLicenseReconciliationNeeded(ctx, si.secondaryUser)
require.NoError(t, err, "fetching user", si.secondaryUser, clues.ToCore(err)) require.NoError(t, err, "fetching user", si.secondaryUser, clues.ToCore(err))
si.secondaryUserID = ptr.Val(secondaryUser.GetId()) si.secondaryUserID = ptr.Val(secondaryUser.GetId())
tertiaryUser, err := si.controller.AC.Users().GetByID(ctx, si.tertiaryUser) tertiaryUser, err := si.controller.AC.Users().IsLicenseReconciliationNeeded(ctx, si.tertiaryUser)
require.NoError(t, err, "fetching user", si.tertiaryUser, clues.ToCore(err)) require.NoError(t, err, "fetching user", si.tertiaryUser, clues.ToCore(err))
si.tertiaryUserID = ptr.Val(tertiaryUser.GetId()) si.tertiaryUserID = ptr.Val(tertiaryUser.GetId())

View File

@ -832,7 +832,7 @@ func (suite *OneDriveBackupIntgSuite) TestBackup_Run_oneDriveOwnerMigration() {
control.DefaultOptions()) control.DefaultOptions())
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
userable, err := ctrl.AC.Users().GetByID(ctx, suite.its.user.ID) userable, err := ctrl.AC.Users().IsLicenseReconciliationNeeded(ctx, suite.its.user.ID)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
uid := ptr.Val(userable.GetId()) uid := ptr.Val(userable.GetId())

View File

@ -112,15 +112,42 @@ func (c Users) GetAll(
return us, el.Failure() return us, el.Failure()
} }
// GetByID looks up the user matching the given identifier. The identifier can be either a // IsLicenseReconciliationNeeded looks up the user matching the given identifier. The identifier can be either a
// canonical user id or a princpalName. // canonical user id or a princpalName.
func (c Users) GetByID(ctx context.Context, identifier string) (models.Userable, error) { func (c Users) IsLicenseReconciliationNeeded(ctx context.Context, identifier string) (models.Userable, error) {
var ( var (
resp models.Userable resp models.Userable
err error err error
) )
resp, err = c.Stable.Client().Users().ByUserId(identifier).Get(ctx, nil) options := &users.UserItemRequestBuilderGetRequestConfiguration{
QueryParameters: &users.UserItemRequestBuilderGetQueryParameters{},
}
options.QueryParameters.Select = []string{"isLicenseReconciliationNeeded"}
resp, err = c.Stable.Client().Users().ByUserId(identifier).Get(ctx, options)
if err != nil {
return nil, graph.Wrap(ctx, err, "getting user")
}
return resp, err
}
func (c Users) AssignedPlans(ctx context.Context, identifier string) (models.Userable, error) {
var (
resp models.Userable
err error
)
options := &users.UserItemRequestBuilderGetRequestConfiguration{
QueryParameters: &users.UserItemRequestBuilderGetQueryParameters{},
}
options.QueryParameters.Select = []string{"assignedPlans"}
resp, err = c.Stable.Client().Users().ByUserId(identifier).Get(ctx, options)
if err != nil { if err != nil {
return nil, graph.Wrap(ctx, err, "getting user") return nil, graph.Wrap(ctx, err, "getting user")
@ -136,7 +163,7 @@ func (c Users) GetIDAndName(
userID string, userID string,
_ CallConfig, // not currently supported _ CallConfig, // not currently supported
) (string, string, error) { ) (string, string, error) {
u, err := c.GetByID(ctx, userID) u, err := c.IsLicenseReconciliationNeeded(ctx, userID)
if err != nil { if err != nil {
return "", "", err return "", "", err
} }

View File

@ -7,6 +7,7 @@ import (
"github.com/microsoftgraph/msgraph-sdk-go/models" "github.com/microsoftgraph/msgraph-sdk-go/models"
"github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/common/tform"
"github.com/alcionai/corso/src/internal/m365/service/exchange" "github.com/alcionai/corso/src/internal/m365/service/exchange"
"github.com/alcionai/corso/src/internal/m365/service/onedrive" "github.com/alcionai/corso/src/internal/m365/service/onedrive"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
@ -104,13 +105,52 @@ func usersNoInfo(ctx context.Context, acct account.Account, errs *fault.Bus) ([]
return ret, nil return ret, nil
} }
func UserIsLicenseReconciliationNeeded(ctx context.Context, acct account.Account, userID string) (bool, error) {
ac, err := makeAC(ctx, acct, path.UnknownService)
if err != nil {
return false, clues.Stack(err).WithClues(ctx)
}
us, err := ac.Users().IsLicenseReconciliationNeeded(ctx, userID)
if err != nil {
return false, err
}
if _, ok := us.GetAdditionalData()["isLicenseReconciliationNeeded"]; ok {
licenseReconciliationStatus, err := tform.AnyValueToT[*bool]("isLicenseReconciliationNeeded", us.GetAdditionalData())
if err != nil {
return false, err
}
return *licenseReconciliationStatus, nil
}
return false, clues.New("user missing license information")
}
func UserAssignedPlansCount(ctx context.Context, acct account.Account, userID string) (int, error) {
ac, err := makeAC(ctx, acct, path.UnknownService)
if err != nil {
return 0, clues.Stack(err).WithClues(ctx)
}
us, err := ac.Users().AssignedPlans(ctx, userID)
if err != nil {
return 0, err
}
if us.GetAssignedPlans() != nil {
return len(us.GetAssignedPlans()), nil
}
return 0, clues.New("user missing assigned plans")
}
// parseUser extracts information from `models.Userable` we care about // parseUser extracts information from `models.Userable` we care about
func parseUser(item models.Userable) (*UserNoInfo, error) { func parseUser(item models.Userable) (*UserNoInfo, error) {
if item.GetUserPrincipalName() == nil { if item.GetUserPrincipalName() == nil {
return nil, clues.New("user missing principal name"). return nil, clues.New("user missing principal name").
With("user_id", ptr.Val(item.GetId())) With("user_id", ptr.Val(item.GetId()))
} }
u := &UserNoInfo{ u := &UserNoInfo{
PrincipalName: ptr.Val(item.GetUserPrincipalName()), PrincipalName: ptr.Val(item.GetUserPrincipalName()),
ID: ptr.Val(item.GetId()), ID: ptr.Val(item.GetId()),

View File

@ -1,6 +1,7 @@
package m365 package m365
import ( import (
"fmt"
"testing" "testing"
"github.com/alcionai/clues" "github.com/alcionai/clues"
@ -202,6 +203,31 @@ func (suite *userIntegrationSuite) TestUserGetMailboxInfo() {
} }
} }
func (suite *userIntegrationSuite) TestUser_GetByID() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
acct := tconfig.NewM365Account(t)
users, err := UsersCompatNoInfo(ctx, acct)
assert.NoError(t, err, clues.ToCore(err))
assert.NotEmpty(t, users)
for _, s := range users {
suite.Run("user_"+s.ID, func() {
t := suite.T()
reconciliationNeeded, err := UserIsLicenseReconciliationNeeded(ctx, acct, s.ID)
assert.NoError(t, err, clues.ToCore(err))
plans, err := UserAssignedPlansCount(ctx, acct, s.ID)
assert.NoError(t, err, clues.ToCore(err))
fmt.Printf("user: %v \n", reconciliationNeeded)
fmt.Printf("user: %v \n", plans)
})
}
}
func (suite *userIntegrationSuite) TestUsers_InvalidCredentials() { func (suite *userIntegrationSuite) TestUsers_InvalidCredentials() {
table := []struct { table := []struct {
name string name string