mirror of
https://github.com/GoogleContainerTools/kaniko
synced 2026-10-09 15:06:17 +02:00
Upgrade docker (#2440)
* somehow now the only thing that doesnt work is devices.Device Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * this gets rid of all the compiler errors in the vendored code Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * fixed some things but a bunch of tests and maybe some compiler steps are still failing Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * all the things i figured out how to fix so far Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * guess i had to redo go mods after rebasing again Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * update docker constants to be SHOUTY CASE now Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * include DestPath in resolveEnv Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * fix one mistake in Docker lib upgrade and some typos/deprecations in the file Signed-off-by: Joe Kimmel <jkimmel@vmware.com> * last changes (hopefully) to update to new docker libs Signed-off-by: Joe Kimmel <jkimmel@vmware.com> --------- Signed-off-by: Joe Kimmel <jkimmel@vmware.com>
This commit is contained in:
+39
@@ -0,0 +1,39 @@
|
||||
package api
|
||||
|
||||
import "net"
|
||||
|
||||
const (
|
||||
// Version of the REST API, not implementation version.
|
||||
// See openapi.yaml for the definition.
|
||||
Version = "1.1.1"
|
||||
)
|
||||
|
||||
// ErrorJSON is returned with "application/json" content type and non-2XX status code
|
||||
type ErrorJSON struct {
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
// Info is the structure returned by `GET /info`
|
||||
type Info struct {
|
||||
APIVersion string `json:"apiVersion"` // REST API version
|
||||
Version string `json:"version"` // Implementation version
|
||||
StateDir string `json:"stateDir"`
|
||||
ChildPID int `json:"childPID"`
|
||||
NetworkDriver *NetworkDriverInfo `json:"networkDriver,omitempty"`
|
||||
PortDriver *PortDriverInfo `json:"portDriver,omitempty"`
|
||||
}
|
||||
|
||||
// NetworkDriverInfo in Info
|
||||
type NetworkDriverInfo struct {
|
||||
Driver string `json:"driver"`
|
||||
DNS []net.IP `json:"dns,omitempty"`
|
||||
ChildIP net.IP `json:"childIP,omitempty"` // since API v1.1.1 (RootlessKit v0.14.1)
|
||||
DynamicChildIP bool `json:"dynamicChildIP,omitempty"` // since API v1.1.1
|
||||
}
|
||||
|
||||
// PortDriverInfo in Info
|
||||
type PortDriverInfo struct {
|
||||
Driver string `json:"driver"`
|
||||
Protos []string `json:"protos"`
|
||||
DisallowLoopbackChildIP bool `json:"disallowLoopbackChildIP,omitempty"` // since API v1.1.1
|
||||
}
|
||||
+212
@@ -0,0 +1,212 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"github.com/rootless-containers/rootlesskit/pkg/api"
|
||||
"github.com/rootless-containers/rootlesskit/pkg/port"
|
||||
)
|
||||
|
||||
type Client interface {
|
||||
HTTPClient() *http.Client
|
||||
PortManager() port.Manager
|
||||
Info(context.Context) (*api.Info, error)
|
||||
}
|
||||
|
||||
// New creates a client.
|
||||
// socketPath is a path to the UNIX socket, without unix:// prefix.
|
||||
func New(socketPath string) (Client, error) {
|
||||
if _, err := os.Stat(socketPath); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
hc := &http.Client{
|
||||
Transport: &http.Transport{
|
||||
DialContext: func(ctx context.Context, _, _ string) (net.Conn, error) {
|
||||
var d net.Dialer
|
||||
return d.DialContext(ctx, "unix", socketPath)
|
||||
},
|
||||
},
|
||||
}
|
||||
return NewWithHTTPClient(hc), nil
|
||||
}
|
||||
|
||||
func NewWithHTTPClient(hc *http.Client) Client {
|
||||
return &client{
|
||||
Client: hc,
|
||||
version: "v1",
|
||||
dummyHost: "rootlesskit",
|
||||
}
|
||||
}
|
||||
|
||||
type client struct {
|
||||
*http.Client
|
||||
// version is always "v1"
|
||||
// TODO(AkihiroSuda): negotiate the version
|
||||
version string
|
||||
dummyHost string
|
||||
}
|
||||
|
||||
func (c *client) HTTPClient() *http.Client {
|
||||
return c.Client
|
||||
}
|
||||
|
||||
func (c *client) PortManager() port.Manager {
|
||||
return &portManager{
|
||||
client: c,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *client) Info(ctx context.Context) (*api.Info, error) {
|
||||
u := fmt.Sprintf("http://%s/%s/info", c.dummyHost, c.version)
|
||||
req, err := http.NewRequest("GET", u, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req = req.WithContext(ctx)
|
||||
resp, err := c.HTTPClient().Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if err := successful(resp); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var info api.Info
|
||||
dec := json.NewDecoder(resp.Body)
|
||||
if err := dec.Decode(&info); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
func readAtMost(r io.Reader, maxBytes int) ([]byte, error) {
|
||||
lr := &io.LimitedReader{
|
||||
R: r,
|
||||
N: int64(maxBytes),
|
||||
}
|
||||
b, err := io.ReadAll(lr)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
if lr.N == 0 {
|
||||
return b, fmt.Errorf("expected at most %d bytes, got more", maxBytes)
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
// HTTPStatusErrorBodyMaxLength specifies the maximum length of HTTPStatusError.Body
|
||||
const HTTPStatusErrorBodyMaxLength = 64 * 1024
|
||||
|
||||
// HTTPStatusError is created from non-2XX HTTP response
|
||||
type HTTPStatusError struct {
|
||||
// StatusCode is non-2XX status code
|
||||
StatusCode int
|
||||
// Body is at most HTTPStatusErrorBodyMaxLength
|
||||
Body string
|
||||
}
|
||||
|
||||
// Error implements error.
|
||||
// If e.Body is a marshalled string of api.ErrorJSON, Error returns ErrorJSON.Message .
|
||||
// Otherwise Error returns a human-readable string that contains e.StatusCode and e.Body.
|
||||
func (e *HTTPStatusError) Error() string {
|
||||
if e.Body != "" && len(e.Body) < HTTPStatusErrorBodyMaxLength {
|
||||
var ej api.ErrorJSON
|
||||
if json.Unmarshal([]byte(e.Body), &ej) == nil {
|
||||
return ej.Message
|
||||
}
|
||||
}
|
||||
return fmt.Sprintf("unexpected HTTP status %s, body=%q", http.StatusText(e.StatusCode), e.Body)
|
||||
}
|
||||
|
||||
func successful(resp *http.Response) error {
|
||||
if resp == nil {
|
||||
return errors.New("nil response")
|
||||
}
|
||||
if resp.StatusCode/100 != 2 {
|
||||
b, _ := readAtMost(resp.Body, HTTPStatusErrorBodyMaxLength)
|
||||
return &HTTPStatusError{
|
||||
StatusCode: resp.StatusCode,
|
||||
Body: string(b),
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type portManager struct {
|
||||
*client
|
||||
}
|
||||
|
||||
func (pm *portManager) AddPort(ctx context.Context, spec port.Spec) (*port.Status, error) {
|
||||
m, err := json.Marshal(spec)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
u := fmt.Sprintf("http://%s/%s/ports", pm.client.dummyHost, pm.client.version)
|
||||
req, err := http.NewRequest("POST", u, bytes.NewReader(m))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req = req.WithContext(ctx)
|
||||
resp, err := pm.client.HTTPClient().Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if err := successful(resp); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dec := json.NewDecoder(resp.Body)
|
||||
var status port.Status
|
||||
if err := dec.Decode(&status); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &status, nil
|
||||
}
|
||||
func (pm *portManager) ListPorts(ctx context.Context) ([]port.Status, error) {
|
||||
u := fmt.Sprintf("http://%s/%s/ports", pm.client.dummyHost, pm.client.version)
|
||||
req, err := http.NewRequest("GET", u, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req = req.WithContext(ctx)
|
||||
resp, err := pm.client.HTTPClient().Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if err := successful(resp); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var statuses []port.Status
|
||||
dec := json.NewDecoder(resp.Body)
|
||||
if err := dec.Decode(&statuses); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return statuses, nil
|
||||
}
|
||||
func (pm *portManager) RemovePort(ctx context.Context, id int) error {
|
||||
u := fmt.Sprintf("http://%s/%s/ports/%d", pm.client.dummyHost, pm.client.version, id)
|
||||
req, err := http.NewRequest("DELETE", u, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req = req.WithContext(ctx)
|
||||
resp, err := pm.client.HTTPClient().Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if err := successful(resp); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
+171
@@ -0,0 +1,171 @@
|
||||
# When you made a change to this YAML, please validate with https://editor.swagger.io
|
||||
openapi: 3.0.3
|
||||
info:
|
||||
version: 1.1.1
|
||||
title: RootlessKit API
|
||||
servers:
|
||||
- url: 'http://rootlesskit/v1'
|
||||
description: Local UNIX socket server. The host part of the URL is ignored.
|
||||
paths:
|
||||
# /info: API >= 1.1.0
|
||||
/info:
|
||||
get:
|
||||
responses:
|
||||
'200':
|
||||
description: Info. Available since API 1.1.0.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Info'
|
||||
/ports:
|
||||
get:
|
||||
responses:
|
||||
'200':
|
||||
description: An array of PortStatus
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/PortStatuses'
|
||||
post:
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/PortSpec'
|
||||
responses:
|
||||
'201':
|
||||
description: PortStatus with ID
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/PortStatus'
|
||||
'/ports/{id}':
|
||||
delete:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: integer
|
||||
format: int64
|
||||
responses:
|
||||
'200':
|
||||
description: Null response
|
||||
components:
|
||||
schemas:
|
||||
Proto:
|
||||
type: string
|
||||
description: "protocol for listening. Corresponds to Go's net.Listen. The strings with \"4\" and \"6\" suffixes were introduced in API 1.1.0."
|
||||
enum:
|
||||
- tcp
|
||||
- tcp4
|
||||
- tcp6
|
||||
- udp
|
||||
- udp4
|
||||
- udp6
|
||||
- sctp
|
||||
- sctp4
|
||||
- sctp6
|
||||
PortSpec:
|
||||
required:
|
||||
- proto
|
||||
properties:
|
||||
proto:
|
||||
$ref: '#/components/schemas/Proto'
|
||||
parentIP:
|
||||
type: string
|
||||
parentPort:
|
||||
type: integer
|
||||
format: int32
|
||||
minimum: 1
|
||||
maximum: 65535
|
||||
childIP:
|
||||
type: string
|
||||
# future version may support requests with parentPort<=0 for automatic port assignment
|
||||
childPort:
|
||||
type: integer
|
||||
format: int32
|
||||
minimum: 1
|
||||
maximum: 65535
|
||||
PortStatus:
|
||||
required:
|
||||
- id
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
spec:
|
||||
$ref: '#/components/schemas/PortSpec'
|
||||
PortStatuses:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/PortStatus'
|
||||
# Info: API >= 1.1.0
|
||||
Info:
|
||||
required:
|
||||
- apiVersion
|
||||
- version
|
||||
- stateDir
|
||||
- childPID
|
||||
properties:
|
||||
apiVersion:
|
||||
type: string
|
||||
description: "API version, without \"v\" prefix"
|
||||
example: "1.1.0"
|
||||
version:
|
||||
type: string
|
||||
description: "Implementation version, without \"v\" prefix"
|
||||
example: "0.42.0-beta.1+dev"
|
||||
stateDir:
|
||||
type: string
|
||||
description: "state dir"
|
||||
example: "/run/user/1000/rootlesskit"
|
||||
childPID:
|
||||
type: integer
|
||||
description: "child PID"
|
||||
example: 10042
|
||||
networkDriver:
|
||||
$ref: '#/components/schemas/NetworkDriverInfo'
|
||||
portDriver:
|
||||
$ref: '#/components/schemas/PortDriverInfo'
|
||||
NetworkDriverInfo:
|
||||
required:
|
||||
- driver
|
||||
properties:
|
||||
driver:
|
||||
type: string
|
||||
description: "network driver. Empty when --net=host."
|
||||
example: "slirp4netns"
|
||||
# TODO: return TAP info
|
||||
dns:
|
||||
type: array
|
||||
description: "DNS addresses"
|
||||
items:
|
||||
type: string
|
||||
example: ["10.0.2.3"]
|
||||
childIP:
|
||||
type: string
|
||||
description: "Child IP (v4)"
|
||||
example: "10.0.2.100"
|
||||
dynamicChildIP:
|
||||
type: boolean
|
||||
description: "Child IP may change"
|
||||
PortDriverInfo:
|
||||
required:
|
||||
- driver
|
||||
- supportedProtos
|
||||
properties:
|
||||
driver:
|
||||
type: string
|
||||
description: "port driver"
|
||||
example: "builtin"
|
||||
protos:
|
||||
type: array
|
||||
description: "The supported protocol strings for listening ports"
|
||||
example: ["tcp","udp"]
|
||||
items:
|
||||
$ref: '#/components/schemas/Proto'
|
||||
disallowLoopbackChildIP:
|
||||
type: boolean
|
||||
description: "If this field is set to true, loopback IP such as 127.0.0.1 cannot be specified as a child IP"
|
||||
Reference in New Issue
Block a user