Преглед изворни кода

Print the raw inspected elements when there is no template for `docker inspect`.

Otherwise we're ignoring the fields that Swarm adds to the output.

Signed-off-by: David Calavera <david.calavera@gmail.com>
David Calavera пре 9 година
родитељ
комит
1f5674363e
2 измењених фајлова са 63 додато и 8 уклоњено
  1. 32 8
      api/client/inspect/inspector.go
  2. 31 0
      api/client/inspect/inspector_test.go

+ 32 - 8
api/client/inspect/inspector.go

@@ -60,6 +60,7 @@ func (i *TemplateInspector) Flush() error {
 type IndentedInspector struct {
 type IndentedInspector struct {
 	outputStream io.Writer
 	outputStream io.Writer
 	elements     []interface{}
 	elements     []interface{}
+	rawElements  [][]byte
 }
 }
 
 
 // NewIndentedInspector generates a new IndentedInspector.
 // NewIndentedInspector generates a new IndentedInspector.
@@ -70,26 +71,49 @@ func NewIndentedInspector(outputStream io.Writer) Inspector {
 }
 }
 
 
 // Inspect writes the raw element with an indented json format.
 // Inspect writes the raw element with an indented json format.
-func (i *IndentedInspector) Inspect(typedElement interface{}, _ []byte) error {
-	i.elements = append(i.elements, typedElement)
+func (i *IndentedInspector) Inspect(typedElement interface{}, rawElement []byte) error {
+	if rawElement != nil {
+		i.rawElements = append(i.rawElements, rawElement)
+	} else {
+		i.elements = append(i.elements, typedElement)
+	}
 	return nil
 	return nil
 }
 }
 
 
 // Flush write the result of inspecting all elements into the output stream.
 // Flush write the result of inspecting all elements into the output stream.
 func (i *IndentedInspector) Flush() error {
 func (i *IndentedInspector) Flush() error {
-	if len(i.elements) == 0 {
+	if len(i.elements) == 0 && len(i.rawElements) == 0 {
 		_, err := io.WriteString(i.outputStream, "[]\n")
 		_, err := io.WriteString(i.outputStream, "[]\n")
 		return err
 		return err
 	}
 	}
 
 
-	buffer, err := json.MarshalIndent(i.elements, "", "    ")
-	if err != nil {
-		return err
+	var buffer io.Reader
+	if len(i.rawElements) > 0 {
+		bytesBuffer := new(bytes.Buffer)
+		bytesBuffer.WriteString("[")
+		for idx, r := range i.rawElements {
+			bytesBuffer.Write(r)
+			if idx < len(i.rawElements)-1 {
+				bytesBuffer.WriteString(",")
+			}
+		}
+		bytesBuffer.WriteString("]")
+		indented := new(bytes.Buffer)
+		if err := json.Indent(indented, bytesBuffer.Bytes(), "", "    "); err != nil {
+			return err
+		}
+		buffer = indented
+	} else {
+		b, err := json.MarshalIndent(i.elements, "", "    ")
+		if err != nil {
+			return err
+		}
+		buffer = bytes.NewReader(b)
 	}
 	}
 
 
-	if _, err := io.Copy(i.outputStream, bytes.NewReader(buffer)); err != nil {
+	if _, err := io.Copy(i.outputStream, buffer); err != nil {
 		return err
 		return err
 	}
 	}
-	_, err = io.WriteString(i.outputStream, "\n")
+	_, err := io.WriteString(i.outputStream, "\n")
 	return err
 	return err
 }
 }

+ 31 - 0
api/client/inspect/inspector_test.go

@@ -187,3 +187,34 @@ func TestIndentedInspectorEmpty(t *testing.T) {
 		t.Fatalf("Expected `%s`, got `%s`", expected, b.String())
 		t.Fatalf("Expected `%s`, got `%s`", expected, b.String())
 	}
 	}
 }
 }
+
+func TestIndentedInspectorRawElements(t *testing.T) {
+	b := new(bytes.Buffer)
+	i := NewIndentedInspector(b)
+	if err := i.Inspect(testElement{"0.0.0.0"}, []byte(`{"Dns": "0.0.0.0", "Node": "0"}`)); err != nil {
+		t.Fatal(err)
+	}
+
+	if err := i.Inspect(testElement{"1.1.1.1"}, []byte(`{"Dns": "1.1.1.1", "Node": "1"}`)); err != nil {
+		t.Fatal(err)
+	}
+
+	if err := i.Flush(); err != nil {
+		t.Fatal(err)
+	}
+
+	expected := `[
+    {
+        "Dns": "0.0.0.0",
+        "Node": "0"
+    },
+    {
+        "Dns": "1.1.1.1",
+        "Node": "1"
+    }
+]
+`
+	if b.String() != expected {
+		t.Fatalf("Expected `%s`, got `%s`", expected, b.String())
+	}
+}