1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
// Copyright 2016 go-dockerclient authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package docker
import (
"context"
"encoding/json"
"errors"
"net/http"
"net/url"
"strconv"
"github.com/docker/docker/api/types/swarm"
)
// NoSuchSecret is the error returned when a given secret does not exist.
type NoSuchSecret struct {
ID string
Err error
}
func (err *NoSuchSecret) Error() string {
if err.Err != nil {
return err.Err.Error()
}
return "No such secret: " + err.ID
}
// CreateSecretOptions specify parameters to the CreateSecret function.
//
// See https://goo.gl/KrVjHz for more details.
type CreateSecretOptions struct {
Auth AuthConfiguration `qs:"-"`
swarm.SecretSpec
Context context.Context
}
// CreateSecret creates a new secret, returning the secret instance
// or an error in case of failure.
//
// See https://goo.gl/KrVjHz for more details.
func (c *Client) CreateSecret(opts CreateSecretOptions) (*swarm.Secret, error) {
headers, err := headersWithAuth(opts.Auth)
if err != nil {
return nil, err
}
path := "/secrets/create?" + queryString(opts)
resp, err := c.do(http.MethodPost, path, doOptions{
headers: headers,
data: opts.SecretSpec,
forceJSON: true,
context: opts.Context,
})
if err != nil {
return nil, err
}
defer resp.Body.Close()
var secret swarm.Secret
if err := json.NewDecoder(resp.Body).Decode(&secret); err != nil {
return nil, err
}
return &secret, nil
}
// RemoveSecretOptions encapsulates options to remove a secret.
//
// See https://goo.gl/Tqrtya for more details.
type RemoveSecretOptions struct {
ID string `qs:"-"`
Context context.Context
}
// RemoveSecret removes a secret, returning an error in case of failure.
//
// See https://goo.gl/Tqrtya for more details.
func (c *Client) RemoveSecret(opts RemoveSecretOptions) error {
path := "/secrets/" + opts.ID
resp, err := c.do(http.MethodDelete, path, doOptions{context: opts.Context})
if err != nil {
var e *Error
if errors.As(err, &e) && e.Status == http.StatusNotFound {
return &NoSuchSecret{ID: opts.ID}
}
return err
}
resp.Body.Close()
return nil
}
// UpdateSecretOptions specify parameters to the UpdateSecret function.
//
// Only label can be updated
// See https://docs.docker.com/engine/api/v1.33/#operation/SecretUpdate
// See https://goo.gl/wu3MmS for more details.
type UpdateSecretOptions struct {
Auth AuthConfiguration `qs:"-"`
swarm.SecretSpec
Context context.Context
Version uint64
}
// UpdateSecret updates the secret at ID with the options
//
// See https://goo.gl/wu3MmS for more details.
func (c *Client) UpdateSecret(id string, opts UpdateSecretOptions) error {
headers, err := headersWithAuth(opts.Auth)
if err != nil {
return err
}
params := make(url.Values)
params.Set("version", strconv.FormatUint(opts.Version, 10))
resp, err := c.do(http.MethodPost, "/secrets/"+id+"/update?"+params.Encode(), doOptions{
headers: headers,
data: opts.SecretSpec,
forceJSON: true,
context: opts.Context,
})
if err != nil {
var e *Error
if errors.As(err, &e) && e.Status == http.StatusNotFound {
return &NoSuchSecret{ID: id}
}
return err
}
defer resp.Body.Close()
return nil
}
// InspectSecret returns information about a secret by its ID.
//
// See https://goo.gl/dHmr75 for more details.
func (c *Client) InspectSecret(id string) (*swarm.Secret, error) {
path := "/secrets/" + id
resp, err := c.do(http.MethodGet, path, doOptions{})
if err != nil {
var e *Error
if errors.As(err, &e) && e.Status == http.StatusNotFound {
return nil, &NoSuchSecret{ID: id}
}
return nil, err
}
defer resp.Body.Close()
var secret swarm.Secret
if err := json.NewDecoder(resp.Body).Decode(&secret); err != nil {
return nil, err
}
return &secret, nil
}
// ListSecretsOptions specify parameters to the ListSecrets function.
//
// See https://goo.gl/DwvNMd for more details.
type ListSecretsOptions struct {
Filters map[string][]string
Context context.Context
}
// ListSecrets returns a slice of secrets matching the given criteria.
//
// See https://goo.gl/DwvNMd for more details.
func (c *Client) ListSecrets(opts ListSecretsOptions) ([]swarm.Secret, error) {
path := "/secrets?" + queryString(opts)
resp, err := c.do(http.MethodGet, path, doOptions{context: opts.Context})
if err != nil {
return nil, err
}
defer resp.Body.Close()
var secrets []swarm.Secret
if err := json.NewDecoder(resp.Body).Decode(&secrets); err != nil {
return nil, err
}
return secrets, nil
}
|