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  }