func (s *actionsSuite) TestAuthAndActionFromTagFn(c *gc.C) { notFoundActionTag := names.NewActionTag(utils.MustNewUUID().String()) authorizedActionTag := names.NewActionTag(utils.MustNewUUID().String()) authorizedMachineTag := names.NewMachineTag("1") authorizedAction := fakeAction{name: "action1", receiver: authorizedMachineTag.Id()} unauthorizedActionTag := names.NewActionTag(utils.MustNewUUID().String()) unauthorizedMachineTag := names.NewMachineTag("10") unauthorizedAction := fakeAction{name: "action2", receiver: unauthorizedMachineTag.Id()} invalidReceiverActionTag := names.NewActionTag(utils.MustNewUUID().String()) invalidReceiverAction := fakeAction{name: "action2", receiver: "masterexploder"} canAccess := makeCanAccess(map[names.Tag]bool{ authorizedMachineTag: true, }) getActionByTag := makeGetActionByTag(map[names.ActionTag]state.Action{ authorizedActionTag: authorizedAction, unauthorizedActionTag: unauthorizedAction, invalidReceiverActionTag: invalidReceiverAction, }) tagFn := common.AuthAndActionFromTagFn(canAccess, getActionByTag) for i, test := range []struct { tag string errString string err error expectedAction state.Action }{{ tag: "invalid-action-tag", errString: `"invalid-action-tag" is not a valid tag`, }, { tag: notFoundActionTag.String(), errString: "action not found", }, { tag: invalidReceiverActionTag.String(), errString: `invalid actionreceiver name "masterexploder"`, }, { tag: unauthorizedActionTag.String(), err: common.ErrPerm, }, { tag: authorizedActionTag.String(), expectedAction: authorizedAction, }} { c.Logf("test %d", i) action, err := tagFn(test.tag) if test.errString != "" { c.Check(err, gc.ErrorMatches, test.errString) c.Check(action, gc.IsNil) } else if test.err != nil { c.Check(err, gc.Equals, test.err) c.Check(action, gc.IsNil) } else { c.Check(err, jc.ErrorIsNil) c.Check(action, gc.Equals, action) } } }
// FinishActions saves the result of a completed Action func (u *UniterAPIV3) FinishActions(args params.ActionExecutionResults) (params.ErrorResults, error) { canAccess, err := u.accessUnit() if err != nil { return params.ErrorResults{}, err } actionFn := common.AuthAndActionFromTagFn(canAccess, u.st.ActionByTag) return common.FinishActions(args, actionFn), nil }
// FinishActions saves the result of a completed Action func (f *Facade) FinishActions(args params.ActionExecutionResults) params.ErrorResults { actionFn := common.AuthAndActionFromTagFn(f.accessMachine, f.backend.ActionByTag) return common.FinishActions(args, actionFn) }
// BeginActions marks the actions represented by the passed in Tags as running. func (f *Facade) BeginActions(args params.Entities) params.ErrorResults { actionFn := common.AuthAndActionFromTagFn(f.accessMachine, f.backend.ActionByTag) return common.BeginActions(args, actionFn) }