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