From 8ae28a55acc51a02597b23140916a690fbbdc3fc Mon Sep 17 00:00:00 2001
From: Jhon Honce <jhonce@redhat.com>
Date: Mon, 6 Apr 2020 16:40:32 -0700
Subject: V2 podman diff(changes) support

* Ported CLI command
* Added API endpoint
* Added bindings
* Updated swagger (TODO: n endpoints, one handler)

Signed-off-by: Jhon Honce <jhonce@redhat.com>
---
 pkg/api/handlers/compat/changes.go    | 20 ++++++++++++++++++++
 pkg/api/handlers/compat/swagger.go    | 10 ++++++++++
 pkg/api/server/register_containers.go | 35 +++++++++++++++++++++++++++++++++++
 pkg/api/server/register_images.go     | 31 +++++++++++++++++++++++++++++++
 4 files changed, 96 insertions(+)
 create mode 100644 pkg/api/handlers/compat/changes.go

(limited to 'pkg/api')

diff --git a/pkg/api/handlers/compat/changes.go b/pkg/api/handlers/compat/changes.go
new file mode 100644
index 000000000..6907c487e
--- /dev/null
+++ b/pkg/api/handlers/compat/changes.go
@@ -0,0 +1,20 @@
+package compat
+
+import (
+	"net/http"
+
+	"github.com/containers/libpod/libpod"
+	"github.com/containers/libpod/pkg/api/handlers/utils"
+)
+
+func Changes(w http.ResponseWriter, r *http.Request) {
+	runtime := r.Context().Value("runtime").(*libpod.Runtime)
+
+	id := utils.GetName(r)
+	changes, err := runtime.GetDiff("", id)
+	if err != nil {
+		utils.InternalServerError(w, err)
+		return
+	}
+	utils.WriteJSON(w, 200, changes)
+}
diff --git a/pkg/api/handlers/compat/swagger.go b/pkg/api/handlers/compat/swagger.go
index cbd8e61fb..f1aabf987 100644
--- a/pkg/api/handlers/compat/swagger.go
+++ b/pkg/api/handlers/compat/swagger.go
@@ -2,6 +2,7 @@ package compat
 
 import (
 	"github.com/containers/libpod/pkg/api/handlers/utils"
+	"github.com/containers/storage/pkg/archive"
 )
 
 // Create container
@@ -25,3 +26,12 @@ type swagCtrWaitResponse struct {
 		}
 	}
 }
+
+// Object Changes
+// swagger:response Changes
+type swagChangesResponse struct {
+	// in:body
+	Body struct {
+		Changes []archive.Change
+	}
+}
diff --git a/pkg/api/server/register_containers.go b/pkg/api/server/register_containers.go
index f126112d0..150cca872 100644
--- a/pkg/api/server/register_containers.go
+++ b/pkg/api/server/register_containers.go
@@ -1377,5 +1377,40 @@ func (s *APIServer) registerContainersHandlers(r *mux.Router) error {
 	//   500:
 	//     $ref: "#/responses/InternalError"
 	r.HandleFunc(VersionedPath("/libpod/containers/{name}/restore"), s.APIHandler(libpod.Restore)).Methods(http.MethodPost)
+
+	// swagger:operation GET /containers/{name}/changes libpod libpodChangesContainer
+	// swagger:operation GET /libpod/containers/{name}/changes compat changesContainer
+	// ---
+	// tags:
+	//   - containers
+	//   - containers (compat)
+	// summary: Report on changes to container's filesystem; adds, deletes or modifications.
+	// description: |
+	//   Returns which files in a container's filesystem have been added, deleted, or modified. The Kind of modification can be one of:
+	//
+	//   0: Modified
+	//   1: Added
+	//   2: Deleted
+	// parameters:
+	//  - in: path
+	//    name: name
+	//    type: string
+	//    required: true
+	//    description: the name or id of the container
+	// responses:
+	//   200:
+	//     description: Array of Changes
+	//     content:
+	//       application/json:
+	//       schema:
+	//         $ref: "#/responses/Changes"
+	//   404:
+	//     $ref: "#/responses/NoSuchContainer"
+	//   500:
+	//     $ref: "#/responses/InternalError"
+	r.HandleFunc(VersionedPath("/containers/{name}/changes"), s.APIHandler(compat.Changes))
+	r.HandleFunc("/containers/{name}/changes", s.APIHandler(compat.Changes))
+	r.HandleFunc(VersionedPath("/libpod/containers/{name}/changes"), s.APIHandler(compat.Changes))
+
 	return nil
 }
diff --git a/pkg/api/server/register_images.go b/pkg/api/server/register_images.go
index d45423096..77560e789 100644
--- a/pkg/api/server/register_images.go
+++ b/pkg/api/server/register_images.go
@@ -1125,5 +1125,36 @@ func (s *APIServer) registerImagesHandlers(r *mux.Router) error {
 	//   500:
 	//     $ref: '#/responses/InternalError'
 	r.Handle(VersionedPath("/libpod/images/{name:.*}/untag"), s.APIHandler(libpod.UntagImage)).Methods(http.MethodPost)
+
+	// swagger:operation GET /libpod/images/{name}/changes libpod libpodChangesImages
+	// ---
+	// tags:
+	//   - images
+	// summary: Report on changes to images's filesystem; adds, deletes or modifications.
+	// description: |
+	//   Returns which files in a images's filesystem have been added, deleted, or modified. The Kind of modification can be one of:
+	//
+	//   0: Modified
+	//   1: Added
+	//   2: Deleted
+	// parameters:
+	//  - in: path
+	//    name: name
+	//    type: string
+	//    required: true
+	//    description: the name or id of the container
+	// responses:
+	//   200:
+	//     description: Array of Changes
+	//     content:
+	//       application/json:
+	//       schema:
+	//         $ref: "#/responses/Changes"
+	//   404:
+	//     $ref: "#/responses/NoSuchContainer"
+	//   500:
+	//     $ref: "#/responses/InternalError"
+	r.HandleFunc(VersionedPath("/libpod/images/{name}/changes"), s.APIHandler(compat.Changes))
+
 	return nil
 }
-- 
cgit v1.2.3-54-g00ecf