summaryrefslogtreecommitdiff
path: root/pkg/bindings
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/bindings')
-rw-r--r--pkg/bindings/containers.go137
-rw-r--r--pkg/bindings/generate.go4
-rw-r--r--pkg/bindings/healthcheck.go19
-rw-r--r--pkg/bindings/info.go3
-rw-r--r--pkg/bindings/mount.go26
-rw-r--r--pkg/bindings/network.go37
-rw-r--r--pkg/bindings/play.go3
-rw-r--r--pkg/bindings/pods.go128
-rw-r--r--pkg/bindings/search.go39
-rw-r--r--pkg/bindings/version.go3
-rw-r--r--pkg/bindings/volumes.go60
11 files changed, 459 insertions, 0 deletions
diff --git a/pkg/bindings/containers.go b/pkg/bindings/containers.go
new file mode 100644
index 000000000..cd0b09767
--- /dev/null
+++ b/pkg/bindings/containers.go
@@ -0,0 +1,137 @@
+package bindings
+
+import (
+ "fmt"
+ "net/http"
+ "strconv"
+
+ "github.com/containers/libpod/cmd/podman/shared"
+ "github.com/containers/libpod/libpod"
+)
+
+func (c Connection) ListContainers(filter []string, last int, size, sync bool) ([]shared.PsContainerOutput, error) { // nolint:typecheck
+ images := []shared.PsContainerOutput{}
+ params := make(map[string]string)
+ params["last"] = strconv.Itoa(last)
+ params["size"] = strconv.FormatBool(size)
+ params["sync"] = strconv.FormatBool(sync)
+ response, err := c.newRequest(http.MethodGet, "/containers/json", nil, params)
+ if err != nil {
+ return images, err
+ }
+ return images, response.Process(nil)
+}
+
+func (c Connection) PruneContainers() ([]string, error) {
+ var (
+ pruned []string
+ )
+ response, err := c.newRequest(http.MethodPost, "/containers/prune", nil, nil)
+ if err != nil {
+ return pruned, err
+ }
+ return pruned, response.Process(nil)
+}
+
+func (c Connection) RemoveContainer(nameOrID string, force, volumes bool) error {
+ params := make(map[string]string)
+ params["force"] = strconv.FormatBool(force)
+ params["vols"] = strconv.FormatBool(volumes)
+ response, err := c.newRequest(http.MethodDelete, fmt.Sprintf("/containers/%s", nameOrID), nil, params)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) InspectContainer(nameOrID string, size bool) (*libpod.InspectContainerData, error) {
+ params := make(map[string]string)
+ params["size"] = strconv.FormatBool(size)
+ response, err := c.newRequest(http.MethodGet, fmt.Sprintf("/containers/%s/json", nameOrID), nil, params)
+ if err != nil {
+ return nil, err
+ }
+ inspect := libpod.InspectContainerData{}
+ return &inspect, response.Process(&inspect)
+}
+
+func (c Connection) KillContainer(nameOrID string, signal int) error {
+ params := make(map[string]string)
+ params["signal"] = strconv.Itoa(signal)
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/containers/%s/kill", nameOrID), nil, params)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+
+}
+func (c Connection) ContainerLogs() {}
+func (c Connection) PauseContainer(nameOrID string) error {
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/containers/%s/pause", nameOrID), nil, nil)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) RestartContainer(nameOrID string, timeout int) error {
+ // TODO how do we distinguish between an actual zero value and not wanting to change the timeout value
+ params := make(map[string]string)
+ params["timeout"] = strconv.Itoa(timeout)
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/containers/%s/restart", nameOrID), nil, params)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) StartContainer(nameOrID, detachKeys string) error {
+ params := make(map[string]string)
+ if len(detachKeys) > 0 {
+ params["detachKeys"] = detachKeys
+ }
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/containers/%s/start", nameOrID), nil, params)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) ContainerStats() {}
+func (c Connection) ContainerTop() {}
+
+func (c Connection) UnpauseContainer(nameOrID string) error {
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/containers/%s/unpause", nameOrID), nil, nil)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) WaitContainer(nameOrID string) error {
+ _, err := http.Post(c.makeEndpoint(fmt.Sprintf("containers/%s/wait", nameOrID)), "application/json", nil)
+ return err
+}
+
+func (c Connection) ContainerExists(nameOrID string) (bool, error) {
+ response, err := http.Get(c.makeEndpoint(fmt.Sprintf("/containers/%s/exists", nameOrID)))
+ if err != nil {
+ return false, err
+ }
+ if response.StatusCode == http.StatusOK {
+ return true, nil
+ }
+ return false, nil
+}
+
+func (c Connection) StopContainer(nameOrID string, timeout int) error {
+ // TODO we might need to distinguish whether a timeout is desired; a zero, the int
+ // zero value is valid; what do folks want to do?
+ params := make(map[string]string)
+ params["t"] = strconv.Itoa(timeout)
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/containers/%s/stop", nameOrID), nil, params)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
diff --git a/pkg/bindings/generate.go b/pkg/bindings/generate.go
new file mode 100644
index 000000000..534909062
--- /dev/null
+++ b/pkg/bindings/generate.go
@@ -0,0 +1,4 @@
+package bindings
+
+func (c Connection) GenerateKube() {}
+func (c Connection) GenerateSystemd() {}
diff --git a/pkg/bindings/healthcheck.go b/pkg/bindings/healthcheck.go
new file mode 100644
index 000000000..32515e332
--- /dev/null
+++ b/pkg/bindings/healthcheck.go
@@ -0,0 +1,19 @@
+package bindings
+
+import (
+ "fmt"
+ "net/http"
+
+ "github.com/containers/libpod/libpod"
+)
+
+func (c Connection) RunHealthCheck(nameOrID string) (*libpod.HealthCheckStatus, error) {
+ var (
+ status libpod.HealthCheckStatus
+ )
+ response, err := c.newRequest(http.MethodGet, fmt.Sprintf("/containers/%s/runhealthcheck", nameOrID), nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &status, response.Process(&status)
+}
diff --git a/pkg/bindings/info.go b/pkg/bindings/info.go
new file mode 100644
index 000000000..5f318d652
--- /dev/null
+++ b/pkg/bindings/info.go
@@ -0,0 +1,3 @@
+package bindings
+
+func (c Connection) Info() {}
diff --git a/pkg/bindings/mount.go b/pkg/bindings/mount.go
new file mode 100644
index 000000000..2e3d6d7f6
--- /dev/null
+++ b/pkg/bindings/mount.go
@@ -0,0 +1,26 @@
+package bindings
+
+import (
+ "fmt"
+ "net/http"
+)
+
+func (c Connection) MountContainer(nameOrID string) (string, error) {
+ var (
+ path string
+ )
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/containers/%s/mount", nameOrID), nil, nil)
+ if err != nil {
+ return path, err
+ }
+ return path, response.Process(&path)
+}
+
+func (c Connection) GetMountedContainerPaths() (map[string]string, error) {
+ mounts := make(map[string]string)
+ response, err := c.newRequest(http.MethodGet, "/containers/showmounted", nil, nil)
+ if err != nil {
+ return mounts, err
+ }
+ return mounts, response.Process(&mounts)
+}
diff --git a/pkg/bindings/network.go b/pkg/bindings/network.go
new file mode 100644
index 000000000..383615e5d
--- /dev/null
+++ b/pkg/bindings/network.go
@@ -0,0 +1,37 @@
+package bindings
+
+import (
+ "fmt"
+ "net/http"
+
+ "github.com/containernetworking/cni/libcni"
+)
+
+func (c Connection) CreateNetwork() {}
+func (c Connection) InspectNetwork(nameOrID string) (map[string]interface{}, error) {
+ n := make(map[string]interface{})
+ response, err := c.newRequest(http.MethodGet, fmt.Sprintf("/networks/%s/json", nameOrID), nil, nil)
+ if err != nil {
+ return n, err
+ }
+ return n, response.Process(&n)
+}
+
+func (c Connection) RemoveNetwork(nameOrID string) error {
+ response, err := c.newRequest(http.MethodDelete, fmt.Sprintf("/networks/%s", nameOrID), nil, nil)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) ListNetworks() ([]*libcni.NetworkConfigList, error) {
+ var (
+ netList []*libcni.NetworkConfigList
+ )
+ response, err := c.newRequest(http.MethodGet, "/networks/json", nil, nil)
+ if err != nil {
+ return netList, err
+ }
+ return netList, response.Process(&netList)
+}
diff --git a/pkg/bindings/play.go b/pkg/bindings/play.go
new file mode 100644
index 000000000..a9dee82b1
--- /dev/null
+++ b/pkg/bindings/play.go
@@ -0,0 +1,3 @@
+package bindings
+
+func (c Connection) PlayKube() {}
diff --git a/pkg/bindings/pods.go b/pkg/bindings/pods.go
new file mode 100644
index 000000000..eac9d2ef5
--- /dev/null
+++ b/pkg/bindings/pods.go
@@ -0,0 +1,128 @@
+package bindings
+
+import (
+ "fmt"
+ "net/http"
+ "strconv"
+
+ "github.com/containers/libpod/libpod"
+)
+
+func (c Connection) CreatePod() error {
+ // TODO
+ return ErrNotImplemented
+}
+
+func (c Connection) PodExists(nameOrID string) (bool, error) {
+ response, err := http.Get(c.makeEndpoint(fmt.Sprintf("/pods/%s/exists", nameOrID)))
+ if err != nil {
+ return false, err
+ }
+ return response.StatusCode == http.StatusOK, err
+}
+
+func (c Connection) InspectPod(nameOrID string) (*libpod.PodInspect, error) {
+ inspect := libpod.PodInspect{}
+ response, err := c.newRequest(http.MethodGet, fmt.Sprintf("/pods/%s/json", nameOrID), nil, nil)
+ if err != nil {
+ return &inspect, err
+ }
+ return &inspect, response.Process(&inspect)
+}
+
+func (c Connection) KillPod(nameOrID string, signal int) error {
+ params := make(map[string]string)
+ params["signal"] = strconv.Itoa(signal)
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/pods/%s/kill", nameOrID), nil, params)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) PausePod(nameOrID string) error {
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/pods/%s/pause", nameOrID), nil, nil)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) PrunePods(force bool) error {
+ params := make(map[string]string)
+ params["force"] = strconv.FormatBool(force)
+ response, err := c.newRequest(http.MethodPost, "/pods/prune", nil, params)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) ListPods(filters []string) (*[]libpod.PodInspect, error) {
+ var (
+ inspect []libpod.PodInspect
+ )
+ params := make(map[string]string)
+ // TODO I dont remember how to do this for []string{}
+ // FIXME
+ //params["filters"] = strconv.FormatBool(force)
+ response, err := c.newRequest(http.MethodPost, "/pods/json", nil, params)
+ if err != nil {
+ return &inspect, err
+ }
+ return &inspect, response.Process(&inspect)
+}
+
+func (c Connection) RestartPod(nameOrID string) error {
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/pods/%s/restart", nameOrID), nil, nil)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) RemovePod(nameOrID string, force bool) error {
+ params := make(map[string]string)
+ params["force"] = strconv.FormatBool(force)
+ response, err := c.newRequest(http.MethodDelete, fmt.Sprintf("/pods/%s", nameOrID), nil, params)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) StartPod(nameOrID string) error {
+ response, err := c.newRequest(http.MethodDelete, fmt.Sprintf("/pods/%s/start", nameOrID), nil, nil)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) PodStats() error {
+ // TODO
+ return ErrNotImplemented
+}
+
+func (c Connection) StopPod(nameOrID string, timeout int) error {
+ params := make(map[string]string)
+ params["t"] = strconv.Itoa(timeout)
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/pods/%s/stop", nameOrID), nil, params)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
+
+func (c Connection) PodTop() error {
+ // TODO
+ return ErrNotImplemented // nolint:typecheck
+}
+
+func (c Connection) UnpausePod(nameOrID string) error {
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/pods/%s/unpause", nameOrID), nil, nil)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}
diff --git a/pkg/bindings/search.go b/pkg/bindings/search.go
new file mode 100644
index 000000000..0f462357c
--- /dev/null
+++ b/pkg/bindings/search.go
@@ -0,0 +1,39 @@
+package bindings
+
+import (
+ "net/http"
+ "strconv"
+
+ "github.com/containers/libpod/libpod/image"
+)
+
+type ImageSearchFilters struct {
+ Automated bool `json:"automated"`
+ Official bool `json:"official"`
+ Stars int `json:"stars"`
+}
+
+// TODO This method can be concluded when we determine how we want the filters to work on the
+// API end
+func (i *ImageSearchFilters) ToMapJSON() string {
+ return ""
+}
+
+func (c Connection) SearchImages(term string, limit int, filters *ImageSearchFilters) ([]image.SearchResult, error) {
+ var (
+ searchResults []image.SearchResult
+ )
+ params := make(map[string]string)
+ params["term"] = term
+ if limit > 0 {
+ params["limit"] = strconv.Itoa(limit)
+ }
+ if filters != nil {
+ params["filters"] = filters.ToMapJSON()
+ }
+ response, err := c.newRequest(http.MethodGet, "/images/search", nil, params)
+ if err != nil {
+ return searchResults, nil
+ }
+ return searchResults, response.Process(&searchResults)
+}
diff --git a/pkg/bindings/version.go b/pkg/bindings/version.go
new file mode 100644
index 000000000..c833a644c
--- /dev/null
+++ b/pkg/bindings/version.go
@@ -0,0 +1,3 @@
+package bindings
+
+func (c Connection) Version() {}
diff --git a/pkg/bindings/volumes.go b/pkg/bindings/volumes.go
new file mode 100644
index 000000000..27e6f9efa
--- /dev/null
+++ b/pkg/bindings/volumes.go
@@ -0,0 +1,60 @@
+package bindings
+
+import (
+ "fmt"
+ "net/http"
+ "strconv"
+
+ "github.com/containers/libpod/libpod"
+ "github.com/containers/libpod/pkg/api/handlers"
+)
+
+func (c Connection) CreateVolume(config handlers.VolumeCreateConfig) (string, error) {
+ var (
+ volumeID string
+ )
+ response, err := c.newRequest(http.MethodPost, "/volumes/create", nil, nil)
+ if err != nil {
+ return volumeID, err
+ }
+ return volumeID, response.Process(&volumeID)
+}
+
+func (c Connection) InspectVolume(nameOrID string) (*libpod.InspectVolumeData, error) {
+ var (
+ inspect libpod.InspectVolumeData
+ )
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/volumes/%s/json", nameOrID), nil, nil)
+ if err != nil {
+ return &inspect, err
+ }
+ return &inspect, response.Process(&inspect)
+}
+
+func (c Connection) ListVolumes() error {
+ // TODO
+ // The API side of things for this one does a lot in main and therefore
+ // is not implemented yet.
+ return ErrNotImplemented // nolint:typecheck
+}
+
+func (c Connection) PruneVolumes() ([]string, error) {
+ var (
+ pruned []string
+ )
+ response, err := c.newRequest(http.MethodPost, "/volumes/prune", nil, nil)
+ if err != nil {
+ return pruned, err
+ }
+ return pruned, response.Process(&pruned)
+}
+
+func (c Connection) RemoveVolume(nameOrID string, force bool) error {
+ params := make(map[string]string)
+ params["force"] = strconv.FormatBool(force)
+ response, err := c.newRequest(http.MethodPost, fmt.Sprintf("/volumes/prune", nameOrID), nil, params)
+ if err != nil {
+ return err
+ }
+ return response.Process(nil)
+}