github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/cmd/juju/status/formatted.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package status 5 6 import ( 7 "encoding/json" 8 9 "github.com/juju/juju/apiserver/params" 10 "github.com/juju/juju/instance" 11 "github.com/juju/juju/network" 12 ) 13 14 type formattedStatus struct { 15 Environment string `json:"environment"` 16 Machines map[string]machineStatus `json:"machines"` 17 Services map[string]serviceStatus `json:"services"` 18 Networks map[string]networkStatus `json:"networks,omitempty" yaml:",omitempty"` 19 } 20 21 type errorStatus struct { 22 StatusError string `json:"status-error" yaml:"status-error"` 23 } 24 25 type machineStatus struct { 26 Err error `json:"-" yaml:",omitempty"` 27 AgentState params.Status `json:"agent-state,omitempty" yaml:"agent-state,omitempty"` 28 AgentStateInfo string `json:"agent-state-info,omitempty" yaml:"agent-state-info,omitempty"` 29 AgentVersion string `json:"agent-version,omitempty" yaml:"agent-version,omitempty"` 30 DNSName string `json:"dns-name,omitempty" yaml:"dns-name,omitempty"` 31 InstanceId instance.Id `json:"instance-id,omitempty" yaml:"instance-id,omitempty"` 32 InstanceState string `json:"instance-state,omitempty" yaml:"instance-state,omitempty"` 33 Life string `json:"life,omitempty" yaml:"life,omitempty"` 34 Series string `json:"series,omitempty" yaml:"series,omitempty"` 35 Id string `json:"-" yaml:"-"` 36 Containers map[string]machineStatus `json:"containers,omitempty" yaml:"containers,omitempty"` 37 Hardware string `json:"hardware,omitempty" yaml:"hardware,omitempty"` 38 HAStatus string `json:"state-server-member-status,omitempty" yaml:"state-server-member-status,omitempty"` 39 } 40 41 // A goyaml bug means we can't declare these types 42 // locally to the GetYAML methods. 43 type machineStatusNoMarshal machineStatus 44 45 func (s machineStatus) MarshalJSON() ([]byte, error) { 46 if s.Err != nil { 47 return json.Marshal(errorStatus{s.Err.Error()}) 48 } 49 return json.Marshal(machineStatusNoMarshal(s)) 50 } 51 52 func (s machineStatus) GetYAML() (tag string, value interface{}) { 53 if s.Err != nil { 54 return "", errorStatus{s.Err.Error()} 55 } 56 // TODO(rog) rename mNoMethods to noMethods (and also in 57 // the other GetYAML methods) when people are using the non-buggy 58 // goyaml version. // TODO(jw4) however verify that gccgo does not 59 // complain about symbol already defined. 60 type mNoMethods machineStatus 61 return "", mNoMethods(s) 62 } 63 64 type serviceStatus struct { 65 Err error `json:"-" yaml:",omitempty"` 66 Charm string `json:"charm" yaml:"charm"` 67 CanUpgradeTo string `json:"can-upgrade-to,omitempty" yaml:"can-upgrade-to,omitempty"` 68 Exposed bool `json:"exposed" yaml:"exposed"` 69 Life string `json:"life,omitempty" yaml:"life,omitempty"` 70 StatusInfo statusInfoContents `json:"service-status,omitempty" yaml:"service-status,omitempty"` 71 Relations map[string][]string `json:"relations,omitempty" yaml:"relations,omitempty"` 72 Networks map[string][]string `json:"networks,omitempty" yaml:"networks,omitempty"` 73 SubordinateTo []string `json:"subordinate-to,omitempty" yaml:"subordinate-to,omitempty"` 74 Units map[string]unitStatus `json:"units,omitempty" yaml:"units,omitempty"` 75 } 76 77 type serviceStatusNoMarshal serviceStatus 78 79 func (s serviceStatus) MarshalJSON() ([]byte, error) { 80 if s.Err != nil { 81 return json.Marshal(errorStatus{s.Err.Error()}) 82 } 83 type ssNoMethods serviceStatus 84 return json.Marshal(ssNoMethods(s)) 85 } 86 87 func (s serviceStatus) GetYAML() (tag string, value interface{}) { 88 if s.Err != nil { 89 return "", errorStatus{s.Err.Error()} 90 } 91 type ssNoMethods serviceStatus 92 return "", ssNoMethods(s) 93 } 94 95 type meterStatus struct { 96 Color string `json:"color,omitempty" yaml:"color,omitempty"` 97 Message string `json:"message,omitempty" yaml:"message,omitempty"` 98 } 99 100 type unitStatus struct { 101 // New Juju Health Status fields. 102 WorkloadStatusInfo statusInfoContents `json:"workload-status,omitempty" yaml:"workload-status,omitempty"` 103 AgentStatusInfo statusInfoContents `json:"agent-status,omitempty" yaml:"agent-status,omitempty"` 104 MeterStatus *meterStatus `json:"meter-status,omitempty" yaml:"meter-status,omitempty"` 105 106 // Legacy status fields, to be removed in Juju 2.0 107 AgentState params.Status `json:"agent-state,omitempty" yaml:"agent-state,omitempty"` 108 AgentStateInfo string `json:"agent-state-info,omitempty" yaml:"agent-state-info,omitempty"` 109 Err error `json:"-" yaml:",omitempty"` 110 AgentVersion string `json:"agent-version,omitempty" yaml:"agent-version,omitempty"` 111 Life string `json:"life,omitempty" yaml:"life,omitempty"` 112 113 Charm string `json:"upgrading-from,omitempty" yaml:"upgrading-from,omitempty"` 114 Machine string `json:"machine,omitempty" yaml:"machine,omitempty"` 115 OpenedPorts []string `json:"open-ports,omitempty" yaml:"open-ports,omitempty"` 116 PublicAddress string `json:"public-address,omitempty" yaml:"public-address,omitempty"` 117 Subordinates map[string]unitStatus `json:"subordinates,omitempty" yaml:"subordinates,omitempty"` 118 } 119 120 type statusInfoContents struct { 121 Err error `json:"-" yaml:",omitempty"` 122 Current params.Status `json:"current,omitempty" yaml:"current,omitempty"` 123 Message string `json:"message,omitempty" yaml:"message,omitempty"` 124 Since string `json:"since,omitempty" yaml:"since,omitempty"` 125 Version string `json:"version,omitempty" yaml:"version,omitempty"` 126 } 127 128 type statusInfoContentsNoMarshal statusInfoContents 129 130 func (s statusInfoContents) MarshalJSON() ([]byte, error) { 131 if s.Err != nil { 132 return json.Marshal(errorStatus{s.Err.Error()}) 133 } 134 return json.Marshal(statusInfoContentsNoMarshal(s)) 135 } 136 137 func (s statusInfoContents) GetYAML() (tag string, value interface{}) { 138 if s.Err != nil { 139 return "", errorStatus{s.Err.Error()} 140 } 141 type sicNoMethods statusInfoContents 142 return "", sicNoMethods(s) 143 } 144 145 type unitStatusNoMarshal unitStatus 146 147 func (s unitStatus) MarshalJSON() ([]byte, error) { 148 if s.Err != nil { 149 return json.Marshal(errorStatus{s.Err.Error()}) 150 } 151 return json.Marshal(unitStatusNoMarshal(s)) 152 } 153 154 func (s unitStatus) GetYAML() (tag string, value interface{}) { 155 if s.Err != nil { 156 return "", errorStatus{s.Err.Error()} 157 } 158 type usNoMethods unitStatus 159 return "", usNoMethods(s) 160 } 161 162 type networkStatus struct { 163 Err error `json:"-" yaml:",omitempty"` 164 ProviderId network.Id `json:"provider-id" yaml:"provider-id"` 165 CIDR string `json:"cidr,omitempty" yaml:"cidr,omitempty"` 166 VLANTag int `json:"vlan-tag,omitempty" yaml:"vlan-tag,omitempty"` 167 } 168 169 type networkStatusNoMarshal networkStatus 170 171 func (n networkStatus) MarshalJSON() ([]byte, error) { 172 if n.Err != nil { 173 return json.Marshal(errorStatus{n.Err.Error()}) 174 } 175 type nNoMethods networkStatus 176 return json.Marshal(nNoMethods(n)) 177 } 178 179 func (n networkStatus) GetYAML() (tag string, value interface{}) { 180 if n.Err != nil { 181 return "", errorStatus{n.Err.Error()} 182 } 183 type nNoMethods networkStatus 184 return "", nNoMethods(n) 185 }