github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/common/modelstatus.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package common 5 6 import ( 7 "github.com/juju/errors" 8 "gopkg.in/juju/names.v2" 9 10 "github.com/juju/juju/api/base" 11 "github.com/juju/juju/apiserver/params" 12 ) 13 14 // ModelStatusAPI provides common client-side API functions 15 // to call into apiserver.common.ModelStatusAPI. 16 type ModelStatusAPI struct { 17 facade base.FacadeCaller 18 } 19 20 // NewModelStatusAPI creates a ModelStatusAPI on the specified facade, 21 // and uses this name when calling through the caller. 22 func NewModelStatusAPI(facade base.FacadeCaller) *ModelStatusAPI { 23 return &ModelStatusAPI{facade} 24 } 25 26 // ModelStatus returns a status summary for each model tag passed in. 27 func (c *ModelStatusAPI) ModelStatus(tags ...names.ModelTag) ([]base.ModelStatus, error) { 28 result := params.ModelStatusResults{} 29 models := make([]params.Entity, len(tags)) 30 for i, tag := range tags { 31 models[i] = params.Entity{Tag: tag.String()} 32 } 33 req := params.Entities{ 34 Entities: models, 35 } 36 if err := c.facade.FacadeCall("ModelStatus", req, &result); err != nil { 37 return nil, err 38 } 39 40 return c.processModelStatusResults(result.Results) 41 } 42 43 func (c *ModelStatusAPI) processModelStatusResults(rs []params.ModelStatus) ([]base.ModelStatus, error) { 44 results := make([]base.ModelStatus, len(rs)) 45 for i, r := range rs { 46 if r.Error != nil { 47 // cope with typed error 48 results[i].Error = errors.Trace(r.Error) 49 continue 50 } 51 model, err := names.ParseModelTag(r.ModelTag) 52 if err != nil { 53 results[i].Error = errors.Trace(err) 54 continue 55 } 56 owner, err := names.ParseUserTag(r.OwnerTag) 57 if err != nil { 58 results[i].Error = errors.Trace(err) 59 continue 60 } 61 results[i] = constructModelStatus(model, owner, r) 62 } 63 return results, nil 64 } 65 66 func constructModelStatus(model names.ModelTag, owner names.UserTag, r params.ModelStatus) base.ModelStatus { 67 volumes := make([]base.Volume, len(r.Volumes)) 68 for i, in := range r.Volumes { 69 volumes[i] = base.Volume{ 70 Id: in.Id, 71 ProviderId: in.ProviderId, 72 Status: in.Status, 73 Message: in.Message, 74 Detachable: in.Detachable, 75 } 76 } 77 78 filesystems := make([]base.Filesystem, len(r.Filesystems)) 79 for i, in := range r.Filesystems { 80 filesystems[i] = base.Filesystem{ 81 Id: in.Id, 82 ProviderId: in.ProviderId, 83 Status: in.Status, 84 Message: in.Message, 85 Detachable: in.Detachable, 86 } 87 } 88 89 result := base.ModelStatus{ 90 UUID: model.Id(), 91 Life: string(r.Life), 92 Owner: owner.Id(), 93 HostedMachineCount: r.HostedMachineCount, 94 ApplicationCount: r.ApplicationCount, 95 TotalMachineCount: len(r.Machines), 96 Volumes: volumes, 97 Filesystems: filesystems, 98 } 99 result.Machines = make([]base.Machine, len(r.Machines)) 100 for j, mm := range r.Machines { 101 if mm.Hardware != nil && mm.Hardware.Cores != nil { 102 result.CoreCount += int(*mm.Hardware.Cores) 103 } 104 result.Machines[j] = base.Machine{ 105 Id: mm.Id, 106 InstanceId: mm.InstanceId, 107 DisplayName: mm.DisplayName, 108 HasVote: mm.HasVote, 109 WantsVote: mm.WantsVote, 110 Status: mm.Status, 111 Message: mm.Message, 112 } 113 } 114 return result 115 }