Exchange restore service level handler functions (#4693)
Add service-level restore handlers for exchange --- #### Does this PR need a docs update or release note? - [ ] ✅ Yes, it's included - [ ] 🕐 Yes, but in a later PR - [x] ⛔ No #### Type of change - [ ] 🌻 Feature - [ ] 🐛 Bugfix - [ ] 🗺️ Documentation - [ ] 🤖 Supportability/Tests - [ ] 💻 CI/Deployment - [x] 🧹 Tech Debt/Cleanup #### Issue(s) * #4254 merge after: * #4687 * #4651 #### Test Plan - [ ] 💪 Manual - [x] ⚡ Unit test - [ ] 💚 E2E
This commit is contained in:
parent
e0f51943a5
commit
1cbabdb73a
@ -31,7 +31,7 @@ func (ctrl *Controller) NewServiceHandler(
|
|||||||
return groups.NewGroupsHandler(opts, ctrl.AC, ctrl.resourceHandler), nil
|
return groups.NewGroupsHandler(opts, ctrl.AC, ctrl.resourceHandler), nil
|
||||||
|
|
||||||
case path.ExchangeService:
|
case path.ExchangeService:
|
||||||
return exchange.NewExchangeHandler(opts), nil
|
return exchange.NewExchangeHandler(opts, ctrl.AC, ctrl.resourceHandler), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, clues.New("unrecognized service").
|
return nil, clues.New("unrecognized service").
|
||||||
|
|||||||
@ -5,8 +5,10 @@ import (
|
|||||||
|
|
||||||
"github.com/alcionai/clues"
|
"github.com/alcionai/clues"
|
||||||
|
|
||||||
|
"github.com/alcionai/corso/src/internal/common/idname"
|
||||||
"github.com/alcionai/corso/src/internal/data"
|
"github.com/alcionai/corso/src/internal/data"
|
||||||
"github.com/alcionai/corso/src/internal/m365/collection/exchange"
|
"github.com/alcionai/corso/src/internal/m365/collection/exchange"
|
||||||
|
"github.com/alcionai/corso/src/internal/m365/resource"
|
||||||
"github.com/alcionai/corso/src/internal/operations/inject"
|
"github.com/alcionai/corso/src/internal/operations/inject"
|
||||||
"github.com/alcionai/corso/src/pkg/backup/details"
|
"github.com/alcionai/corso/src/pkg/backup/details"
|
||||||
"github.com/alcionai/corso/src/pkg/control"
|
"github.com/alcionai/corso/src/pkg/control"
|
||||||
@ -14,18 +16,31 @@ import (
|
|||||||
"github.com/alcionai/corso/src/pkg/fault"
|
"github.com/alcionai/corso/src/pkg/fault"
|
||||||
"github.com/alcionai/corso/src/pkg/logger"
|
"github.com/alcionai/corso/src/pkg/logger"
|
||||||
"github.com/alcionai/corso/src/pkg/path"
|
"github.com/alcionai/corso/src/pkg/path"
|
||||||
|
"github.com/alcionai/corso/src/pkg/services/m365/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ inject.ServiceHandler = &baseExchangeHandler{}
|
var _ inject.ServiceHandler = &baseExchangeHandler{}
|
||||||
|
|
||||||
func NewExchangeHandler(
|
func NewExchangeHandler(
|
||||||
opts control.Options,
|
opts control.Options,
|
||||||
) *baseExchangeHandler {
|
apiClient api.Client,
|
||||||
return &baseExchangeHandler{
|
resourceClient idname.GetResourceIDAndNamer,
|
||||||
|
) *exchangeHandler {
|
||||||
|
return &exchangeHandler{
|
||||||
|
baseExchangeHandler: baseExchangeHandler{
|
||||||
opts: opts,
|
opts: opts,
|
||||||
|
},
|
||||||
|
apiClient: apiClient,
|
||||||
|
resourceClient: resourceClient,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ========================================================================== //
|
||||||
|
// baseExchangeHandler
|
||||||
|
// ========================================================================== //
|
||||||
|
|
||||||
|
// baseExchangeHandler contains logic for tracking data and doing operations
|
||||||
|
// (e.x. export) that don't require contact with external M356 services.
|
||||||
type baseExchangeHandler struct {
|
type baseExchangeHandler struct {
|
||||||
opts control.Options
|
opts control.Options
|
||||||
}
|
}
|
||||||
@ -72,3 +87,39 @@ func (h *baseExchangeHandler) ProduceExportCollections(
|
|||||||
|
|
||||||
return ec, el.Failure()
|
return ec, el.Failure()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ========================================================================== //
|
||||||
|
// exchangeHandler
|
||||||
|
// ========================================================================== //
|
||||||
|
|
||||||
|
// exchangeHandler contains logic for handling data and performing operations
|
||||||
|
// (e.x. restore) regardless of whether they require contact with external M365
|
||||||
|
// services or not.
|
||||||
|
type exchangeHandler struct {
|
||||||
|
baseExchangeHandler
|
||||||
|
apiClient api.Client
|
||||||
|
resourceClient idname.GetResourceIDAndNamer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *exchangeHandler) IsServiceEnabled(
|
||||||
|
ctx context.Context,
|
||||||
|
resourceID string,
|
||||||
|
) (bool, error) {
|
||||||
|
// TODO(ashmrtn): Move free function implementation to this function.
|
||||||
|
res, err := IsServiceEnabled(ctx, h.apiClient.Users(), resourceID)
|
||||||
|
return res, clues.Stack(err).OrNil()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *exchangeHandler) PopulateProtectedResourceIDAndName(
|
||||||
|
ctx context.Context,
|
||||||
|
resourceID string, // Can be either ID or name.
|
||||||
|
ins idname.Cacher,
|
||||||
|
) (idname.Provider, error) {
|
||||||
|
if h.resourceClient == nil {
|
||||||
|
return nil, clues.StackWC(ctx, resource.ErrNoResourceLookup)
|
||||||
|
}
|
||||||
|
|
||||||
|
pr, err := h.resourceClient.GetResourceIDAndNameFrom(ctx, resourceID, ins)
|
||||||
|
|
||||||
|
return pr, clues.Wrap(err, "identifying resource owner").OrNil()
|
||||||
|
}
|
||||||
|
|||||||
@ -19,6 +19,7 @@ import (
|
|||||||
"github.com/alcionai/corso/src/pkg/export"
|
"github.com/alcionai/corso/src/pkg/export"
|
||||||
"github.com/alcionai/corso/src/pkg/fault"
|
"github.com/alcionai/corso/src/pkg/fault"
|
||||||
"github.com/alcionai/corso/src/pkg/path"
|
"github.com/alcionai/corso/src/pkg/path"
|
||||||
|
"github.com/alcionai/corso/src/pkg/services/m365/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ExportUnitSuite struct {
|
type ExportUnitSuite struct {
|
||||||
@ -373,7 +374,7 @@ func (suite *ExportUnitSuite) TestExportRestoreCollections() {
|
|||||||
exportCfg := control.ExportConfig{}
|
exportCfg := control.ExportConfig{}
|
||||||
stats := data.ExportStats{}
|
stats := data.ExportStats{}
|
||||||
|
|
||||||
ecs, err := NewExchangeHandler(control.DefaultOptions()).
|
ecs, err := NewExchangeHandler(control.DefaultOptions(), api.Client{}, nil).
|
||||||
ProduceExportCollections(
|
ProduceExportCollections(
|
||||||
ctx,
|
ctx,
|
||||||
int(version.Backup),
|
int(version.Backup),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user