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  }