Skip to content

Commit 8b6ec4b

Browse files
author
Horacio Duran
committed
Added testing to provisioner instance statuses
1 parent 8a03ca3 commit 8b6ec4b

File tree

4 files changed

+98
-1
lines changed

4 files changed

+98
-1
lines changed

api/provisioner/machine.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ func (m *Machine) ProvisioningInfo() (*params.ProvisioningInfo, error) {
7070
return result.Result, nil
7171
}
7272

73+
// SetInstanceStatus sets the status for the provider instance.
7374
func (m *Machine) SetInstanceStatus(status status.Status, message string, data map[string]interface{}) error {
7475
var result params.ErrorResults
7576
args := params.SetStatus{Entities: []params.EntityStatusArgs{
@@ -82,6 +83,26 @@ func (m *Machine) SetInstanceStatus(status status.Status, message string, data m
8283
return result.OneError()
8384
}
8485

86+
// InstanceStatus returns the status of the provider instance.
87+
func (m *Machine) InstanceStatus() (status.Status, string, error) {
88+
var results params.StatusResults
89+
args := params.Entities{Entities: []params.Entity{
90+
{Tag: m.tag.String()},
91+
}}
92+
err := m.st.facade.FacadeCall("InstanceStatus", args, &results)
93+
if err != nil {
94+
return "", "", err
95+
}
96+
if len(results.Results) != 1 {
97+
return "", "", fmt.Errorf("expected 1 result, got %d", len(results.Results))
98+
}
99+
result := results.Results[0]
100+
if result.Error != nil {
101+
return "", "", result.Error
102+
}
103+
return result.Status, result.Info, nil
104+
}
105+
85106
// SetStatus sets the status of the machine.
86107
func (m *Machine) SetStatus(status status.Status, info string, data map[string]interface{}) error {
87108
var result params.ErrorResults

api/provisioner/provisioner_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,25 @@ func (s *provisionerSuite) TestGetSetStatus(c *gc.C) {
135135
c.Assert(statusInfo.Data, gc.HasLen, 0)
136136
}
137137

138+
func (s *provisionerSuite) TestGetSetInstanceStatus(c *gc.C) {
139+
apiMachine, err := s.provisioner.Machine(s.machine.Tag().(names.MachineTag))
140+
c.Assert(err, jc.ErrorIsNil)
141+
142+
instanceStatus, info, err := apiMachine.InstanceStatus()
143+
c.Assert(err, jc.ErrorIsNil)
144+
c.Assert(instanceStatus, gc.Equals, status.StatusPending)
145+
c.Assert(info, gc.Equals, "")
146+
err = apiMachine.SetInstanceStatus(status.StatusStarted, "blah", nil)
147+
c.Assert(err, jc.ErrorIsNil)
148+
instanceStatus, info, err = apiMachine.InstanceStatus()
149+
c.Assert(err, jc.ErrorIsNil)
150+
c.Assert(instanceStatus, gc.Equals, status.StatusStarted)
151+
c.Assert(info, gc.Equals, "blah")
152+
statusInfo, err := s.machine.InstanceStatus()
153+
c.Assert(err, jc.ErrorIsNil)
154+
c.Assert(statusInfo.Data, gc.HasLen, 0)
155+
}
156+
138157
func (s *provisionerSuite) TestGetSetStatusWithData(c *gc.C) {
139158
apiMachine, err := s.provisioner.Machine(s.machine.Tag().(names.MachineTag))
140159
c.Assert(err, jc.ErrorIsNil)

apiserver/provisioner/provisioner.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,3 +1246,60 @@ func (p *ProvisionerAPI) createOrFetchStateSubnet(subnetInfo network.SubnetInfo)
12461246
}
12471247
return subnet, nil
12481248
}
1249+
1250+
// InstanceStatus returns the instance status for each given entity.
1251+
// Only machine tags are accepted.
1252+
func (p *ProvisionerAPI) InstanceStatus(args params.Entities) (params.StatusResults, error) {
1253+
result := params.StatusResults{
1254+
Results: make([]params.StatusResult, len(args.Entities)),
1255+
}
1256+
canAccess, err := p.getAuthFunc()
1257+
if err != nil {
1258+
logger.Errorf("failed to get an authorisation function: %v", err)
1259+
return result, errors.Trace(err)
1260+
}
1261+
for i, arg := range args.Entities {
1262+
mTag, err := names.ParseMachineTag(arg.Tag)
1263+
if err != nil {
1264+
result.Results[i].Error = common.ServerError(err)
1265+
continue
1266+
}
1267+
machine, err := p.getMachine(canAccess, mTag)
1268+
if err == nil {
1269+
var statusInfo status.StatusInfo
1270+
statusInfo, err = machine.InstanceStatus()
1271+
result.Results[i].Status = statusInfo.Status
1272+
result.Results[i].Info = statusInfo.Message
1273+
result.Results[i].Data = statusInfo.Data
1274+
result.Results[i].Since = statusInfo.Since
1275+
}
1276+
result.Results[i].Error = common.ServerError(err)
1277+
}
1278+
return result, nil
1279+
}
1280+
1281+
// SetInstanceStatus updates the instance status for each given
1282+
// entity. Only machine tags are accepted.
1283+
func (p *ProvisionerAPI) SetInstanceStatus(args params.SetStatus) (params.ErrorResults, error) {
1284+
result := params.ErrorResults{
1285+
Results: make([]params.ErrorResult, len(args.Entities)),
1286+
}
1287+
canAccess, err := p.getAuthFunc()
1288+
if err != nil {
1289+
logger.Errorf("failed to get an authorisation function: %v", err)
1290+
return result, errors.Trace(err)
1291+
}
1292+
for i, arg := range args.Entities {
1293+
mTag, err := names.ParseMachineTag(arg.Tag)
1294+
if err != nil {
1295+
result.Results[i].Error = common.ServerError(err)
1296+
continue
1297+
}
1298+
machine, err := p.getMachine(canAccess, mTag)
1299+
if err == nil {
1300+
err = machine.SetInstanceStatus(arg.Status, arg.Info, arg.Data)
1301+
}
1302+
result.Results[i].Error = common.ServerError(err)
1303+
}
1304+
return result, nil
1305+
}

status/status.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2013 Canonical Ltd.
1+
// Copyright 2016 Canonical Ltd.
22
// Licensed under the AGPLv3, see LICENCE file for details.
33

44
package status

0 commit comments

Comments
 (0)