1
// Copyright 2014 Canonical Ltd.
2
// Copyright 2014 Cloudbase Solutions
3
// Licensed under the AGPLv3, see LICENCE file for details.
8
"github.com/juju/errors"
9
"gopkg.in/juju/names.v2"
11
"github.com/juju/juju/apiserver/params"
12
"github.com/juju/juju/state"
15
// RebootRequester implements the RequestReboot API method
16
type RebootRequester struct {
21
func NewRebootRequester(st state.EntityFinder, auth GetAuthFunc) *RebootRequester {
22
return &RebootRequester{
28
func (r *RebootRequester) oneRequest(tag names.Tag) error {
29
entity0, err := r.st.FindEntity(tag)
33
entity, ok := entity0.(state.RebootFlagSetter)
35
return NotSupportedError(tag, "request reboot")
37
return entity.SetRebootFlag(true)
40
// RequestReboot sets the reboot flag on the provided machines
41
func (r *RebootRequester) RequestReboot(args params.Entities) (params.ErrorResults, error) {
42
result := params.ErrorResults{
43
Results: make([]params.ErrorResult, len(args.Entities)),
45
if len(args.Entities) == 0 {
50
return params.ErrorResults{}, errors.Trace(err)
52
for i, entity := range args.Entities {
53
tag, err := names.ParseTag(entity.Tag)
55
result.Results[i].Error = ServerError(ErrPerm)
60
err = r.oneRequest(tag)
62
result.Results[i].Error = ServerError(err)
67
// RebootActionGetter implements the GetRebootAction API method
68
type RebootActionGetter struct {
73
func NewRebootActionGetter(st state.EntityFinder, auth GetAuthFunc) *RebootActionGetter {
74
return &RebootActionGetter{
80
func (r *RebootActionGetter) getOneAction(tag names.Tag) (params.RebootAction, error) {
81
entity0, err := r.st.FindEntity(tag)
85
entity, ok := entity0.(state.RebootActionGetter)
87
return "", NotSupportedError(tag, "request reboot")
89
rAction, err := entity.ShouldRebootOrShutdown()
91
return params.ShouldDoNothing, err
93
return params.RebootAction(rAction), nil
96
// GetRebootAction returns the action a machine agent should take.
97
// If a reboot flag is set on the machine, then that machine is
98
// expected to reboot (params.ShouldReboot).
99
// a reboot flag set on the machine parent or grandparent, will
100
// cause the machine to shutdown (params.ShouldShutdown).
101
// If no reboot flag is set, the machine should do nothing (params.ShouldDoNothing).
102
func (r *RebootActionGetter) GetRebootAction(args params.Entities) (params.RebootActionResults, error) {
103
result := params.RebootActionResults{
104
Results: make([]params.RebootActionResult, len(args.Entities)),
106
if len(args.Entities) == 0 {
109
auth, err := r.auth()
111
return params.RebootActionResults{}, errors.Trace(err)
113
for i, entity := range args.Entities {
114
tag, err := names.ParseTag(entity.Tag)
116
result.Results[i].Error = ServerError(ErrPerm)
121
result.Results[i].Result, err = r.getOneAction(tag)
123
result.Results[i].Error = ServerError(err)
128
// RebootFlagClearer implements the ClearReboot API call
129
type RebootFlagClearer struct {
130
st state.EntityFinder
134
func NewRebootFlagClearer(st state.EntityFinder, auth GetAuthFunc) *RebootFlagClearer {
135
return &RebootFlagClearer{
141
func (r *RebootFlagClearer) clearOneFlag(tag names.Tag) error {
142
entity0, err := r.st.FindEntity(tag)
146
entity, ok := entity0.(state.RebootFlagSetter)
148
return NotSupportedError(tag, "clear reboot flag")
150
return entity.SetRebootFlag(false)
153
// ClearReboot will clear the reboot flag on provided machines, if it exists.
154
func (r *RebootFlagClearer) ClearReboot(args params.Entities) (params.ErrorResults, error) {
155
result := params.ErrorResults{
156
Results: make([]params.ErrorResult, len(args.Entities)),
158
if len(args.Entities) == 0 {
161
auth, err := r.auth()
163
return params.ErrorResults{}, errors.Trace(err)
165
for i, entity := range args.Entities {
166
tag, err := names.ParseTag(entity.Tag)
168
result.Results[i].Error = ServerError(ErrPerm)
173
err = r.clearOneFlag(tag)
175
result.Results[i].Error = ServerError(err)