List all machine IP addrs in YAML and JSON output #6424

Merged
merged 2 commits into from Oct 12, 2016
Jump to file or symbol
Failed to load files and symbols.
+376 −204
Split
@@ -522,6 +522,22 @@ func makeMachineStatus(machine *state.Machine) (status params.MachineStatus) {
logger.Debugf("error fetching public address: %q", err)
}
status.DNSName = addr.Value
+
+ mAddrs := machine.Addresses()
+ if len(mAddrs) == 0 {
+ logger.Debugf("no IP addresses fetched for machine %q", instid)
+ // At least give it the newly created DNSName address, if it exists.
+ if addr.Value != "" {
+ mAddrs = append(mAddrs, addr)
+ }
+ }
+ for _, mAddr := range mAddrs {
@dimitern

dimitern Oct 12, 2016

Contributor

This loop is in quite similar to what network.FilterUnusableHostPorts() does, unfortunately not for []network.Address.
Nevertheless, please use the same approach here - switch on mAddr.Scope and filter ScopeMachineLocal and ScopeLinkLocal. This will cover the full loopback ranges 127/8 and ::1/128 on both IPv4 and IPv6 addresses, and will also not show the linkewise-unusable link local addresses.

+ switch mAddr.Scope {
+ case network.ScopeMachineLocal, network.ScopeLinkLocal:
+ continue
+ }
+ status.IPAddresses = append(status.IPAddresses, mAddr.Value)
+ }
} else {
if errors.IsNotProvisioned(err) {
status.InstanceId = "pending"
@@ -42,15 +42,33 @@ type MachineStatus struct {
AgentStatus DetailedStatus `json:"agent-status"`
InstanceStatus DetailedStatus `json:"instance-status"`
- DNSName string `json:"dns-name"`
- InstanceId instance.Id `json:"instance-id"`
- Series string `json:"series"`
- Id string `json:"id"`
- Containers map[string]MachineStatus `json:"containers"`
- Hardware string `json:"hardware"`
- Jobs []multiwatcher.MachineJob `json:"jobs"`
- HasVote bool `json:"has-vote"`
- WantsVote bool `json:"wants-vote"`
+ DNSName string `json:"dns-name"`
+
+ // IPAddresses holds the IP addresses bound to this machine.
+ IPAddresses []string `json:"ip-addresses"`
@macgreagoir

macgreagoir Oct 12, 2016

Contributor

As discussed in IRC, we are adding another field to the struct, but not changing any existing.

+
+ // InstanceId holds the unique identifier for this machine, based on
+ // what is supplied by the provider.
+ InstanceId instance.Id `json:"instance-id"`
+
+ // Series holds the name of the operating system release installed on
+ // this machine.
+ Series string `json:"series"`
+
+ // Id is the Juju identifier for this machine in this model.
+ Id string `json:"id"`
+
+ // Containers holds the MachineStatus of any containers hosted on this
+ // machine.
+ Containers map[string]MachineStatus `json:"containers"`
+
+ // Hardware holds a string of space-separated key=value pairs of
+ // hardware specification datum.
+ Hardware string `json:"hardware"`
+
+ Jobs []multiwatcher.MachineJob `json:"jobs"`
+ HasVote bool `json:"has-vote"`
+ WantsVote bool `json:"wants-vote"`
}
// ApplicationStatus holds status info about an application.
@@ -80,7 +98,7 @@ type UnitStatus struct {
// AgentStatus holds the status for a unit's agent.
AgentStatus DetailedStatus `json:"agent-status"`
- // WorkloadStatus holds the status for a unit's workload
+ // WorkloadStatus holds the status for a unit's workload.
WorkloadStatus DetailedStatus `json:"workload-status"`
WorkloadVersion string `json:"workload-version"`
@@ -101,7 +119,7 @@ type RelationStatus struct {
Endpoints []EndpointStatus `json:"endpoints"`
}
-// EndpointStatus holds status info about a single endpoint
+// EndpointStatus holds status info about a single endpoint.
type EndpointStatus struct {
ApplicationName string `json:"application"`
Name string `json:"name"`
@@ -127,7 +145,7 @@ type DetailedStatus struct {
Err error `json:"err,omitempty"`
}
-// History holds many DetailedStatus,
+// History holds many DetailedStatus.
type History struct {
Statuses []DetailedStatus `json:"statuses"`
Error *Error `json:"error,omitempty"`
@@ -148,7 +166,7 @@ type StatusHistoryRequest struct {
Tag string `json:"tag"`
}
-// StatusHistoryRequests holds a slice of StatusHistoryArgs
+// StatusHistoryRequests holds a slice of StatusHistoryArgs.
type StatusHistoryRequests struct {
Requests []StatusHistoryRequest `json:"requests"`
}
@@ -188,7 +206,7 @@ type StatusResults struct {
Results []StatusResult `json:"results"`
}
-// ApplicationStatusResult holds results for an application Full Status
+// ApplicationStatusResult holds results for an application Full Status.
type ApplicationStatusResult struct {
Application StatusResult `json:"application"`
Units map[string]StatusResult `json:"units"`
@@ -37,7 +37,11 @@ func (*fakeStatusAPI) Status(c []string) (*params.FullStatus, error) {
AgentStatus: params.DetailedStatus{
Status: "started",
},
- DNSName: "10.0.0.1",
+ DNSName: "10.0.0.1",
+ IPAddresses: []string{
+ "10.0.0.1",
+ "10.0.1.1",
+ },
InstanceId: "juju-badd06-0",
Series: "trusty",
Hardware: "availability-zone=us-east-1",
@@ -47,7 +51,11 @@ func (*fakeStatusAPI) Status(c []string) (*params.FullStatus, error) {
AgentStatus: params.DetailedStatus{
Status: "started",
},
- DNSName: "10.0.0.2",
+ DNSName: "10.0.0.2",
+ IPAddresses: []string{
+ "10.0.0.2",
+ "10.0.1.2",
+ },
InstanceId: "juju-badd06-1",
Series: "trusty",
Containers: map[string]params.MachineStatus{
@@ -56,7 +64,11 @@ func (*fakeStatusAPI) Status(c []string) (*params.FullStatus, error) {
AgentStatus: params.DetailedStatus{
Status: "pending",
},
- DNSName: "10.0.0.3",
+ DNSName: "10.0.0.3",
+ IPAddresses: []string{
+ "10.0.0.3",
+ "10.0.1.3",
+ },
InstanceId: "juju-badd06-1-lxd-0",
Series: "trusty",
},
@@ -96,20 +108,29 @@ func (s *MachineListCommandSuite) TestListMachineYaml(c *gc.C) {
" juju-status:\n"+
" current: started\n"+
" dns-name: 10.0.0.1\n"+
+ " ip-addresses:\n"+
+ " - 10.0.0.1\n"+
+ " - 10.0.1.1\n"+
" instance-id: juju-badd06-0\n"+
" series: trusty\n"+
" hardware: availability-zone=us-east-1\n"+
" \"1\":\n"+
" juju-status:\n"+
" current: started\n"+
" dns-name: 10.0.0.2\n"+
+ " ip-addresses:\n"+
+ " - 10.0.0.2\n"+
+ " - 10.0.1.2\n"+
" instance-id: juju-badd06-1\n"+
" series: trusty\n"+
" containers:\n"+
" 1/lxd/0:\n"+
" juju-status:\n"+
" current: pending\n"+
" dns-name: 10.0.0.3\n"+
+ " ip-addresses:\n"+
+ " - 10.0.0.3\n"+
+ " - 10.0.1.3\n"+
" instance-id: juju-badd06-1-lxd-0\n"+
" series: trusty\n")
}
@@ -118,7 +139,7 @@ func (s *MachineListCommandSuite) TestListMachineJson(c *gc.C) {
context, err := testing.RunCommand(c, newMachineListCommand(), "--format", "json")
c.Assert(err, jc.ErrorIsNil)
c.Assert(testing.Stdout(context), gc.Equals, ""+
- "{\"model\":\"dummyenv\",\"machines\":{\"0\":{\"juju-status\":{\"current\":\"started\"},\"dns-name\":\"10.0.0.1\",\"instance-id\":\"juju-badd06-0\",\"machine-status\":{},\"series\":\"trusty\",\"hardware\":\"availability-zone=us-east-1\"},\"1\":{\"juju-status\":{\"current\":\"started\"},\"dns-name\":\"10.0.0.2\",\"instance-id\":\"juju-badd06-1\",\"machine-status\":{},\"series\":\"trusty\",\"containers\":{\"1/lxd/0\":{\"juju-status\":{\"current\":\"pending\"},\"dns-name\":\"10.0.0.3\",\"instance-id\":\"juju-badd06-1-lxd-0\",\"machine-status\":{},\"series\":\"trusty\"}}}}}\n")
+ "{\"model\":\"dummyenv\",\"machines\":{\"0\":{\"juju-status\":{\"current\":\"started\"},\"dns-name\":\"10.0.0.1\",\"ip-addresses\":[\"10.0.0.1\",\"10.0.1.1\"],\"instance-id\":\"juju-badd06-0\",\"machine-status\":{},\"series\":\"trusty\",\"hardware\":\"availability-zone=us-east-1\"},\"1\":{\"juju-status\":{\"current\":\"started\"},\"dns-name\":\"10.0.0.2\",\"ip-addresses\":[\"10.0.0.2\",\"10.0.1.2\"],\"instance-id\":\"juju-badd06-1\",\"machine-status\":{},\"series\":\"trusty\",\"containers\":{\"1/lxd/0\":{\"juju-status\":{\"current\":\"pending\"},\"dns-name\":\"10.0.0.3\",\"ip-addresses\":[\"10.0.0.3\",\"10.0.1.3\"],\"instance-id\":\"juju-badd06-1-lxd-0\",\"machine-status\":{},\"series\":\"trusty\"}}}}}\n")
}
func (s *MachineListCommandSuite) TestListMachineArgsError(c *gc.C) {
@@ -36,20 +36,29 @@ func (s *MachineShowCommandSuite) TestShowMachine(c *gc.C) {
" juju-status:\n"+
" current: started\n"+
" dns-name: 10.0.0.1\n"+
+ " ip-addresses:\n"+
+ " - 10.0.0.1\n"+
+ " - 10.0.1.1\n"+
" instance-id: juju-badd06-0\n"+
" series: trusty\n"+
" hardware: availability-zone=us-east-1\n"+
" \"1\":\n"+
" juju-status:\n"+
" current: started\n"+
" dns-name: 10.0.0.2\n"+
+ " ip-addresses:\n"+
+ " - 10.0.0.2\n"+
+ " - 10.0.1.2\n"+
" instance-id: juju-badd06-1\n"+
" series: trusty\n"+
" containers:\n"+
" 1/lxd/0:\n"+
" juju-status:\n"+
" current: pending\n"+
" dns-name: 10.0.0.3\n"+
+ " ip-addresses:\n"+
+ " - 10.0.0.3\n"+
+ " - 10.0.1.3\n"+
" instance-id: juju-badd06-1-lxd-0\n"+
" series: trusty\n")
}
@@ -63,6 +72,9 @@ func (s *MachineShowCommandSuite) TestShowSingleMachine(c *gc.C) {
" juju-status:\n"+
" current: started\n"+
" dns-name: 10.0.0.1\n"+
+ " ip-addresses:\n"+
+ " - 10.0.0.1\n"+
+ " - 10.0.1.1\n"+
" instance-id: juju-badd06-0\n"+
" series: trusty\n"+
" hardware: availability-zone=us-east-1\n")
@@ -83,5 +95,5 @@ func (s *MachineShowCommandSuite) TestShowJsonMachine(c *gc.C) {
context, err := testing.RunCommand(c, newMachineShowCommand(), "--format", "json", "0", "1")
c.Assert(err, jc.ErrorIsNil)
c.Assert(testing.Stdout(context), gc.Equals, ""+
- "{\"model\":\"dummyenv\",\"machines\":{\"0\":{\"juju-status\":{\"current\":\"started\"},\"dns-name\":\"10.0.0.1\",\"instance-id\":\"juju-badd06-0\",\"machine-status\":{},\"series\":\"trusty\",\"hardware\":\"availability-zone=us-east-1\"},\"1\":{\"juju-status\":{\"current\":\"started\"},\"dns-name\":\"10.0.0.2\",\"instance-id\":\"juju-badd06-1\",\"machine-status\":{},\"series\":\"trusty\",\"containers\":{\"1/lxd/0\":{\"juju-status\":{\"current\":\"pending\"},\"dns-name\":\"10.0.0.3\",\"instance-id\":\"juju-badd06-1-lxd-0\",\"machine-status\":{},\"series\":\"trusty\"}}}}}\n")
+ "{\"model\":\"dummyenv\",\"machines\":{\"0\":{\"juju-status\":{\"current\":\"started\"},\"dns-name\":\"10.0.0.1\",\"ip-addresses\":[\"10.0.0.1\",\"10.0.1.1\"],\"instance-id\":\"juju-badd06-0\",\"machine-status\":{},\"series\":\"trusty\",\"hardware\":\"availability-zone=us-east-1\"},\"1\":{\"juju-status\":{\"current\":\"started\"},\"dns-name\":\"10.0.0.2\",\"ip-addresses\":[\"10.0.0.2\",\"10.0.1.2\"],\"instance-id\":\"juju-badd06-1\",\"machine-status\":{},\"series\":\"trusty\",\"containers\":{\"1/lxd/0\":{\"juju-status\":{\"current\":\"pending\"},\"dns-name\":\"10.0.0.3\",\"ip-addresses\":[\"10.0.0.3\",\"10.0.1.3\"],\"instance-id\":\"juju-badd06-1-lxd-0\",\"machine-status\":{},\"series\":\"trusty\"}}}}}\n")
}
@@ -42,6 +42,7 @@ type machineStatus struct {
Err error `json:"-" yaml:",omitempty"`
JujuStatus statusInfoContents `json:"juju-status,omitempty" yaml:"juju-status,omitempty"`
DNSName string `json:"dns-name,omitempty" yaml:"dns-name,omitempty"`
+ IPAddresses []string `json:"ip-addresses,omitempty" yaml:"ip-addresses,omitempty"`
InstanceId instance.Id `json:"instance-id,omitempty" yaml:"instance-id,omitempty"`
MachineStatus statusInfoContents `json:"machine-status,omitempty" yaml:"machine-status,omitempty"`
Series string `json:"series,omitempty" yaml:"series,omitempty"`
@@ -101,6 +101,7 @@ func (sf *statusFormatter) formatMachine(machine params.MachineStatus) machineSt
out = machineStatus{
JujuStatus: sf.getStatusInfoContents(machine.AgentStatus),
DNSName: machine.DNSName,
+ IPAddresses: machine.IPAddresses,
InstanceId: machine.InstanceId,
MachineStatus: sf.getStatusInfoContents(machine.InstanceStatus),
Series: machine.Series,
Oops, something went wrong.