mirror of
https://gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud
synced 2024-11-24 23:36:25 +00:00
Changed client's Entities into interfaces, improved CreateWithoutPassword
This commit is contained in:
parent
54b39956e3
commit
fc966d8703
10
apps.go
10
apps.go
@ -6,16 +6,6 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
//AppsI available methods
|
|
||||||
type AppsI interface {
|
|
||||||
List() ([]string, error)
|
|
||||||
ListEnabled() ([]string, error)
|
|
||||||
ListDisabled() ([]string, error)
|
|
||||||
Infos(name string) (types.App, error)
|
|
||||||
Enable(name string) error
|
|
||||||
Disable(name string) error
|
|
||||||
}
|
|
||||||
|
|
||||||
//Apps contains all Apps available actions
|
//Apps contains all Apps available actions
|
||||||
type Apps struct {
|
type Apps struct {
|
||||||
c *Client
|
c *Client
|
||||||
|
@ -9,7 +9,7 @@ func TestClientAppsList(t *testing.T) {
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
t.FailNow()
|
t.FailNow()
|
||||||
}
|
}
|
||||||
l, err := c.Apps.List()
|
l, err := c.Apps().List()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotEmpty(t, l)
|
assert.NotEmpty(t, l)
|
||||||
}
|
}
|
||||||
|
@ -7,17 +7,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
//AppsConfigI available methods
|
|
||||||
type AppsConfigI interface {
|
|
||||||
List() (apps []string, err error)
|
|
||||||
Keys(id string) (keys []string, err error)
|
|
||||||
Value(id, key string) (string, error)
|
|
||||||
SetValue(id, key, value string) error
|
|
||||||
DeleteValue(id, key, value string) error
|
|
||||||
Get() (map[string]map[string]string, error)
|
|
||||||
Details(appID string) (map[string]string, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
//AppsConfig contains all Apps Configuration available actions
|
//AppsConfig contains all Apps Configuration available actions
|
||||||
type AppsConfig struct {
|
type AppsConfig struct {
|
||||||
c *Client
|
c *Client
|
||||||
|
@ -10,7 +10,7 @@ func TestAppsConfig(t *testing.T) {
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
ac, err := c.AppsConfig.Get()
|
ac, err := c.AppsConfig().Get()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotEmpty(t, ac)
|
assert.NotEmpty(t, ac)
|
||||||
}
|
}
|
||||||
@ -20,7 +20,7 @@ func TestAppsConfigList(t *testing.T) {
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
a, err := c.AppsConfig.List()
|
a, err := c.AppsConfig().List()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Contains(t, a, "files")
|
assert.Contains(t, a, "files")
|
||||||
}
|
}
|
||||||
@ -30,7 +30,7 @@ func TestAppsConfigKeys(t *testing.T) {
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
ks, err := c.AppsConfig.Keys("activity")
|
ks, err := c.AppsConfig().Keys("activity")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Contains(t, ks, "enabled")
|
assert.Contains(t, ks, "enabled")
|
||||||
}
|
}
|
||||||
@ -40,7 +40,7 @@ func TestAppsConfigValue(t *testing.T) {
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
k, err := c.AppsConfig.Value("files", "enabled")
|
k, err := c.AppsConfig().Value("files", "enabled")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "yes", k)
|
assert.Equal(t, "yes", k)
|
||||||
}
|
}
|
||||||
@ -50,7 +50,7 @@ func TestAppConfigDetails(t *testing.T) {
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
d, err := c.AppsConfig.Details("activity")
|
d, err := c.AppsConfig().Details("activity")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotEmpty(t, d)
|
assert.NotEmpty(t, d)
|
||||||
}
|
}
|
||||||
|
56
client.go
56
client.go
@ -16,13 +16,13 @@ type Client struct {
|
|||||||
capabilities *types.Capabilities
|
capabilities *types.Capabilities
|
||||||
version *types.Version
|
version *types.Version
|
||||||
|
|
||||||
Apps *Apps
|
apps *Apps
|
||||||
AppsConfig *AppsConfig
|
appsConfig *AppsConfig
|
||||||
GroupFolders *GroupFolders
|
groupFolders *GroupFolders
|
||||||
Notifications *Notifications
|
notifications *Notifications
|
||||||
Shares *Shares
|
shares *Shares
|
||||||
Users *Users
|
users *Users
|
||||||
Groups *Groups
|
groups *Groups
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient create a new Client from the Nextcloud Instance URL
|
// NewClient create a new Client from the Nextcloud Instance URL
|
||||||
@ -42,12 +42,40 @@ func NewClient(hostname string) (*Client, error) {
|
|||||||
"Accept": "application/json",
|
"Accept": "application/json",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
c.Apps = &Apps{c}
|
c.apps = &Apps{c}
|
||||||
c.AppsConfig = &AppsConfig{c}
|
c.appsConfig = &AppsConfig{c}
|
||||||
c.GroupFolders = &GroupFolders{c}
|
c.groupFolders = &GroupFolders{c}
|
||||||
c.Notifications = &Notifications{c}
|
c.notifications = &Notifications{c}
|
||||||
c.Shares = &Shares{c}
|
c.shares = &Shares{c}
|
||||||
c.Users = &Users{c}
|
c.users = &Users{c}
|
||||||
c.Groups = &Groups{c}
|
c.groups = &Groups{c}
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) Apps() types.Apps {
|
||||||
|
return c.apps
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) AppsConfig() types.AppsConfig {
|
||||||
|
return c.appsConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) GroupFolders() types.GroupFolders {
|
||||||
|
return c.groupFolders
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) Notifications() types.Notifications {
|
||||||
|
return c.notifications
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) Shares() types.Shares {
|
||||||
|
return c.shares
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) Users() types.Users {
|
||||||
|
return c.users
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) Groups() types.Groups {
|
||||||
|
return c.groups
|
||||||
|
}
|
||||||
|
2
doc.go
2
doc.go
@ -30,7 +30,7 @@ For example, to list all the Nextcloud's instance users:
|
|||||||
}
|
}
|
||||||
defer c.Logout()
|
defer c.Logout()
|
||||||
|
|
||||||
users, err := c.Users.List()
|
users, err := c.Users().List()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
2103
docs/README.md
2103
docs/README.md
File diff suppressed because it is too large
Load Diff
@ -74,7 +74,7 @@ var (
|
|||||||
{
|
{
|
||||||
"user list",
|
"user list",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
us, err := c.Users.List()
|
us, err := c.Users().List()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Contains(t, us, config.Login)
|
assert.Contains(t, us, config.Login)
|
||||||
},
|
},
|
||||||
@ -83,7 +83,7 @@ var (
|
|||||||
{
|
{
|
||||||
"existing user",
|
"existing user",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
u, err := c.Users.Get(config.Login)
|
u, err := c.Users().Get(config.Login)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, u)
|
assert.NotNil(t, u)
|
||||||
},
|
},
|
||||||
@ -92,7 +92,7 @@ var (
|
|||||||
{
|
{
|
||||||
"empty user",
|
"empty user",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
u, err := c.Users.Get("")
|
u, err := c.Users().Get("")
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
assert.Empty(t, u)
|
assert.Empty(t, u)
|
||||||
},
|
},
|
||||||
@ -101,7 +101,7 @@ var (
|
|||||||
{
|
{
|
||||||
"TestNonExistingUser",
|
"TestNonExistingUser",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
_, err := c.Users.Get(config.NotExistingUser)
|
_, err := c.Users().Get(config.NotExistingUser)
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -109,7 +109,7 @@ var (
|
|||||||
{
|
{
|
||||||
"TestUserSearch",
|
"TestUserSearch",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
us, err := c.Users.Search(config.Login)
|
us, err := c.Users().Search(config.Login)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Contains(t, us, config.Login)
|
assert.Contains(t, us, config.Login)
|
||||||
},
|
},
|
||||||
@ -118,7 +118,7 @@ var (
|
|||||||
{
|
{
|
||||||
"TestUserCreate",
|
"TestUserCreate",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Users.Create(config.NotExistingUser, password, nil)
|
err := c.Users().Create(config.NotExistingUser, password, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -138,9 +138,9 @@ var (
|
|||||||
// Phone: "42 42 242 424",
|
// Phone: "42 42 242 424",
|
||||||
// Website: "my.site.com",
|
// Website: "my.site.com",
|
||||||
// }
|
// }
|
||||||
// err := c.Users.Create(username, password, user)
|
// err := c.Users().Create(username, password, user)
|
||||||
// assert.NoError(t, err)
|
// assert.NoError(t, err)
|
||||||
// u, err := c.Users.Get(username)
|
// u, err := c.Users().Get(username)
|
||||||
// assert.NoError(t, err)
|
// assert.NoError(t, err)
|
||||||
// o := structs.Map(user)
|
// o := structs.Map(user)
|
||||||
// r := structs.Map(u)
|
// r := structs.Map(u)
|
||||||
@ -151,7 +151,7 @@ var (
|
|||||||
// assert.Equal(t, o[k], r[k])
|
// assert.Equal(t, o[k], r[k])
|
||||||
// }
|
// }
|
||||||
// // Clean up
|
// // Clean up
|
||||||
// err = c.Users.Delete(u.ID)
|
// err = c.Users().Delete(u.ID)
|
||||||
// assert.NoError(t, err)
|
// assert.NoError(t, err)
|
||||||
// },
|
// },
|
||||||
//},
|
//},
|
||||||
@ -163,7 +163,7 @@ var (
|
|||||||
// return
|
// return
|
||||||
// }
|
// }
|
||||||
// username := fmt.Sprintf("%s-2", config.NotExistingUser)
|
// username := fmt.Sprintf("%s-2", config.NotExistingUser)
|
||||||
// err := c.Users.Create(username, password, nil)
|
// err := c.Users().Create(username, password, nil)
|
||||||
// assert.NoError(t, err)
|
// assert.NoError(t, err)
|
||||||
// user := &types.Users{
|
// user := &types.Users{
|
||||||
// ID: username,
|
// ID: username,
|
||||||
@ -174,9 +174,9 @@ var (
|
|||||||
// Phone: "42 42 242 424",
|
// Phone: "42 42 242 424",
|
||||||
// Website: "my.site.com",
|
// Website: "my.site.com",
|
||||||
// }
|
// }
|
||||||
// err = c.Users.Update(user)
|
// err = c.Users().Update(user)
|
||||||
// assert.NoError(t, err)
|
// assert.NoError(t, err)
|
||||||
// u, err := c.Users.Get(username)
|
// u, err := c.Users().Get(username)
|
||||||
// assert.NoError(t, err)
|
// assert.NoError(t, err)
|
||||||
// o := structs.Map(user)
|
// o := structs.Map(user)
|
||||||
// r := structs.Map(u)
|
// r := structs.Map(u)
|
||||||
@ -187,14 +187,14 @@ var (
|
|||||||
// assert.Equal(t, o[k], r[k])
|
// assert.Equal(t, o[k], r[k])
|
||||||
// }
|
// }
|
||||||
// // Clean up
|
// // Clean up
|
||||||
// err = c.Users.Delete(u.ID)
|
// err = c.Users().Delete(u.ID)
|
||||||
// assert.NoError(t, err)
|
// assert.NoError(t, err)
|
||||||
// },
|
// },
|
||||||
//},
|
//},
|
||||||
{
|
{
|
||||||
"TestUserCreateExisting",
|
"TestUserCreateExisting",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Users.Create(config.Login, password, nil)
|
err := c.Users().Create(config.Login, password, nil)
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -202,7 +202,7 @@ var (
|
|||||||
{
|
{
|
||||||
"TestGroupList",
|
"TestGroupList",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
gs, err := c.Groups.List()
|
gs, err := c.Groups().List()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Contains(t, gs, "admin")
|
assert.Contains(t, gs, "admin")
|
||||||
},
|
},
|
||||||
@ -211,7 +211,7 @@ var (
|
|||||||
{
|
{
|
||||||
"TestGroupCreate",
|
"TestGroupCreate",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Groups.Create(config.NotExistingGroup)
|
err := c.Groups().Create(config.NotExistingGroup)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -220,9 +220,9 @@ var (
|
|||||||
"TestUserUpdateEmail",
|
"TestUserUpdateEmail",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
email := "my@mail.com"
|
email := "my@mail.com"
|
||||||
err := c.Users.UpdateEmail(config.NotExistingUser, email)
|
err := c.Users().UpdateEmail(config.NotExistingUser, email)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
u, err := c.Users.Get(config.NotExistingUser)
|
u, err := c.Users().Get(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
@ -236,9 +236,9 @@ var (
|
|||||||
"TestUserUpdateDisplayName",
|
"TestUserUpdateDisplayName",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
displayName := "Display Name"
|
displayName := "Display Name"
|
||||||
err := c.Users.UpdateDisplayName(config.NotExistingUser, displayName)
|
err := c.Users().UpdateDisplayName(config.NotExistingUser, displayName)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
u, err := c.Users.Get(config.NotExistingUser)
|
u, err := c.Users().Get(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
@ -252,9 +252,9 @@ var (
|
|||||||
"TestUserUpdatePhone",
|
"TestUserUpdatePhone",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
phone := "+33 42 42 42 42"
|
phone := "+33 42 42 42 42"
|
||||||
err := c.Users.UpdatePhone(config.NotExistingUser, phone)
|
err := c.Users().UpdatePhone(config.NotExistingUser, phone)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
u, err := c.Users.Get(config.NotExistingUser)
|
u, err := c.Users().Get(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
@ -268,9 +268,9 @@ var (
|
|||||||
"TestUserUpdateAddress",
|
"TestUserUpdateAddress",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
address := "Main Street, Galifrey"
|
address := "Main Street, Galifrey"
|
||||||
err := c.Users.UpdateAddress(config.NotExistingUser, address)
|
err := c.Users().UpdateAddress(config.NotExistingUser, address)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
u, err := c.Users.Get(config.NotExistingUser)
|
u, err := c.Users().Get(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
@ -284,9 +284,9 @@ var (
|
|||||||
"TestUserUpdateWebSite",
|
"TestUserUpdateWebSite",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
website := "www.doctor.who"
|
website := "www.doctor.who"
|
||||||
err := c.Users.UpdateWebSite(config.NotExistingUser, website)
|
err := c.Users().UpdateWebSite(config.NotExistingUser, website)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
u, err := c.Users.Get(config.NotExistingUser)
|
u, err := c.Users().Get(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
@ -299,9 +299,9 @@ var (
|
|||||||
"TestUserUpdateTwitter",
|
"TestUserUpdateTwitter",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
twitter := "@doctorwho"
|
twitter := "@doctorwho"
|
||||||
err := c.Users.UpdateTwitter(config.NotExistingUser, twitter)
|
err := c.Users().UpdateTwitter(config.NotExistingUser, twitter)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
u, err := c.Users.Get(config.NotExistingUser)
|
u, err := c.Users().Get(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
@ -314,7 +314,7 @@ var (
|
|||||||
"TestUserUpdateQuota",
|
"TestUserUpdateQuota",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
quota := 1024 * 1024 * 1024
|
quota := 1024 * 1024 * 1024
|
||||||
err := c.Users.UpdateQuota(config.NotExistingUser, quota)
|
err := c.Users().UpdateQuota(config.NotExistingUser, quota)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
// TODO : Find better verification : A never connected Users does not have quota available
|
// TODO : Find better verification : A never connected Users does not have quota available
|
||||||
//u, err := c.Users(config.NotExistingUser)
|
//u, err := c.Users(config.NotExistingUser)
|
||||||
@ -326,15 +326,15 @@ var (
|
|||||||
"TestUserUpdatePassword",
|
"TestUserUpdatePassword",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
password := "newcomplexpassword"
|
password := "newcomplexpassword"
|
||||||
err := c.Users.UpdatePassword(config.NotExistingUser, password)
|
err := c.Users().UpdatePassword(config.NotExistingUser, password)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}},
|
}},
|
||||||
{
|
{
|
||||||
"TestUserGroupAdd",
|
"TestUserGroupAdd",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Users.GroupAdd(config.NotExistingUser, config.NotExistingGroup)
|
err := c.Users().GroupAdd(config.NotExistingUser, config.NotExistingGroup)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
gs, err := c.Users.GroupList(config.NotExistingUser)
|
gs, err := c.Users().GroupList(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Contains(t, gs, config.NotExistingGroup)
|
assert.Contains(t, gs, config.NotExistingGroup)
|
||||||
},
|
},
|
||||||
@ -342,7 +342,7 @@ var (
|
|||||||
{
|
{
|
||||||
"TestUserGroupSubAdminList",
|
"TestUserGroupSubAdminList",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
gs, err := c.Users.GroupSubAdminList(config.NotExistingUser)
|
gs, err := c.Users().GroupSubAdminList(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Empty(t, gs)
|
assert.Empty(t, gs)
|
||||||
},
|
},
|
||||||
@ -350,9 +350,9 @@ var (
|
|||||||
{
|
{
|
||||||
"TestUserGroupPromote",
|
"TestUserGroupPromote",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Users.GroupPromote(config.NotExistingUser, config.NotExistingGroup)
|
err := c.Users().GroupPromote(config.NotExistingUser, config.NotExistingGroup)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
gs, err := c.Users.GroupSubAdminList(config.NotExistingUser)
|
gs, err := c.Users().GroupSubAdminList(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Contains(t, gs, config.NotExistingGroup)
|
assert.Contains(t, gs, config.NotExistingGroup)
|
||||||
},
|
},
|
||||||
@ -360,7 +360,7 @@ var (
|
|||||||
{
|
{
|
||||||
"TestUserGroupDemote",
|
"TestUserGroupDemote",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Users.GroupDemote(config.NotExistingUser, config.NotExistingGroup)
|
err := c.Users().GroupDemote(config.NotExistingUser, config.NotExistingGroup)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
//gs, err := c.UserGroupSubAdminList(config.NotExistingUser)
|
//gs, err := c.UserGroupSubAdminList(config.NotExistingUser)
|
||||||
//assert.NoError(t, err)
|
//assert.NoError(t, err)
|
||||||
@ -370,9 +370,9 @@ var (
|
|||||||
{
|
{
|
||||||
"TestUserDisable",
|
"TestUserDisable",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Users.Disable(config.NotExistingUser)
|
err := c.Users().Disable(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
u, err := c.Users.Get(config.NotExistingUser)
|
u, err := c.Users().Get(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
@ -384,9 +384,9 @@ var (
|
|||||||
{
|
{
|
||||||
"TestUserEnable",
|
"TestUserEnable",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Users.Enable(config.NotExistingUser)
|
err := c.Users().Enable(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
u, err := c.Users.Get(config.NotExistingUser)
|
u, err := c.Users().Get(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
@ -398,14 +398,14 @@ var (
|
|||||||
{
|
{
|
||||||
"TestGroupDelete",
|
"TestGroupDelete",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Groups.Delete(config.NotExistingGroup)
|
err := c.Groups().Delete(config.NotExistingGroup)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"TestUserDelete",
|
"TestUserDelete",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Users.Delete(config.NotExistingUser)
|
err := c.Users().Delete(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -424,7 +424,7 @@ var (
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
s, err := c.Shares.List()
|
s, err := c.Shares().List()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, s)
|
assert.NotNil(t, s)
|
||||||
},
|
},
|
||||||
@ -482,9 +482,9 @@ func TestUserCreateWithoutPassword(t *testing.T) {
|
|||||||
t.SkipNow()
|
t.SkipNow()
|
||||||
}
|
}
|
||||||
// Nextcloud does not seems to like recreating a deleted user
|
// Nextcloud does not seems to like recreating a deleted user
|
||||||
err := c.Users.CreateWithoutPassword(config.NotExistingUser, config.Email, strings.Title(config.NotExistingUser))
|
err := c.Users().CreateWithoutPassword(config.NotExistingUser, config.Email, strings.Title(config.NotExistingUser), "100024", "en", "admin")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
err = c.Users.Delete(config.NotExistingUser)
|
err = c.Users().Delete(config.NotExistingUser)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -493,7 +493,7 @@ func TestUserListDetails(t *testing.T) {
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
us, err := c.Users.ListDetails()
|
us, err := c.Users().ListDetails()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Contains(t, us, config.Login)
|
assert.Contains(t, us, config.Login)
|
||||||
}
|
}
|
||||||
@ -503,7 +503,7 @@ func TestGroupListDetails(t *testing.T) {
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
gs, err := c.Groups.ListDetails()
|
gs, err := c.Groups().ListDetails()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotEmpty(t, gs)
|
assert.NotEmpty(t, gs)
|
||||||
}
|
}
|
||||||
|
@ -8,18 +8,6 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
//GroupFoldersI available methods
|
|
||||||
type GroupFoldersI interface {
|
|
||||||
List() (map[int]types.GroupFolder, error)
|
|
||||||
Get(id int) (types.GroupFolder, error)
|
|
||||||
Create(name string) (id int, err error)
|
|
||||||
Rename(groupID int, name string) error
|
|
||||||
AddGroup(folderID int, groupName string) error
|
|
||||||
RemoveGroup(folderID int, groupName string) error
|
|
||||||
SetGroupPermissions(folderID int, groupName string, permission types.SharePermission) error
|
|
||||||
SetQuota(folderID int, quota int) error
|
|
||||||
}
|
|
||||||
|
|
||||||
//GroupFolders contains all Groups Folders available actions
|
//GroupFolders contains all Groups Folders available actions
|
||||||
type GroupFolders struct {
|
type GroupFolders struct {
|
||||||
c *Client
|
c *Client
|
||||||
|
@ -16,14 +16,14 @@ var (
|
|||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
// Recreate client
|
// Recreate client
|
||||||
var err error
|
var err error
|
||||||
groupID, err = c.GroupFolders.Create("API")
|
groupID, err = c.GroupFolders().Create("API")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"TestGroupFoldersList",
|
"TestGroupFoldersList",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
gfs, err := c.GroupFolders.List()
|
gfs, err := c.GroupFolders().List()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, gfs[groupID])
|
assert.NotNil(t, gfs[groupID])
|
||||||
},
|
},
|
||||||
@ -31,7 +31,7 @@ var (
|
|||||||
{
|
{
|
||||||
"TestGroupFolders",
|
"TestGroupFolders",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
gf, err := c.GroupFolders.Get(groupID)
|
gf, err := c.GroupFolders().Get(groupID)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, gf)
|
assert.NotNil(t, gf)
|
||||||
},
|
},
|
||||||
@ -39,35 +39,35 @@ var (
|
|||||||
{
|
{
|
||||||
"TestGroupFolderRename",
|
"TestGroupFolderRename",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.GroupFolders.Rename(groupID, "API_Renamed")
|
err := c.GroupFolders().Rename(groupID, "API_Renamed")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"TestGroupFoldersAddGroup",
|
"TestGroupFoldersAddGroup",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.GroupFolders.AddGroup(groupID, "admin")
|
err := c.GroupFolders().AddGroup(groupID, "admin")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"TestGroupFoldersSetGroupPermissions",
|
"TestGroupFoldersSetGroupPermissions",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.GroupFolders.SetGroupPermissions(groupID, "admin", types.ReadPermission)
|
err := c.GroupFolders().SetGroupPermissions(groupID, "admin", types.ReadPermission)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"TestGroupFoldersSetQuota",
|
"TestGroupFoldersSetQuota",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.GroupFolders.SetQuota(groupID, 100)
|
err := c.GroupFolders().SetQuota(groupID, 100)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"TestGroupFolderRemoveGroup",
|
"TestGroupFolderRemoveGroup",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.GroupFolders.RemoveGroup(groupID, "admin")
|
err := c.GroupFolders().RemoveGroup(groupID, "admin")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
11
groups.go
11
groups.go
@ -6,17 +6,6 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
//GroupsI available methods
|
|
||||||
type GroupsI interface {
|
|
||||||
List() ([]string, error)
|
|
||||||
ListDetails() ([]types.Group, error)
|
|
||||||
Users(name string) ([]string, error)
|
|
||||||
Search(search string) ([]string, error)
|
|
||||||
Create(name string) error
|
|
||||||
Delete(name string) error
|
|
||||||
SubAdminList(name string) ([]string, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
//Groups contains all Groups available actions
|
//Groups contains all Groups available actions
|
||||||
type Groups struct {
|
type Groups struct {
|
||||||
c *Client
|
c *Client
|
||||||
|
@ -8,17 +8,6 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
//NotificationsI available methods
|
|
||||||
type NotificationsI interface {
|
|
||||||
List() ([]types.Notification, error)
|
|
||||||
Get(id int) (types.Notification, error)
|
|
||||||
Delete(id int) error
|
|
||||||
DeleteAll() error
|
|
||||||
Create(userID, title, message string) error
|
|
||||||
AdminAvailable() error
|
|
||||||
Available() error
|
|
||||||
}
|
|
||||||
|
|
||||||
//Notifications contains all Notifications available actions
|
//Notifications contains all Notifications available actions
|
||||||
type Notifications struct {
|
type Notifications struct {
|
||||||
c *Client
|
c *Client
|
||||||
|
@ -17,14 +17,14 @@ var (
|
|||||||
{
|
{
|
||||||
"notificationCreate",
|
"notificationCreate",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
err := c.Notifications.Create(config.Login, title, message)
|
err := c.Notifications().Create(config.Login, title, message)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
"notificationDelete",
|
"notificationDelete",
|
||||||
func(t *testing.T) {
|
func(t *testing.T) {
|
||||||
// Get created Notification ID
|
// Get created Notification ID
|
||||||
ns, err := c.Notifications.List()
|
ns, err := c.Notifications().List()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.SkipNow()
|
t.SkipNow()
|
||||||
}
|
}
|
||||||
@ -37,7 +37,7 @@ var (
|
|||||||
if createdID == 0 {
|
if createdID == 0 {
|
||||||
t.SkipNow()
|
t.SkipNow()
|
||||||
}
|
}
|
||||||
err = c.Notifications.Delete(createdID)
|
err = c.Notifications().Delete(createdID)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -49,10 +49,10 @@ func TestNotificationsList(t *testing.T) {
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := c.Notifications.Available(); err != nil {
|
if err := c.Notifications().Available(); err != nil {
|
||||||
t.SkipNow()
|
t.SkipNow()
|
||||||
}
|
}
|
||||||
ns, err := c.Notifications.List()
|
ns, err := c.Notifications().List()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if len(ns) > 0 {
|
if len(ns) > 0 {
|
||||||
notificationID = ns[0].NotificationID
|
notificationID = ns[0].NotificationID
|
||||||
@ -67,10 +67,10 @@ func TestNotifications(t *testing.T) {
|
|||||||
if err := initClient(); err != nil {
|
if err := initClient(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := c.Notifications.Available(); err != nil {
|
if err := c.Notifications().Available(); err != nil {
|
||||||
t.SkipNow()
|
t.SkipNow()
|
||||||
}
|
}
|
||||||
n, err := c.Notifications.Get(notificationID)
|
n, err := c.Notifications().Get(notificationID)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotEmpty(t, n)
|
assert.NotEmpty(t, n)
|
||||||
}
|
}
|
||||||
|
21
shares.go
21
shares.go
@ -9,27 +9,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
//SharesI available methods
|
|
||||||
type SharesI interface {
|
|
||||||
List() ([]types.Share, error)
|
|
||||||
GetFromPath(path string, reshares bool, subfiles bool) ([]types.Share, error)
|
|
||||||
Get(shareID string) (types.Share, error)
|
|
||||||
Create(
|
|
||||||
path string,
|
|
||||||
shareType types.ShareType,
|
|
||||||
permission types.SharePermission,
|
|
||||||
shareWith string,
|
|
||||||
publicUpload bool,
|
|
||||||
password string,
|
|
||||||
) (types.Share, error)
|
|
||||||
Delete(shareID int) error
|
|
||||||
Update(shareUpdate types.ShareUpdate) error
|
|
||||||
UpdateExpireDate(shareID int, expireDate string) error
|
|
||||||
UpdatePublicUpload(shareID int, public bool) error
|
|
||||||
UpdatePassword(shareID int, password string) error
|
|
||||||
UpdatePermissions(shareID int, permissions types.SharePermission) error
|
|
||||||
}
|
|
||||||
|
|
||||||
//Shares contains all Shares available actions
|
//Shares contains all Shares available actions
|
||||||
type Shares struct {
|
type Shares struct {
|
||||||
c *Client
|
c *Client
|
||||||
|
122
types/interfaces.go
Normal file
122
types/interfaces.go
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
//Client is the main client interface
|
||||||
|
type Client interface {
|
||||||
|
Apps() Apps
|
||||||
|
AppsConfig() AppsConfig
|
||||||
|
GroupFolders() GroupFolders
|
||||||
|
Notifications() Notifications
|
||||||
|
Shares() Shares
|
||||||
|
Users() Users
|
||||||
|
Groups() Groups
|
||||||
|
}
|
||||||
|
|
||||||
|
type Auth interface {
|
||||||
|
Login(username string, password string) error
|
||||||
|
Logout() error
|
||||||
|
}
|
||||||
|
|
||||||
|
//Apps available methods
|
||||||
|
type Apps interface {
|
||||||
|
List() ([]string, error)
|
||||||
|
ListEnabled() ([]string, error)
|
||||||
|
ListDisabled() ([]string, error)
|
||||||
|
Infos(name string) (App, error)
|
||||||
|
Enable(name string) error
|
||||||
|
Disable(name string) error
|
||||||
|
}
|
||||||
|
|
||||||
|
//AppsConfig available methods
|
||||||
|
type AppsConfig interface {
|
||||||
|
List() (apps []string, err error)
|
||||||
|
Keys(id string) (keys []string, err error)
|
||||||
|
Value(id, key string) (string, error)
|
||||||
|
SetValue(id, key, value string) error
|
||||||
|
DeleteValue(id, key, value string) error
|
||||||
|
Get() (map[string]map[string]string, error)
|
||||||
|
Details(appID string) (map[string]string, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
//Groups available methods
|
||||||
|
type Groups interface {
|
||||||
|
List() ([]string, error)
|
||||||
|
ListDetails() ([]Group, error)
|
||||||
|
Users(name string) ([]string, error)
|
||||||
|
Search(search string) ([]string, error)
|
||||||
|
Create(name string) error
|
||||||
|
Delete(name string) error
|
||||||
|
SubAdminList(name string) ([]string, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
//GroupFolders available methods
|
||||||
|
type GroupFolders interface {
|
||||||
|
List() (map[int]GroupFolder, error)
|
||||||
|
Get(id int) (GroupFolder, error)
|
||||||
|
Create(name string) (id int, err error)
|
||||||
|
Rename(groupID int, name string) error
|
||||||
|
AddGroup(folderID int, groupName string) error
|
||||||
|
RemoveGroup(folderID int, groupName string) error
|
||||||
|
SetGroupPermissions(folderID int, groupName string, permission SharePermission) error
|
||||||
|
SetQuota(folderID int, quota int) error
|
||||||
|
}
|
||||||
|
|
||||||
|
//Notifications available methods
|
||||||
|
type Notifications interface {
|
||||||
|
List() ([]Notification, error)
|
||||||
|
Get(id int) (Notification, error)
|
||||||
|
Delete(id int) error
|
||||||
|
DeleteAll() error
|
||||||
|
Create(userID, title, message string) error
|
||||||
|
AdminAvailable() error
|
||||||
|
Available() error
|
||||||
|
}
|
||||||
|
|
||||||
|
//Shares available methods
|
||||||
|
type Shares interface {
|
||||||
|
List() ([]Share, error)
|
||||||
|
GetFromPath(path string, reshares bool, subfiles bool) ([]Share, error)
|
||||||
|
Get(shareID string) (Share, error)
|
||||||
|
Create(
|
||||||
|
path string,
|
||||||
|
shareType ShareType,
|
||||||
|
permission SharePermission,
|
||||||
|
shareWith string,
|
||||||
|
publicUpload bool,
|
||||||
|
password string,
|
||||||
|
) (Share, error)
|
||||||
|
Delete(shareID int) error
|
||||||
|
Update(shareUpdate ShareUpdate) error
|
||||||
|
UpdateExpireDate(shareID int, expireDate string) error
|
||||||
|
UpdatePublicUpload(shareID int, public bool) error
|
||||||
|
UpdatePassword(shareID int, password string) error
|
||||||
|
UpdatePermissions(shareID int, permissions SharePermission) error
|
||||||
|
}
|
||||||
|
|
||||||
|
//Users available methods
|
||||||
|
type Users interface {
|
||||||
|
List() ([]string, error)
|
||||||
|
ListDetails() (map[string]User, error)
|
||||||
|
Get(name string) (*User, error)
|
||||||
|
Search(search string) ([]string, error)
|
||||||
|
Create(username string, password string, user *User) error
|
||||||
|
CreateWithoutPassword(username, email, displayName, quota, language string, groups ...string) error
|
||||||
|
Delete(name string) error
|
||||||
|
Enable(name string) error
|
||||||
|
Disable(name string) error
|
||||||
|
SendWelcomeEmail(name string) error
|
||||||
|
Update(user *User) error
|
||||||
|
UpdateEmail(name string, email string) error
|
||||||
|
UpdateDisplayName(name string, displayName string) error
|
||||||
|
UpdatePhone(name string, phone string) error
|
||||||
|
UpdateAddress(name string, address string) error
|
||||||
|
UpdateWebSite(name string, website string) error
|
||||||
|
UpdateTwitter(name string, twitter string) error
|
||||||
|
UpdatePassword(name string, password string) error
|
||||||
|
UpdateQuota(name string, quota int) error
|
||||||
|
GroupList(name string) ([]string, error)
|
||||||
|
GroupAdd(name string, group string) error
|
||||||
|
GroupRemove(name string, group string) error
|
||||||
|
GroupPromote(name string, group string) error
|
||||||
|
GroupDemote(name string, group string) error
|
||||||
|
GroupSubAdminList(name string) ([]string, error)
|
||||||
|
}
|
57
users.go
57
users.go
@ -7,41 +7,13 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
|
"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
//UsersI available methods
|
|
||||||
type UsersI interface {
|
|
||||||
List() ([]string, error)
|
|
||||||
ListDetails() (map[string]types.User, error)
|
|
||||||
Get(name string) (*types.User, error)
|
|
||||||
Search(search string) ([]string, error)
|
|
||||||
Create(username string, password string, user *types.User) error
|
|
||||||
CreateWithoutPassword(username, email, displayName string) error
|
|
||||||
Delete(name string) error
|
|
||||||
Enable(name string) error
|
|
||||||
Disable(name string) error
|
|
||||||
SendWelcomeEmail(name string) error
|
|
||||||
Update(user *types.User) error
|
|
||||||
UpdateEmail(name string, email string) error
|
|
||||||
UpdateDisplayName(name string, displayName string) error
|
|
||||||
UpdatePhone(name string, phone string) error
|
|
||||||
UpdateAddress(name string, address string) error
|
|
||||||
UpdateWebSite(name string, website string) error
|
|
||||||
UpdateTwitter(name string, twitter string) error
|
|
||||||
UpdatePassword(name string, password string) error
|
|
||||||
UpdateQuota(name string, quota int) error
|
|
||||||
GroupList(name string) ([]string, error)
|
|
||||||
GroupAdd(name string, group string) error
|
|
||||||
GroupRemove(name string, group string) error
|
|
||||||
GroupPromote(name string, group string) error
|
|
||||||
GroupDemote(name string, group string) error
|
|
||||||
GroupSubAdminList(name string) ([]string, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
//Users contains all Users available actions
|
//Users contains all Users available actions
|
||||||
type Users struct {
|
type Users struct {
|
||||||
c *Client
|
c *Client
|
||||||
@ -126,21 +98,34 @@ func (u *Users) Create(username string, password string, user *types.User) error
|
|||||||
|
|
||||||
// CreateWithoutPassword create a user without provisioning a password, the email address must be provided to send
|
// CreateWithoutPassword create a user without provisioning a password, the email address must be provided to send
|
||||||
// an init password email
|
// an init password email
|
||||||
func (u *Users) CreateWithoutPassword(username, email, displayName string) error {
|
func (u *Users) CreateWithoutPassword(username, email, displayName, quota, language string, groups ...string) error {
|
||||||
if u.c.version.Major < 14 {
|
if u.c.version.Major < 14 {
|
||||||
return errors.New("unsupported method: requires Nextcloud 14+")
|
return errors.New("unsupported method: requires Nextcloud 14+")
|
||||||
}
|
}
|
||||||
if username == "" || email == "" {
|
if username == "" || email == "" {
|
||||||
return errors.New("username and email cannot be empty")
|
return errors.New("username and email cannot be empty")
|
||||||
}
|
}
|
||||||
ro := &req.RequestOptions{
|
|
||||||
Data: map[string]string{
|
data := map[string]string{
|
||||||
"userid": username,
|
"userid": username,
|
||||||
"email": email,
|
"email": email,
|
||||||
"displayName": displayName,
|
"displayName": displayName,
|
||||||
},
|
"quota": quota,
|
||||||
|
"language": language,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ro := &req.RequestOptions{}
|
||||||
|
f := url.Values{}
|
||||||
|
for k, v := range data {
|
||||||
|
if v != "" {
|
||||||
|
f.Add(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, g := range groups {
|
||||||
|
f.Add("groups[]", g)
|
||||||
|
}
|
||||||
|
ro.RequestBody = strings.NewReader(f.Encode())
|
||||||
|
ro.Headers = map[string]string{"Content-Type": "application/x-www-form-urlencoded"}
|
||||||
if err := u.baseRequest(http.MethodPost, ro); err != nil {
|
if err := u.baseRequest(http.MethodPost, ro); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
22
vendor/github.com/Microsoft/go-winio/LICENSE
generated
vendored
22
vendor/github.com/Microsoft/go-winio/LICENSE
generated
vendored
@ -1,22 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2015 Microsoft
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
22
vendor/github.com/Microsoft/go-winio/README.md
generated
vendored
22
vendor/github.com/Microsoft/go-winio/README.md
generated
vendored
@ -1,22 +0,0 @@
|
|||||||
# go-winio
|
|
||||||
|
|
||||||
This repository contains utilities for efficiently performing Win32 IO operations in
|
|
||||||
Go. Currently, this is focused on accessing named pipes and other file handles, and
|
|
||||||
for using named pipes as a net transport.
|
|
||||||
|
|
||||||
This code relies on IO completion ports to avoid blocking IO on system threads, allowing Go
|
|
||||||
to reuse the thread to schedule another goroutine. This limits support to Windows Vista and
|
|
||||||
newer operating systems. This is similar to the implementation of network sockets in Go's net
|
|
||||||
package.
|
|
||||||
|
|
||||||
Please see the LICENSE file for licensing information.
|
|
||||||
|
|
||||||
This project has adopted the [Microsoft Open Source Code of
|
|
||||||
Conduct](https://opensource.microsoft.com/codeofconduct/). For more information
|
|
||||||
see the [Code of Conduct
|
|
||||||
FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact
|
|
||||||
[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional
|
|
||||||
questions or comments.
|
|
||||||
|
|
||||||
Thanks to natefinch for the inspiration for this library. See https://github.com/natefinch/npipe
|
|
||||||
for another named pipe implementation.
|
|
280
vendor/github.com/Microsoft/go-winio/backup.go
generated
vendored
280
vendor/github.com/Microsoft/go-winio/backup.go
generated
vendored
@ -1,280 +0,0 @@
|
|||||||
// +build windows
|
|
||||||
|
|
||||||
package winio
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/binary"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"runtime"
|
|
||||||
"syscall"
|
|
||||||
"unicode/utf16"
|
|
||||||
)
|
|
||||||
|
|
||||||
//sys backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupRead
|
|
||||||
//sys backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupWrite
|
|
||||||
|
|
||||||
const (
|
|
||||||
BackupData = uint32(iota + 1)
|
|
||||||
BackupEaData
|
|
||||||
BackupSecurity
|
|
||||||
BackupAlternateData
|
|
||||||
BackupLink
|
|
||||||
BackupPropertyData
|
|
||||||
BackupObjectId
|
|
||||||
BackupReparseData
|
|
||||||
BackupSparseBlock
|
|
||||||
BackupTxfsData
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
StreamSparseAttributes = uint32(8)
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
WRITE_DAC = 0x40000
|
|
||||||
WRITE_OWNER = 0x80000
|
|
||||||
ACCESS_SYSTEM_SECURITY = 0x1000000
|
|
||||||
)
|
|
||||||
|
|
||||||
// BackupHeader represents a backup stream of a file.
|
|
||||||
type BackupHeader struct {
|
|
||||||
Id uint32 // The backup stream ID
|
|
||||||
Attributes uint32 // Stream attributes
|
|
||||||
Size int64 // The size of the stream in bytes
|
|
||||||
Name string // The name of the stream (for BackupAlternateData only).
|
|
||||||
Offset int64 // The offset of the stream in the file (for BackupSparseBlock only).
|
|
||||||
}
|
|
||||||
|
|
||||||
type win32StreamId struct {
|
|
||||||
StreamId uint32
|
|
||||||
Attributes uint32
|
|
||||||
Size uint64
|
|
||||||
NameSize uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// BackupStreamReader reads from a stream produced by the BackupRead Win32 API and produces a series
|
|
||||||
// of BackupHeader values.
|
|
||||||
type BackupStreamReader struct {
|
|
||||||
r io.Reader
|
|
||||||
bytesLeft int64
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewBackupStreamReader produces a BackupStreamReader from any io.Reader.
|
|
||||||
func NewBackupStreamReader(r io.Reader) *BackupStreamReader {
|
|
||||||
return &BackupStreamReader{r, 0}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if
|
|
||||||
// it was not completely read.
|
|
||||||
func (r *BackupStreamReader) Next() (*BackupHeader, error) {
|
|
||||||
if r.bytesLeft > 0 {
|
|
||||||
if s, ok := r.r.(io.Seeker); ok {
|
|
||||||
// Make sure Seek on io.SeekCurrent sometimes succeeds
|
|
||||||
// before trying the actual seek.
|
|
||||||
if _, err := s.Seek(0, io.SeekCurrent); err == nil {
|
|
||||||
if _, err = s.Seek(r.bytesLeft, io.SeekCurrent); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
r.bytesLeft = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _, err := io.Copy(ioutil.Discard, r); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var wsi win32StreamId
|
|
||||||
if err := binary.Read(r.r, binary.LittleEndian, &wsi); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
hdr := &BackupHeader{
|
|
||||||
Id: wsi.StreamId,
|
|
||||||
Attributes: wsi.Attributes,
|
|
||||||
Size: int64(wsi.Size),
|
|
||||||
}
|
|
||||||
if wsi.NameSize != 0 {
|
|
||||||
name := make([]uint16, int(wsi.NameSize/2))
|
|
||||||
if err := binary.Read(r.r, binary.LittleEndian, name); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
hdr.Name = syscall.UTF16ToString(name)
|
|
||||||
}
|
|
||||||
if wsi.StreamId == BackupSparseBlock {
|
|
||||||
if err := binary.Read(r.r, binary.LittleEndian, &hdr.Offset); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
hdr.Size -= 8
|
|
||||||
}
|
|
||||||
r.bytesLeft = hdr.Size
|
|
||||||
return hdr, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read reads from the current backup stream.
|
|
||||||
func (r *BackupStreamReader) Read(b []byte) (int, error) {
|
|
||||||
if r.bytesLeft == 0 {
|
|
||||||
return 0, io.EOF
|
|
||||||
}
|
|
||||||
if int64(len(b)) > r.bytesLeft {
|
|
||||||
b = b[:r.bytesLeft]
|
|
||||||
}
|
|
||||||
n, err := r.r.Read(b)
|
|
||||||
r.bytesLeft -= int64(n)
|
|
||||||
if err == io.EOF {
|
|
||||||
err = io.ErrUnexpectedEOF
|
|
||||||
} else if r.bytesLeft == 0 && err == nil {
|
|
||||||
err = io.EOF
|
|
||||||
}
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// BackupStreamWriter writes a stream compatible with the BackupWrite Win32 API.
|
|
||||||
type BackupStreamWriter struct {
|
|
||||||
w io.Writer
|
|
||||||
bytesLeft int64
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewBackupStreamWriter produces a BackupStreamWriter on top of an io.Writer.
|
|
||||||
func NewBackupStreamWriter(w io.Writer) *BackupStreamWriter {
|
|
||||||
return &BackupStreamWriter{w, 0}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WriteHeader writes the next backup stream header and prepares for calls to Write().
|
|
||||||
func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error {
|
|
||||||
if w.bytesLeft != 0 {
|
|
||||||
return fmt.Errorf("missing %d bytes", w.bytesLeft)
|
|
||||||
}
|
|
||||||
name := utf16.Encode([]rune(hdr.Name))
|
|
||||||
wsi := win32StreamId{
|
|
||||||
StreamId: hdr.Id,
|
|
||||||
Attributes: hdr.Attributes,
|
|
||||||
Size: uint64(hdr.Size),
|
|
||||||
NameSize: uint32(len(name) * 2),
|
|
||||||
}
|
|
||||||
if hdr.Id == BackupSparseBlock {
|
|
||||||
// Include space for the int64 block offset
|
|
||||||
wsi.Size += 8
|
|
||||||
}
|
|
||||||
if err := binary.Write(w.w, binary.LittleEndian, &wsi); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(name) != 0 {
|
|
||||||
if err := binary.Write(w.w, binary.LittleEndian, name); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if hdr.Id == BackupSparseBlock {
|
|
||||||
if err := binary.Write(w.w, binary.LittleEndian, hdr.Offset); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
w.bytesLeft = hdr.Size
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write writes to the current backup stream.
|
|
||||||
func (w *BackupStreamWriter) Write(b []byte) (int, error) {
|
|
||||||
if w.bytesLeft < int64(len(b)) {
|
|
||||||
return 0, fmt.Errorf("too many bytes by %d", int64(len(b))-w.bytesLeft)
|
|
||||||
}
|
|
||||||
n, err := w.w.Write(b)
|
|
||||||
w.bytesLeft -= int64(n)
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// BackupFileReader provides an io.ReadCloser interface on top of the BackupRead Win32 API.
|
|
||||||
type BackupFileReader struct {
|
|
||||||
f *os.File
|
|
||||||
includeSecurity bool
|
|
||||||
ctx uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewBackupFileReader returns a new BackupFileReader from a file handle. If includeSecurity is true,
|
|
||||||
// Read will attempt to read the security descriptor of the file.
|
|
||||||
func NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileReader {
|
|
||||||
r := &BackupFileReader{f, includeSecurity, 0}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read reads a backup stream from the file by calling the Win32 API BackupRead().
|
|
||||||
func (r *BackupFileReader) Read(b []byte) (int, error) {
|
|
||||||
var bytesRead uint32
|
|
||||||
err := backupRead(syscall.Handle(r.f.Fd()), b, &bytesRead, false, r.includeSecurity, &r.ctx)
|
|
||||||
if err != nil {
|
|
||||||
return 0, &os.PathError{"BackupRead", r.f.Name(), err}
|
|
||||||
}
|
|
||||||
runtime.KeepAlive(r.f)
|
|
||||||
if bytesRead == 0 {
|
|
||||||
return 0, io.EOF
|
|
||||||
}
|
|
||||||
return int(bytesRead), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close frees Win32 resources associated with the BackupFileReader. It does not close
|
|
||||||
// the underlying file.
|
|
||||||
func (r *BackupFileReader) Close() error {
|
|
||||||
if r.ctx != 0 {
|
|
||||||
backupRead(syscall.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx)
|
|
||||||
runtime.KeepAlive(r.f)
|
|
||||||
r.ctx = 0
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// BackupFileWriter provides an io.WriteCloser interface on top of the BackupWrite Win32 API.
|
|
||||||
type BackupFileWriter struct {
|
|
||||||
f *os.File
|
|
||||||
includeSecurity bool
|
|
||||||
ctx uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewBackupFileWriter returns a new BackupFileWriter from a file handle. If includeSecurity is true,
|
|
||||||
// Write() will attempt to restore the security descriptor from the stream.
|
|
||||||
func NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWriter {
|
|
||||||
w := &BackupFileWriter{f, includeSecurity, 0}
|
|
||||||
return w
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write restores a portion of the file using the provided backup stream.
|
|
||||||
func (w *BackupFileWriter) Write(b []byte) (int, error) {
|
|
||||||
var bytesWritten uint32
|
|
||||||
err := backupWrite(syscall.Handle(w.f.Fd()), b, &bytesWritten, false, w.includeSecurity, &w.ctx)
|
|
||||||
if err != nil {
|
|
||||||
return 0, &os.PathError{"BackupWrite", w.f.Name(), err}
|
|
||||||
}
|
|
||||||
runtime.KeepAlive(w.f)
|
|
||||||
if int(bytesWritten) != len(b) {
|
|
||||||
return int(bytesWritten), errors.New("not all bytes could be written")
|
|
||||||
}
|
|
||||||
return len(b), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close frees Win32 resources associated with the BackupFileWriter. It does not
|
|
||||||
// close the underlying file.
|
|
||||||
func (w *BackupFileWriter) Close() error {
|
|
||||||
if w.ctx != 0 {
|
|
||||||
backupWrite(syscall.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx)
|
|
||||||
runtime.KeepAlive(w.f)
|
|
||||||
w.ctx = 0
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// OpenForBackup opens a file or directory, potentially skipping access checks if the backup
|
|
||||||
// or restore privileges have been acquired.
|
|
||||||
//
|
|
||||||
// If the file opened was a directory, it cannot be used with Readdir().
|
|
||||||
func OpenForBackup(path string, access uint32, share uint32, createmode uint32) (*os.File, error) {
|
|
||||||
winPath, err := syscall.UTF16FromString(path)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
h, err := syscall.CreateFile(&winPath[0], access, share, nil, createmode, syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT, 0)
|
|
||||||
if err != nil {
|
|
||||||
err = &os.PathError{Op: "open", Path: path, Err: err}
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return os.NewFile(uintptr(h), path), nil
|
|
||||||
}
|
|
137
vendor/github.com/Microsoft/go-winio/ea.go
generated
vendored
137
vendor/github.com/Microsoft/go-winio/ea.go
generated
vendored
@ -1,137 +0,0 @@
|
|||||||
package winio
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/binary"
|
|
||||||
"errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
type fileFullEaInformation struct {
|
|
||||||
NextEntryOffset uint32
|
|
||||||
Flags uint8
|
|
||||||
NameLength uint8
|
|
||||||
ValueLength uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
fileFullEaInformationSize = binary.Size(&fileFullEaInformation{})
|
|
||||||
|
|
||||||
errInvalidEaBuffer = errors.New("invalid extended attribute buffer")
|
|
||||||
errEaNameTooLarge = errors.New("extended attribute name too large")
|
|
||||||
errEaValueTooLarge = errors.New("extended attribute value too large")
|
|
||||||
)
|
|
||||||
|
|
||||||
// ExtendedAttribute represents a single Windows EA.
|
|
||||||
type ExtendedAttribute struct {
|
|
||||||
Name string
|
|
||||||
Value []byte
|
|
||||||
Flags uint8
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) {
|
|
||||||
var info fileFullEaInformation
|
|
||||||
err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &info)
|
|
||||||
if err != nil {
|
|
||||||
err = errInvalidEaBuffer
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
nameOffset := fileFullEaInformationSize
|
|
||||||
nameLen := int(info.NameLength)
|
|
||||||
valueOffset := nameOffset + int(info.NameLength) + 1
|
|
||||||
valueLen := int(info.ValueLength)
|
|
||||||
nextOffset := int(info.NextEntryOffset)
|
|
||||||
if valueLen+valueOffset > len(b) || nextOffset < 0 || nextOffset > len(b) {
|
|
||||||
err = errInvalidEaBuffer
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
ea.Name = string(b[nameOffset : nameOffset+nameLen])
|
|
||||||
ea.Value = b[valueOffset : valueOffset+valueLen]
|
|
||||||
ea.Flags = info.Flags
|
|
||||||
if info.NextEntryOffset != 0 {
|
|
||||||
nb = b[info.NextEntryOffset:]
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION
|
|
||||||
// buffer retrieved from BackupRead, ZwQueryEaFile, etc.
|
|
||||||
func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error) {
|
|
||||||
for len(b) != 0 {
|
|
||||||
ea, nb, err := parseEa(b)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
eas = append(eas, ea)
|
|
||||||
b = nb
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error {
|
|
||||||
if int(uint8(len(ea.Name))) != len(ea.Name) {
|
|
||||||
return errEaNameTooLarge
|
|
||||||
}
|
|
||||||
if int(uint16(len(ea.Value))) != len(ea.Value) {
|
|
||||||
return errEaValueTooLarge
|
|
||||||
}
|
|
||||||
entrySize := uint32(fileFullEaInformationSize + len(ea.Name) + 1 + len(ea.Value))
|
|
||||||
withPadding := (entrySize + 3) &^ 3
|
|
||||||
nextOffset := uint32(0)
|
|
||||||
if !last {
|
|
||||||
nextOffset = withPadding
|
|
||||||
}
|
|
||||||
info := fileFullEaInformation{
|
|
||||||
NextEntryOffset: nextOffset,
|
|
||||||
Flags: ea.Flags,
|
|
||||||
NameLength: uint8(len(ea.Name)),
|
|
||||||
ValueLength: uint16(len(ea.Value)),
|
|
||||||
}
|
|
||||||
|
|
||||||
err := binary.Write(buf, binary.LittleEndian, &info)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = buf.Write([]byte(ea.Name))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = buf.WriteByte(0)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = buf.Write(ea.Value)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = buf.Write([]byte{0, 0, 0}[0 : withPadding-entrySize])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EncodeExtendedAttributes encodes a list of EAs into a FILE_FULL_EA_INFORMATION
|
|
||||||
// buffer for use with BackupWrite, ZwSetEaFile, etc.
|
|
||||||
func EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error) {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
for i := range eas {
|
|
||||||
last := false
|
|
||||||
if i == len(eas)-1 {
|
|
||||||
last = true
|
|
||||||
}
|
|
||||||
|
|
||||||
err := writeEa(&buf, &eas[i], last)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return buf.Bytes(), nil
|
|
||||||
}
|
|
310
vendor/github.com/Microsoft/go-winio/file.go
generated
vendored
310
vendor/github.com/Microsoft/go-winio/file.go
generated
vendored
@ -1,310 +0,0 @@
|
|||||||
// +build windows
|
|
||||||
|
|
||||||
package winio
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"io"
|
|
||||||
"runtime"
|
|
||||||
"sync"
|
|
||||||
"sync/atomic"
|
|
||||||
"syscall"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
//sys cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) = CancelIoEx
|
|
||||||
//sys createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) = CreateIoCompletionPort
|
|
||||||
//sys getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) = GetQueuedCompletionStatus
|
|
||||||
//sys setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) = SetFileCompletionNotificationModes
|
|
||||||
//sys timeBeginPeriod(period uint32) (n int32) = winmm.timeBeginPeriod
|
|
||||||
|
|
||||||
type atomicBool int32
|
|
||||||
|
|
||||||
func (b *atomicBool) isSet() bool { return atomic.LoadInt32((*int32)(b)) != 0 }
|
|
||||||
func (b *atomicBool) setFalse() { atomic.StoreInt32((*int32)(b), 0) }
|
|
||||||
func (b *atomicBool) setTrue() { atomic.StoreInt32((*int32)(b), 1) }
|
|
||||||
func (b *atomicBool) swap(new bool) bool {
|
|
||||||
var newInt int32
|
|
||||||
if new {
|
|
||||||
newInt = 1
|
|
||||||
}
|
|
||||||
return atomic.SwapInt32((*int32)(b), newInt) == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
|
|
||||||
cFILE_SKIP_SET_EVENT_ON_HANDLE = 2
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrFileClosed = errors.New("file has already been closed")
|
|
||||||
ErrTimeout = &timeoutError{}
|
|
||||||
)
|
|
||||||
|
|
||||||
type timeoutError struct{}
|
|
||||||
|
|
||||||
func (e *timeoutError) Error() string { return "i/o timeout" }
|
|
||||||
func (e *timeoutError) Timeout() bool { return true }
|
|
||||||
func (e *timeoutError) Temporary() bool { return true }
|
|
||||||
|
|
||||||
type timeoutChan chan struct{}
|
|
||||||
|
|
||||||
var ioInitOnce sync.Once
|
|
||||||
var ioCompletionPort syscall.Handle
|
|
||||||
|
|
||||||
// ioResult contains the result of an asynchronous IO operation
|
|
||||||
type ioResult struct {
|
|
||||||
bytes uint32
|
|
||||||
err error
|
|
||||||
}
|
|
||||||
|
|
||||||
// ioOperation represents an outstanding asynchronous Win32 IO
|
|
||||||
type ioOperation struct {
|
|
||||||
o syscall.Overlapped
|
|
||||||
ch chan ioResult
|
|
||||||
}
|
|
||||||
|
|
||||||
func initIo() {
|
|
||||||
h, err := createIoCompletionPort(syscall.InvalidHandle, 0, 0, 0xffffffff)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
ioCompletionPort = h
|
|
||||||
go ioCompletionProcessor(h)
|
|
||||||
}
|
|
||||||
|
|
||||||
// win32File implements Reader, Writer, and Closer on a Win32 handle without blocking in a syscall.
|
|
||||||
// It takes ownership of this handle and will close it if it is garbage collected.
|
|
||||||
type win32File struct {
|
|
||||||
handle syscall.Handle
|
|
||||||
wg sync.WaitGroup
|
|
||||||
wgLock sync.RWMutex
|
|
||||||
closing atomicBool
|
|
||||||
readDeadline deadlineHandler
|
|
||||||
writeDeadline deadlineHandler
|
|
||||||
}
|
|
||||||
|
|
||||||
type deadlineHandler struct {
|
|
||||||
setLock sync.Mutex
|
|
||||||
channel timeoutChan
|
|
||||||
channelLock sync.RWMutex
|
|
||||||
timer *time.Timer
|
|
||||||
timedout atomicBool
|
|
||||||
}
|
|
||||||
|
|
||||||
// makeWin32File makes a new win32File from an existing file handle
|
|
||||||
func makeWin32File(h syscall.Handle) (*win32File, error) {
|
|
||||||
f := &win32File{handle: h}
|
|
||||||
ioInitOnce.Do(initIo)
|
|
||||||
_, err := createIoCompletionPort(h, ioCompletionPort, 0, 0xffffffff)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
err = setFileCompletionNotificationModes(h, cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS|cFILE_SKIP_SET_EVENT_ON_HANDLE)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
f.readDeadline.channel = make(timeoutChan)
|
|
||||||
f.writeDeadline.channel = make(timeoutChan)
|
|
||||||
return f, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) {
|
|
||||||
return makeWin32File(h)
|
|
||||||
}
|
|
||||||
|
|
||||||
// closeHandle closes the resources associated with a Win32 handle
|
|
||||||
func (f *win32File) closeHandle() {
|
|
||||||
f.wgLock.Lock()
|
|
||||||
// Atomically set that we are closing, releasing the resources only once.
|
|
||||||
if !f.closing.swap(true) {
|
|
||||||
f.wgLock.Unlock()
|
|
||||||
// cancel all IO and wait for it to complete
|
|
||||||
cancelIoEx(f.handle, nil)
|
|
||||||
f.wg.Wait()
|
|
||||||
// at this point, no new IO can start
|
|
||||||
syscall.Close(f.handle)
|
|
||||||
f.handle = 0
|
|
||||||
} else {
|
|
||||||
f.wgLock.Unlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close closes a win32File.
|
|
||||||
func (f *win32File) Close() error {
|
|
||||||
f.closeHandle()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// prepareIo prepares for a new IO operation.
|
|
||||||
// The caller must call f.wg.Done() when the IO is finished, prior to Close() returning.
|
|
||||||
func (f *win32File) prepareIo() (*ioOperation, error) {
|
|
||||||
f.wgLock.RLock()
|
|
||||||
if f.closing.isSet() {
|
|
||||||
f.wgLock.RUnlock()
|
|
||||||
return nil, ErrFileClosed
|
|
||||||
}
|
|
||||||
f.wg.Add(1)
|
|
||||||
f.wgLock.RUnlock()
|
|
||||||
c := &ioOperation{}
|
|
||||||
c.ch = make(chan ioResult)
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ioCompletionProcessor processes completed async IOs forever
|
|
||||||
func ioCompletionProcessor(h syscall.Handle) {
|
|
||||||
// Set the timer resolution to 1. This fixes a performance regression in golang 1.6.
|
|
||||||
timeBeginPeriod(1)
|
|
||||||
for {
|
|
||||||
var bytes uint32
|
|
||||||
var key uintptr
|
|
||||||
var op *ioOperation
|
|
||||||
err := getQueuedCompletionStatus(h, &bytes, &key, &op, syscall.INFINITE)
|
|
||||||
if op == nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
op.ch <- ioResult{bytes, err}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// asyncIo processes the return value from ReadFile or WriteFile, blocking until
|
|
||||||
// the operation has actually completed.
|
|
||||||
func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) {
|
|
||||||
if err != syscall.ERROR_IO_PENDING {
|
|
||||||
return int(bytes), err
|
|
||||||
}
|
|
||||||
|
|
||||||
if f.closing.isSet() {
|
|
||||||
cancelIoEx(f.handle, &c.o)
|
|
||||||
}
|
|
||||||
|
|
||||||
var timeout timeoutChan
|
|
||||||
if d != nil {
|
|
||||||
d.channelLock.Lock()
|
|
||||||
timeout = d.channel
|
|
||||||
d.channelLock.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
var r ioResult
|
|
||||||
select {
|
|
||||||
case r = <-c.ch:
|
|
||||||
err = r.err
|
|
||||||
if err == syscall.ERROR_OPERATION_ABORTED {
|
|
||||||
if f.closing.isSet() {
|
|
||||||
err = ErrFileClosed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case <-timeout:
|
|
||||||
cancelIoEx(f.handle, &c.o)
|
|
||||||
r = <-c.ch
|
|
||||||
err = r.err
|
|
||||||
if err == syscall.ERROR_OPERATION_ABORTED {
|
|
||||||
err = ErrTimeout
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// runtime.KeepAlive is needed, as c is passed via native
|
|
||||||
// code to ioCompletionProcessor, c must remain alive
|
|
||||||
// until the channel read is complete.
|
|
||||||
runtime.KeepAlive(c)
|
|
||||||
return int(r.bytes), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read reads from a file handle.
|
|
||||||
func (f *win32File) Read(b []byte) (int, error) {
|
|
||||||
c, err := f.prepareIo()
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
defer f.wg.Done()
|
|
||||||
|
|
||||||
if f.readDeadline.timedout.isSet() {
|
|
||||||
return 0, ErrTimeout
|
|
||||||
}
|
|
||||||
|
|
||||||
var bytes uint32
|
|
||||||
err = syscall.ReadFile(f.handle, b, &bytes, &c.o)
|
|
||||||
n, err := f.asyncIo(c, &f.readDeadline, bytes, err)
|
|
||||||
runtime.KeepAlive(b)
|
|
||||||
|
|
||||||
// Handle EOF conditions.
|
|
||||||
if err == nil && n == 0 && len(b) != 0 {
|
|
||||||
return 0, io.EOF
|
|
||||||
} else if err == syscall.ERROR_BROKEN_PIPE {
|
|
||||||
return 0, io.EOF
|
|
||||||
} else {
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write writes to a file handle.
|
|
||||||
func (f *win32File) Write(b []byte) (int, error) {
|
|
||||||
c, err := f.prepareIo()
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
defer f.wg.Done()
|
|
||||||
|
|
||||||
if f.writeDeadline.timedout.isSet() {
|
|
||||||
return 0, ErrTimeout
|
|
||||||
}
|
|
||||||
|
|
||||||
var bytes uint32
|
|
||||||
err = syscall.WriteFile(f.handle, b, &bytes, &c.o)
|
|
||||||
n, err := f.asyncIo(c, &f.writeDeadline, bytes, err)
|
|
||||||
runtime.KeepAlive(b)
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *win32File) SetReadDeadline(deadline time.Time) error {
|
|
||||||
return f.readDeadline.set(deadline)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *win32File) SetWriteDeadline(deadline time.Time) error {
|
|
||||||
return f.writeDeadline.set(deadline)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *win32File) Flush() error {
|
|
||||||
return syscall.FlushFileBuffers(f.handle)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *deadlineHandler) set(deadline time.Time) error {
|
|
||||||
d.setLock.Lock()
|
|
||||||
defer d.setLock.Unlock()
|
|
||||||
|
|
||||||
if d.timer != nil {
|
|
||||||
if !d.timer.Stop() {
|
|
||||||
<-d.channel
|
|
||||||
}
|
|
||||||
d.timer = nil
|
|
||||||
}
|
|
||||||
d.timedout.setFalse()
|
|
||||||
|
|
||||||
select {
|
|
||||||
case <-d.channel:
|
|
||||||
d.channelLock.Lock()
|
|
||||||
d.channel = make(chan struct{})
|
|
||||||
d.channelLock.Unlock()
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
|
|
||||||
if deadline.IsZero() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
timeoutIO := func() {
|
|
||||||
d.timedout.setTrue()
|
|
||||||
close(d.channel)
|
|
||||||
}
|
|
||||||
|
|
||||||
now := time.Now()
|
|
||||||
duration := deadline.Sub(now)
|
|
||||||
if deadline.After(now) {
|
|
||||||
// Deadline is in the future, set a timer to wait
|
|
||||||
d.timer = time.AfterFunc(duration, timeoutIO)
|
|
||||||
} else {
|
|
||||||
// Deadline is in the past. Cancel all pending IO now.
|
|
||||||
timeoutIO()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
60
vendor/github.com/Microsoft/go-winio/fileinfo.go
generated
vendored
60
vendor/github.com/Microsoft/go-winio/fileinfo.go
generated
vendored
@ -1,60 +0,0 @@
|
|||||||
// +build windows
|
|
||||||
|
|
||||||
package winio
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"runtime"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
//sys getFileInformationByHandleEx(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) = GetFileInformationByHandleEx
|
|
||||||
//sys setFileInformationByHandle(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) = SetFileInformationByHandle
|
|
||||||
|
|
||||||
const (
|
|
||||||
fileBasicInfo = 0
|
|
||||||
fileIDInfo = 0x12
|
|
||||||
)
|
|
||||||
|
|
||||||
// FileBasicInfo contains file access time and file attributes information.
|
|
||||||
type FileBasicInfo struct {
|
|
||||||
CreationTime, LastAccessTime, LastWriteTime, ChangeTime syscall.Filetime
|
|
||||||
FileAttributes uintptr // includes padding
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetFileBasicInfo retrieves times and attributes for a file.
|
|
||||||
func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) {
|
|
||||||
bi := &FileBasicInfo{}
|
|
||||||
if err := getFileInformationByHandleEx(syscall.Handle(f.Fd()), fileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil {
|
|
||||||
return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
|
|
||||||
}
|
|
||||||
runtime.KeepAlive(f)
|
|
||||||
return bi, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFileBasicInfo sets times and attributes for a file.
|
|
||||||
func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error {
|
|
||||||
if err := setFileInformationByHandle(syscall.Handle(f.Fd()), fileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil {
|
|
||||||
return &os.PathError{Op: "SetFileInformationByHandle", Path: f.Name(), Err: err}
|
|
||||||
}
|
|
||||||
runtime.KeepAlive(f)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FileIDInfo contains the volume serial number and file ID for a file. This pair should be
|
|
||||||
// unique on a system.
|
|
||||||
type FileIDInfo struct {
|
|
||||||
VolumeSerialNumber uint64
|
|
||||||
FileID [16]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetFileID retrieves the unique (volume, file ID) pair for a file.
|
|
||||||
func GetFileID(f *os.File) (*FileIDInfo, error) {
|
|
||||||
fileID := &FileIDInfo{}
|
|
||||||
if err := getFileInformationByHandleEx(syscall.Handle(f.Fd()), fileIDInfo, (*byte)(unsafe.Pointer(fileID)), uint32(unsafe.Sizeof(*fileID))); err != nil {
|
|
||||||
return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
|
|
||||||
}
|
|
||||||
runtime.KeepAlive(f)
|
|
||||||
return fileID, nil
|
|
||||||
}
|
|
424
vendor/github.com/Microsoft/go-winio/pipe.go
generated
vendored
424
vendor/github.com/Microsoft/go-winio/pipe.go
generated
vendored
@ -1,424 +0,0 @@
|
|||||||
// +build windows
|
|
||||||
|
|
||||||
package winio
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"io"
|
|
||||||
"net"
|
|
||||||
"os"
|
|
||||||
"syscall"
|
|
||||||
"time"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
//sys connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) = ConnectNamedPipe
|
|
||||||
//sys createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateNamedPipeW
|
|
||||||
//sys createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateFileW
|
|
||||||
//sys waitNamedPipe(name string, timeout uint32) (err error) = WaitNamedPipeW
|
|
||||||
//sys getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo
|
|
||||||
//sys getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW
|
|
||||||
//sys localAlloc(uFlags uint32, length uint32) (ptr uintptr) = LocalAlloc
|
|
||||||
|
|
||||||
const (
|
|
||||||
cERROR_PIPE_BUSY = syscall.Errno(231)
|
|
||||||
cERROR_NO_DATA = syscall.Errno(232)
|
|
||||||
cERROR_PIPE_CONNECTED = syscall.Errno(535)
|
|
||||||
cERROR_SEM_TIMEOUT = syscall.Errno(121)
|
|
||||||
|
|
||||||
cPIPE_ACCESS_DUPLEX = 0x3
|
|
||||||
cFILE_FLAG_FIRST_PIPE_INSTANCE = 0x80000
|
|
||||||
cSECURITY_SQOS_PRESENT = 0x100000
|
|
||||||
cSECURITY_ANONYMOUS = 0
|
|
||||||
|
|
||||||
cPIPE_REJECT_REMOTE_CLIENTS = 0x8
|
|
||||||
|
|
||||||
cPIPE_UNLIMITED_INSTANCES = 255
|
|
||||||
|
|
||||||
cNMPWAIT_USE_DEFAULT_WAIT = 0
|
|
||||||
cNMPWAIT_NOWAIT = 1
|
|
||||||
|
|
||||||
cPIPE_TYPE_MESSAGE = 4
|
|
||||||
|
|
||||||
cPIPE_READMODE_MESSAGE = 2
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed.
|
|
||||||
// This error should match net.errClosing since docker takes a dependency on its text.
|
|
||||||
ErrPipeListenerClosed = errors.New("use of closed network connection")
|
|
||||||
|
|
||||||
errPipeWriteClosed = errors.New("pipe has been closed for write")
|
|
||||||
)
|
|
||||||
|
|
||||||
type win32Pipe struct {
|
|
||||||
*win32File
|
|
||||||
path string
|
|
||||||
}
|
|
||||||
|
|
||||||
type win32MessageBytePipe struct {
|
|
||||||
win32Pipe
|
|
||||||
writeClosed bool
|
|
||||||
readEOF bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type pipeAddress string
|
|
||||||
|
|
||||||
func (f *win32Pipe) LocalAddr() net.Addr {
|
|
||||||
return pipeAddress(f.path)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *win32Pipe) RemoteAddr() net.Addr {
|
|
||||||
return pipeAddress(f.path)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *win32Pipe) SetDeadline(t time.Time) error {
|
|
||||||
f.SetReadDeadline(t)
|
|
||||||
f.SetWriteDeadline(t)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CloseWrite closes the write side of a message pipe in byte mode.
|
|
||||||
func (f *win32MessageBytePipe) CloseWrite() error {
|
|
||||||
if f.writeClosed {
|
|
||||||
return errPipeWriteClosed
|
|
||||||
}
|
|
||||||
err := f.win32File.Flush()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = f.win32File.Write(nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f.writeClosed = true
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write writes bytes to a message pipe in byte mode. Zero-byte writes are ignored, since
|
|
||||||
// they are used to implement CloseWrite().
|
|
||||||
func (f *win32MessageBytePipe) Write(b []byte) (int, error) {
|
|
||||||
if f.writeClosed {
|
|
||||||
return 0, errPipeWriteClosed
|
|
||||||
}
|
|
||||||
if len(b) == 0 {
|
|
||||||
return 0, nil
|
|
||||||
}
|
|
||||||
return f.win32File.Write(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read reads bytes from a message pipe in byte mode. A read of a zero-byte message on a message
|
|
||||||
// mode pipe will return io.EOF, as will all subsequent reads.
|
|
||||||
func (f *win32MessageBytePipe) Read(b []byte) (int, error) {
|
|
||||||
if f.readEOF {
|
|
||||||
return 0, io.EOF
|
|
||||||
}
|
|
||||||
n, err := f.win32File.Read(b)
|
|
||||||
if err == io.EOF {
|
|
||||||
// If this was the result of a zero-byte read, then
|
|
||||||
// it is possible that the read was due to a zero-size
|
|
||||||
// message. Since we are simulating CloseWrite with a
|
|
||||||
// zero-byte message, ensure that all future Read() calls
|
|
||||||
// also return EOF.
|
|
||||||
f.readEOF = true
|
|
||||||
}
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s pipeAddress) Network() string {
|
|
||||||
return "pipe"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s pipeAddress) String() string {
|
|
||||||
return string(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DialPipe connects to a named pipe by path, timing out if the connection
|
|
||||||
// takes longer than the specified duration. If timeout is nil, then the timeout
|
|
||||||
// is the default timeout established by the pipe server.
|
|
||||||
func DialPipe(path string, timeout *time.Duration) (net.Conn, error) {
|
|
||||||
var absTimeout time.Time
|
|
||||||
if timeout != nil {
|
|
||||||
absTimeout = time.Now().Add(*timeout)
|
|
||||||
}
|
|
||||||
var err error
|
|
||||||
var h syscall.Handle
|
|
||||||
for {
|
|
||||||
h, err = createFile(path, syscall.GENERIC_READ|syscall.GENERIC_WRITE, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0)
|
|
||||||
if err != cERROR_PIPE_BUSY {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
now := time.Now()
|
|
||||||
var ms uint32
|
|
||||||
if absTimeout.IsZero() {
|
|
||||||
ms = cNMPWAIT_USE_DEFAULT_WAIT
|
|
||||||
} else if now.After(absTimeout) {
|
|
||||||
ms = cNMPWAIT_NOWAIT
|
|
||||||
} else {
|
|
||||||
ms = uint32(absTimeout.Sub(now).Nanoseconds() / 1000 / 1000)
|
|
||||||
}
|
|
||||||
err = waitNamedPipe(path, ms)
|
|
||||||
if err != nil {
|
|
||||||
if err == cERROR_SEM_TIMEOUT {
|
|
||||||
return nil, ErrTimeout
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return nil, &os.PathError{Op: "open", Path: path, Err: err}
|
|
||||||
}
|
|
||||||
|
|
||||||
var flags uint32
|
|
||||||
err = getNamedPipeInfo(h, &flags, nil, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var state uint32
|
|
||||||
err = getNamedPipeHandleState(h, &state, nil, nil, nil, nil, 0)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if state&cPIPE_READMODE_MESSAGE != 0 {
|
|
||||||
return nil, &os.PathError{Op: "open", Path: path, Err: errors.New("message readmode pipes not supported")}
|
|
||||||
}
|
|
||||||
|
|
||||||
f, err := makeWin32File(h)
|
|
||||||
if err != nil {
|
|
||||||
syscall.Close(h)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the pipe is in message mode, return a message byte pipe, which
|
|
||||||
// supports CloseWrite().
|
|
||||||
if flags&cPIPE_TYPE_MESSAGE != 0 {
|
|
||||||
return &win32MessageBytePipe{
|
|
||||||
win32Pipe: win32Pipe{win32File: f, path: path},
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
return &win32Pipe{win32File: f, path: path}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type acceptResponse struct {
|
|
||||||
f *win32File
|
|
||||||
err error
|
|
||||||
}
|
|
||||||
|
|
||||||
type win32PipeListener struct {
|
|
||||||
firstHandle syscall.Handle
|
|
||||||
path string
|
|
||||||
securityDescriptor []byte
|
|
||||||
config PipeConfig
|
|
||||||
acceptCh chan (chan acceptResponse)
|
|
||||||
closeCh chan int
|
|
||||||
doneCh chan int
|
|
||||||
}
|
|
||||||
|
|
||||||
func makeServerPipeHandle(path string, securityDescriptor []byte, c *PipeConfig, first bool) (syscall.Handle, error) {
|
|
||||||
var flags uint32 = cPIPE_ACCESS_DUPLEX | syscall.FILE_FLAG_OVERLAPPED
|
|
||||||
if first {
|
|
||||||
flags |= cFILE_FLAG_FIRST_PIPE_INSTANCE
|
|
||||||
}
|
|
||||||
|
|
||||||
var mode uint32 = cPIPE_REJECT_REMOTE_CLIENTS
|
|
||||||
if c.MessageMode {
|
|
||||||
mode |= cPIPE_TYPE_MESSAGE
|
|
||||||
}
|
|
||||||
|
|
||||||
sa := &syscall.SecurityAttributes{}
|
|
||||||
sa.Length = uint32(unsafe.Sizeof(*sa))
|
|
||||||
if securityDescriptor != nil {
|
|
||||||
len := uint32(len(securityDescriptor))
|
|
||||||
sa.SecurityDescriptor = localAlloc(0, len)
|
|
||||||
defer localFree(sa.SecurityDescriptor)
|
|
||||||
copy((*[0xffff]byte)(unsafe.Pointer(sa.SecurityDescriptor))[:], securityDescriptor)
|
|
||||||
}
|
|
||||||
h, err := createNamedPipe(path, flags, mode, cPIPE_UNLIMITED_INSTANCES, uint32(c.OutputBufferSize), uint32(c.InputBufferSize), 0, sa)
|
|
||||||
if err != nil {
|
|
||||||
return 0, &os.PathError{Op: "open", Path: path, Err: err}
|
|
||||||
}
|
|
||||||
return h, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *win32PipeListener) makeServerPipe() (*win32File, error) {
|
|
||||||
h, err := makeServerPipeHandle(l.path, l.securityDescriptor, &l.config, false)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
f, err := makeWin32File(h)
|
|
||||||
if err != nil {
|
|
||||||
syscall.Close(h)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return f, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) {
|
|
||||||
p, err := l.makeServerPipe()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for the client to connect.
|
|
||||||
ch := make(chan error)
|
|
||||||
go func(p *win32File) {
|
|
||||||
ch <- connectPipe(p)
|
|
||||||
}(p)
|
|
||||||
|
|
||||||
select {
|
|
||||||
case err = <-ch:
|
|
||||||
if err != nil {
|
|
||||||
p.Close()
|
|
||||||
p = nil
|
|
||||||
}
|
|
||||||
case <-l.closeCh:
|
|
||||||
// Abort the connect request by closing the handle.
|
|
||||||
p.Close()
|
|
||||||
p = nil
|
|
||||||
err = <-ch
|
|
||||||
if err == nil || err == ErrFileClosed {
|
|
||||||
err = ErrPipeListenerClosed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return p, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *win32PipeListener) listenerRoutine() {
|
|
||||||
closed := false
|
|
||||||
for !closed {
|
|
||||||
select {
|
|
||||||
case <-l.closeCh:
|
|
||||||
closed = true
|
|
||||||
case responseCh := <-l.acceptCh:
|
|
||||||
var (
|
|
||||||
p *win32File
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
for {
|
|
||||||
p, err = l.makeConnectedServerPipe()
|
|
||||||
// If the connection was immediately closed by the client, try
|
|
||||||
// again.
|
|
||||||
if err != cERROR_NO_DATA {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
responseCh <- acceptResponse{p, err}
|
|
||||||
closed = err == ErrPipeListenerClosed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
syscall.Close(l.firstHandle)
|
|
||||||
l.firstHandle = 0
|
|
||||||
// Notify Close() and Accept() callers that the handle has been closed.
|
|
||||||
close(l.doneCh)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PipeConfig contain configuration for the pipe listener.
|
|
||||||
type PipeConfig struct {
|
|
||||||
// SecurityDescriptor contains a Windows security descriptor in SDDL format.
|
|
||||||
SecurityDescriptor string
|
|
||||||
|
|
||||||
// MessageMode determines whether the pipe is in byte or message mode. In either
|
|
||||||
// case the pipe is read in byte mode by default. The only practical difference in
|
|
||||||
// this implementation is that CloseWrite() is only supported for message mode pipes;
|
|
||||||
// CloseWrite() is implemented as a zero-byte write, but zero-byte writes are only
|
|
||||||
// transferred to the reader (and returned as io.EOF in this implementation)
|
|
||||||
// when the pipe is in message mode.
|
|
||||||
MessageMode bool
|
|
||||||
|
|
||||||
// InputBufferSize specifies the size the input buffer, in bytes.
|
|
||||||
InputBufferSize int32
|
|
||||||
|
|
||||||
// OutputBufferSize specifies the size the input buffer, in bytes.
|
|
||||||
OutputBufferSize int32
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListenPipe creates a listener on a Windows named pipe path, e.g. \\.\pipe\mypipe.
|
|
||||||
// The pipe must not already exist.
|
|
||||||
func ListenPipe(path string, c *PipeConfig) (net.Listener, error) {
|
|
||||||
var (
|
|
||||||
sd []byte
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
if c == nil {
|
|
||||||
c = &PipeConfig{}
|
|
||||||
}
|
|
||||||
if c.SecurityDescriptor != "" {
|
|
||||||
sd, err = SddlToSecurityDescriptor(c.SecurityDescriptor)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
h, err := makeServerPipeHandle(path, sd, c, true)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// Immediately open and then close a client handle so that the named pipe is
|
|
||||||
// created but not currently accepting connections.
|
|
||||||
h2, err := createFile(path, 0, 0, nil, syscall.OPEN_EXISTING, cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0)
|
|
||||||
if err != nil {
|
|
||||||
syscall.Close(h)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
syscall.Close(h2)
|
|
||||||
l := &win32PipeListener{
|
|
||||||
firstHandle: h,
|
|
||||||
path: path,
|
|
||||||
securityDescriptor: sd,
|
|
||||||
config: *c,
|
|
||||||
acceptCh: make(chan (chan acceptResponse)),
|
|
||||||
closeCh: make(chan int),
|
|
||||||
doneCh: make(chan int),
|
|
||||||
}
|
|
||||||
go l.listenerRoutine()
|
|
||||||
return l, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func connectPipe(p *win32File) error {
|
|
||||||
c, err := p.prepareIo()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer p.wg.Done()
|
|
||||||
|
|
||||||
err = connectNamedPipe(p.handle, &c.o)
|
|
||||||
_, err = p.asyncIo(c, nil, 0, err)
|
|
||||||
if err != nil && err != cERROR_PIPE_CONNECTED {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *win32PipeListener) Accept() (net.Conn, error) {
|
|
||||||
ch := make(chan acceptResponse)
|
|
||||||
select {
|
|
||||||
case l.acceptCh <- ch:
|
|
||||||
response := <-ch
|
|
||||||
err := response.err
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if l.config.MessageMode {
|
|
||||||
return &win32MessageBytePipe{
|
|
||||||
win32Pipe: win32Pipe{win32File: response.f, path: l.path},
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
return &win32Pipe{win32File: response.f, path: l.path}, nil
|
|
||||||
case <-l.doneCh:
|
|
||||||
return nil, ErrPipeListenerClosed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *win32PipeListener) Close() error {
|
|
||||||
select {
|
|
||||||
case l.closeCh <- 1:
|
|
||||||
<-l.doneCh
|
|
||||||
case <-l.doneCh:
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *win32PipeListener) Addr() net.Addr {
|
|
||||||
return pipeAddress(l.path)
|
|
||||||
}
|
|
202
vendor/github.com/Microsoft/go-winio/privilege.go
generated
vendored
202
vendor/github.com/Microsoft/go-winio/privilege.go
generated
vendored
@ -1,202 +0,0 @@
|
|||||||
// +build windows
|
|
||||||
|
|
||||||
package winio
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/binary"
|
|
||||||
"fmt"
|
|
||||||
"runtime"
|
|
||||||
"sync"
|
|
||||||
"syscall"
|
|
||||||
"unicode/utf16"
|
|
||||||
|
|
||||||
"golang.org/x/sys/windows"
|
|
||||||
)
|
|
||||||
|
|
||||||
//sys adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges
|
|
||||||
//sys impersonateSelf(level uint32) (err error) = advapi32.ImpersonateSelf
|
|
||||||
//sys revertToSelf() (err error) = advapi32.RevertToSelf
|
|
||||||
//sys openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) = advapi32.OpenThreadToken
|
|
||||||
//sys getCurrentThread() (h syscall.Handle) = GetCurrentThread
|
|
||||||
//sys lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) = advapi32.LookupPrivilegeValueW
|
|
||||||
//sys lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW
|
|
||||||
//sys lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) = advapi32.LookupPrivilegeDisplayNameW
|
|
||||||
|
|
||||||
const (
|
|
||||||
SE_PRIVILEGE_ENABLED = 2
|
|
||||||
|
|
||||||
ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300
|
|
||||||
|
|
||||||
SeBackupPrivilege = "SeBackupPrivilege"
|
|
||||||
SeRestorePrivilege = "SeRestorePrivilege"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
securityAnonymous = iota
|
|
||||||
securityIdentification
|
|
||||||
securityImpersonation
|
|
||||||
securityDelegation
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
privNames = make(map[string]uint64)
|
|
||||||
privNameMutex sync.Mutex
|
|
||||||
)
|
|
||||||
|
|
||||||
// PrivilegeError represents an error enabling privileges.
|
|
||||||
type PrivilegeError struct {
|
|
||||||
privileges []uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *PrivilegeError) Error() string {
|
|
||||||
s := ""
|
|
||||||
if len(e.privileges) > 1 {
|
|
||||||
s = "Could not enable privileges "
|
|
||||||
} else {
|
|
||||||
s = "Could not enable privilege "
|
|
||||||
}
|
|
||||||
for i, p := range e.privileges {
|
|
||||||
if i != 0 {
|
|
||||||
s += ", "
|
|
||||||
}
|
|
||||||
s += `"`
|
|
||||||
s += getPrivilegeName(p)
|
|
||||||
s += `"`
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// RunWithPrivilege enables a single privilege for a function call.
|
|
||||||
func RunWithPrivilege(name string, fn func() error) error {
|
|
||||||
return RunWithPrivileges([]string{name}, fn)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RunWithPrivileges enables privileges for a function call.
|
|
||||||
func RunWithPrivileges(names []string, fn func() error) error {
|
|
||||||
privileges, err := mapPrivileges(names)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
runtime.LockOSThread()
|
|
||||||
defer runtime.UnlockOSThread()
|
|
||||||
token, err := newThreadToken()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer releaseThreadToken(token)
|
|
||||||
err = adjustPrivileges(token, privileges, SE_PRIVILEGE_ENABLED)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return fn()
|
|
||||||
}
|
|
||||||
|
|
||||||
func mapPrivileges(names []string) ([]uint64, error) {
|
|
||||||
var privileges []uint64
|
|
||||||
privNameMutex.Lock()
|
|
||||||
defer privNameMutex.Unlock()
|
|
||||||
for _, name := range names {
|
|
||||||
p, ok := privNames[name]
|
|
||||||
if !ok {
|
|
||||||
err := lookupPrivilegeValue("", name, &p)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
privNames[name] = p
|
|
||||||
}
|
|
||||||
privileges = append(privileges, p)
|
|
||||||
}
|
|
||||||
return privileges, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnableProcessPrivileges enables privileges globally for the process.
|
|
||||||
func EnableProcessPrivileges(names []string) error {
|
|
||||||
return enableDisableProcessPrivilege(names, SE_PRIVILEGE_ENABLED)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DisableProcessPrivileges disables privileges globally for the process.
|
|
||||||
func DisableProcessPrivileges(names []string) error {
|
|
||||||
return enableDisableProcessPrivilege(names, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func enableDisableProcessPrivilege(names []string, action uint32) error {
|
|
||||||
privileges, err := mapPrivileges(names)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
p, _ := windows.GetCurrentProcess()
|
|
||||||
var token windows.Token
|
|
||||||
err = windows.OpenProcessToken(p, windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, &token)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer token.Close()
|
|
||||||
return adjustPrivileges(token, privileges, action)
|
|
||||||
}
|
|
||||||
|
|
||||||
func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) error {
|
|
||||||
var b bytes.Buffer
|
|
||||||
binary.Write(&b, binary.LittleEndian, uint32(len(privileges)))
|
|
||||||
for _, p := range privileges {
|
|
||||||
binary.Write(&b, binary.LittleEndian, p)
|
|
||||||
binary.Write(&b, binary.LittleEndian, action)
|
|
||||||
}
|
|
||||||
prevState := make([]byte, b.Len())
|
|
||||||
reqSize := uint32(0)
|
|
||||||
success, err := adjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(len(prevState)), &prevState[0], &reqSize)
|
|
||||||
if !success {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err == ERROR_NOT_ALL_ASSIGNED {
|
|
||||||
return &PrivilegeError{privileges}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getPrivilegeName(luid uint64) string {
|
|
||||||
var nameBuffer [256]uint16
|
|
||||||
bufSize := uint32(len(nameBuffer))
|
|
||||||
err := lookupPrivilegeName("", &luid, &nameBuffer[0], &bufSize)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Sprintf("<unknown privilege %d>", luid)
|
|
||||||
}
|
|
||||||
|
|
||||||
var displayNameBuffer [256]uint16
|
|
||||||
displayBufSize := uint32(len(displayNameBuffer))
|
|
||||||
var langID uint32
|
|
||||||
err = lookupPrivilegeDisplayName("", &nameBuffer[0], &displayNameBuffer[0], &displayBufSize, &langID)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Sprintf("<unknown privilege %s>", string(utf16.Decode(nameBuffer[:bufSize])))
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(utf16.Decode(displayNameBuffer[:displayBufSize]))
|
|
||||||
}
|
|
||||||
|
|
||||||
func newThreadToken() (windows.Token, error) {
|
|
||||||
err := impersonateSelf(securityImpersonation)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var token windows.Token
|
|
||||||
err = openThreadToken(getCurrentThread(), syscall.TOKEN_ADJUST_PRIVILEGES|syscall.TOKEN_QUERY, false, &token)
|
|
||||||
if err != nil {
|
|
||||||
rerr := revertToSelf()
|
|
||||||
if rerr != nil {
|
|
||||||
panic(rerr)
|
|
||||||
}
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return token, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func releaseThreadToken(h windows.Token) {
|
|
||||||
err := revertToSelf()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
h.Close()
|
|
||||||
}
|
|
128
vendor/github.com/Microsoft/go-winio/reparse.go
generated
vendored
128
vendor/github.com/Microsoft/go-winio/reparse.go
generated
vendored
@ -1,128 +0,0 @@
|
|||||||
package winio
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/binary"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"unicode/utf16"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
reparseTagMountPoint = 0xA0000003
|
|
||||||
reparseTagSymlink = 0xA000000C
|
|
||||||
)
|
|
||||||
|
|
||||||
type reparseDataBuffer struct {
|
|
||||||
ReparseTag uint32
|
|
||||||
ReparseDataLength uint16
|
|
||||||
Reserved uint16
|
|
||||||
SubstituteNameOffset uint16
|
|
||||||
SubstituteNameLength uint16
|
|
||||||
PrintNameOffset uint16
|
|
||||||
PrintNameLength uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReparsePoint describes a Win32 symlink or mount point.
|
|
||||||
type ReparsePoint struct {
|
|
||||||
Target string
|
|
||||||
IsMountPoint bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnsupportedReparsePointError is returned when trying to decode a non-symlink or
|
|
||||||
// mount point reparse point.
|
|
||||||
type UnsupportedReparsePointError struct {
|
|
||||||
Tag uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *UnsupportedReparsePointError) Error() string {
|
|
||||||
return fmt.Sprintf("unsupported reparse point %x", e.Tag)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DecodeReparsePoint decodes a Win32 REPARSE_DATA_BUFFER structure containing either a symlink
|
|
||||||
// or a mount point.
|
|
||||||
func DecodeReparsePoint(b []byte) (*ReparsePoint, error) {
|
|
||||||
tag := binary.LittleEndian.Uint32(b[0:4])
|
|
||||||
return DecodeReparsePointData(tag, b[8:])
|
|
||||||
}
|
|
||||||
|
|
||||||
func DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error) {
|
|
||||||
isMountPoint := false
|
|
||||||
switch tag {
|
|
||||||
case reparseTagMountPoint:
|
|
||||||
isMountPoint = true
|
|
||||||
case reparseTagSymlink:
|
|
||||||
default:
|
|
||||||
return nil, &UnsupportedReparsePointError{tag}
|
|
||||||
}
|
|
||||||
nameOffset := 8 + binary.LittleEndian.Uint16(b[4:6])
|
|
||||||
if !isMountPoint {
|
|
||||||
nameOffset += 4
|
|
||||||
}
|
|
||||||
nameLength := binary.LittleEndian.Uint16(b[6:8])
|
|
||||||
name := make([]uint16, nameLength/2)
|
|
||||||
err := binary.Read(bytes.NewReader(b[nameOffset:nameOffset+nameLength]), binary.LittleEndian, &name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &ReparsePoint{string(utf16.Decode(name)), isMountPoint}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isDriveLetter(c byte) bool {
|
|
||||||
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
|
|
||||||
}
|
|
||||||
|
|
||||||
// EncodeReparsePoint encodes a Win32 REPARSE_DATA_BUFFER structure describing a symlink or
|
|
||||||
// mount point.
|
|
||||||
func EncodeReparsePoint(rp *ReparsePoint) []byte {
|
|
||||||
// Generate an NT path and determine if this is a relative path.
|
|
||||||
var ntTarget string
|
|
||||||
relative := false
|
|
||||||
if strings.HasPrefix(rp.Target, `\\?\`) {
|
|
||||||
ntTarget = `\??\` + rp.Target[4:]
|
|
||||||
} else if strings.HasPrefix(rp.Target, `\\`) {
|
|
||||||
ntTarget = `\??\UNC\` + rp.Target[2:]
|
|
||||||
} else if len(rp.Target) >= 2 && isDriveLetter(rp.Target[0]) && rp.Target[1] == ':' {
|
|
||||||
ntTarget = `\??\` + rp.Target
|
|
||||||
} else {
|
|
||||||
ntTarget = rp.Target
|
|
||||||
relative = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// The paths must be NUL-terminated even though they are counted strings.
|
|
||||||
target16 := utf16.Encode([]rune(rp.Target + "\x00"))
|
|
||||||
ntTarget16 := utf16.Encode([]rune(ntTarget + "\x00"))
|
|
||||||
|
|
||||||
size := int(unsafe.Sizeof(reparseDataBuffer{})) - 8
|
|
||||||
size += len(ntTarget16)*2 + len(target16)*2
|
|
||||||
|
|
||||||
tag := uint32(reparseTagMountPoint)
|
|
||||||
if !rp.IsMountPoint {
|
|
||||||
tag = reparseTagSymlink
|
|
||||||
size += 4 // Add room for symlink flags
|
|
||||||
}
|
|
||||||
|
|
||||||
data := reparseDataBuffer{
|
|
||||||
ReparseTag: tag,
|
|
||||||
ReparseDataLength: uint16(size),
|
|
||||||
SubstituteNameOffset: 0,
|
|
||||||
SubstituteNameLength: uint16((len(ntTarget16) - 1) * 2),
|
|
||||||
PrintNameOffset: uint16(len(ntTarget16) * 2),
|
|
||||||
PrintNameLength: uint16((len(target16) - 1) * 2),
|
|
||||||
}
|
|
||||||
|
|
||||||
var b bytes.Buffer
|
|
||||||
binary.Write(&b, binary.LittleEndian, &data)
|
|
||||||
if !rp.IsMountPoint {
|
|
||||||
flags := uint32(0)
|
|
||||||
if relative {
|
|
||||||
flags |= 1
|
|
||||||
}
|
|
||||||
binary.Write(&b, binary.LittleEndian, flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
binary.Write(&b, binary.LittleEndian, ntTarget16)
|
|
||||||
binary.Write(&b, binary.LittleEndian, target16)
|
|
||||||
return b.Bytes()
|
|
||||||
}
|
|
98
vendor/github.com/Microsoft/go-winio/sd.go
generated
vendored
98
vendor/github.com/Microsoft/go-winio/sd.go
generated
vendored
@ -1,98 +0,0 @@
|
|||||||
// +build windows
|
|
||||||
|
|
||||||
package winio
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
//sys lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountNameW
|
|
||||||
//sys convertSidToStringSid(sid *byte, str **uint16) (err error) = advapi32.ConvertSidToStringSidW
|
|
||||||
//sys convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW
|
|
||||||
//sys convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW
|
|
||||||
//sys localFree(mem uintptr) = LocalFree
|
|
||||||
//sys getSecurityDescriptorLength(sd uintptr) (len uint32) = advapi32.GetSecurityDescriptorLength
|
|
||||||
|
|
||||||
const (
|
|
||||||
cERROR_NONE_MAPPED = syscall.Errno(1332)
|
|
||||||
)
|
|
||||||
|
|
||||||
type AccountLookupError struct {
|
|
||||||
Name string
|
|
||||||
Err error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *AccountLookupError) Error() string {
|
|
||||||
if e.Name == "" {
|
|
||||||
return "lookup account: empty account name specified"
|
|
||||||
}
|
|
||||||
var s string
|
|
||||||
switch e.Err {
|
|
||||||
case cERROR_NONE_MAPPED:
|
|
||||||
s = "not found"
|
|
||||||
default:
|
|
||||||
s = e.Err.Error()
|
|
||||||
}
|
|
||||||
return "lookup account " + e.Name + ": " + s
|
|
||||||
}
|
|
||||||
|
|
||||||
type SddlConversionError struct {
|
|
||||||
Sddl string
|
|
||||||
Err error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *SddlConversionError) Error() string {
|
|
||||||
return "convert " + e.Sddl + ": " + e.Err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
// LookupSidByName looks up the SID of an account by name
|
|
||||||
func LookupSidByName(name string) (sid string, err error) {
|
|
||||||
if name == "" {
|
|
||||||
return "", &AccountLookupError{name, cERROR_NONE_MAPPED}
|
|
||||||
}
|
|
||||||
|
|
||||||
var sidSize, sidNameUse, refDomainSize uint32
|
|
||||||
err = lookupAccountName(nil, name, nil, &sidSize, nil, &refDomainSize, &sidNameUse)
|
|
||||||
if err != nil && err != syscall.ERROR_INSUFFICIENT_BUFFER {
|
|
||||||
return "", &AccountLookupError{name, err}
|
|
||||||
}
|
|
||||||
sidBuffer := make([]byte, sidSize)
|
|
||||||
refDomainBuffer := make([]uint16, refDomainSize)
|
|
||||||
err = lookupAccountName(nil, name, &sidBuffer[0], &sidSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse)
|
|
||||||
if err != nil {
|
|
||||||
return "", &AccountLookupError{name, err}
|
|
||||||
}
|
|
||||||
var strBuffer *uint16
|
|
||||||
err = convertSidToStringSid(&sidBuffer[0], &strBuffer)
|
|
||||||
if err != nil {
|
|
||||||
return "", &AccountLookupError{name, err}
|
|
||||||
}
|
|
||||||
sid = syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(strBuffer))[:])
|
|
||||||
localFree(uintptr(unsafe.Pointer(strBuffer)))
|
|
||||||
return sid, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func SddlToSecurityDescriptor(sddl string) ([]byte, error) {
|
|
||||||
var sdBuffer uintptr
|
|
||||||
err := convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &sdBuffer, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, &SddlConversionError{sddl, err}
|
|
||||||
}
|
|
||||||
defer localFree(sdBuffer)
|
|
||||||
sd := make([]byte, getSecurityDescriptorLength(sdBuffer))
|
|
||||||
copy(sd, (*[0xffff]byte)(unsafe.Pointer(sdBuffer))[:len(sd)])
|
|
||||||
return sd, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func SecurityDescriptorToSddl(sd []byte) (string, error) {
|
|
||||||
var sddl *uint16
|
|
||||||
// The returned string length seems to including an aribtrary number of terminating NULs.
|
|
||||||
// Don't use it.
|
|
||||||
err := convertSecurityDescriptorToStringSecurityDescriptor(&sd[0], 1, 0xff, &sddl, nil)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
defer localFree(uintptr(unsafe.Pointer(sddl)))
|
|
||||||
return syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(sddl))[:]), nil
|
|
||||||
}
|
|
3
vendor/github.com/Microsoft/go-winio/syscall.go
generated
vendored
3
vendor/github.com/Microsoft/go-winio/syscall.go
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
package winio
|
|
||||||
|
|
||||||
//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go file.go pipe.go sd.go fileinfo.go privilege.go backup.go
|
|
528
vendor/github.com/Microsoft/go-winio/zsyscall_windows.go
generated
vendored
528
vendor/github.com/Microsoft/go-winio/zsyscall_windows.go
generated
vendored
@ -1,528 +0,0 @@
|
|||||||
// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
|
|
||||||
|
|
||||||
package winio
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"golang.org/x/sys/windows"
|
|
||||||
)
|
|
||||||
|
|
||||||
var _ unsafe.Pointer
|
|
||||||
|
|
||||||
// Do the interface allocations only once for common
|
|
||||||
// Errno values.
|
|
||||||
const (
|
|
||||||
errnoERROR_IO_PENDING = 997
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
|
|
||||||
)
|
|
||||||
|
|
||||||
// errnoErr returns common boxed Errno values, to prevent
|
|
||||||
// allocations at runtime.
|
|
||||||
func errnoErr(e syscall.Errno) error {
|
|
||||||
switch e {
|
|
||||||
case 0:
|
|
||||||
return nil
|
|
||||||
case errnoERROR_IO_PENDING:
|
|
||||||
return errERROR_IO_PENDING
|
|
||||||
}
|
|
||||||
// TODO: add more here, after collecting data on the common
|
|
||||||
// error values see on Windows. (perhaps when running
|
|
||||||
// all.bat?)
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
|
|
||||||
modwinmm = windows.NewLazySystemDLL("winmm.dll")
|
|
||||||
modadvapi32 = windows.NewLazySystemDLL("advapi32.dll")
|
|
||||||
|
|
||||||
procCancelIoEx = modkernel32.NewProc("CancelIoEx")
|
|
||||||
procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort")
|
|
||||||
procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus")
|
|
||||||
procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes")
|
|
||||||
proctimeBeginPeriod = modwinmm.NewProc("timeBeginPeriod")
|
|
||||||
procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe")
|
|
||||||
procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW")
|
|
||||||
procCreateFileW = modkernel32.NewProc("CreateFileW")
|
|
||||||
procWaitNamedPipeW = modkernel32.NewProc("WaitNamedPipeW")
|
|
||||||
procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo")
|
|
||||||
procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW")
|
|
||||||
procLocalAlloc = modkernel32.NewProc("LocalAlloc")
|
|
||||||
procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW")
|
|
||||||
procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW")
|
|
||||||
procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW")
|
|
||||||
procConvertSecurityDescriptorToStringSecurityDescriptorW = modadvapi32.NewProc("ConvertSecurityDescriptorToStringSecurityDescriptorW")
|
|
||||||
procLocalFree = modkernel32.NewProc("LocalFree")
|
|
||||||
procGetSecurityDescriptorLength = modadvapi32.NewProc("GetSecurityDescriptorLength")
|
|
||||||
procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx")
|
|
||||||
procSetFileInformationByHandle = modkernel32.NewProc("SetFileInformationByHandle")
|
|
||||||
procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges")
|
|
||||||
procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf")
|
|
||||||
procRevertToSelf = modadvapi32.NewProc("RevertToSelf")
|
|
||||||
procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken")
|
|
||||||
procGetCurrentThread = modkernel32.NewProc("GetCurrentThread")
|
|
||||||
procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW")
|
|
||||||
procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW")
|
|
||||||
procLookupPrivilegeDisplayNameW = modadvapi32.NewProc("LookupPrivilegeDisplayNameW")
|
|
||||||
procBackupRead = modkernel32.NewProc("BackupRead")
|
|
||||||
procBackupWrite = modkernel32.NewProc("BackupWrite")
|
|
||||||
)
|
|
||||||
|
|
||||||
func cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(file), uintptr(unsafe.Pointer(o)), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) {
|
|
||||||
r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(file), uintptr(port), uintptr(key), uintptr(threadCount), 0, 0)
|
|
||||||
newport = syscall.Handle(r0)
|
|
||||||
if newport == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(port), uintptr(unsafe.Pointer(bytes)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(o)), uintptr(timeout), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(h), uintptr(flags), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func timeBeginPeriod(period uint32) (n int32) {
|
|
||||||
r0, _, _ := syscall.Syscall(proctimeBeginPeriod.Addr(), 1, uintptr(period), 0, 0)
|
|
||||||
n = int32(r0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(pipe), uintptr(unsafe.Pointer(o)), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) {
|
|
||||||
var _p0 *uint16
|
|
||||||
_p0, err = syscall.UTF16PtrFromString(name)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return _createNamedPipe(_p0, flags, pipeMode, maxInstances, outSize, inSize, defaultTimeout, sa)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _createNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) {
|
|
||||||
r0, _, e1 := syscall.Syscall9(procCreateNamedPipeW.Addr(), 8, uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(pipeMode), uintptr(maxInstances), uintptr(outSize), uintptr(inSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)), 0)
|
|
||||||
handle = syscall.Handle(r0)
|
|
||||||
if handle == syscall.InvalidHandle {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) {
|
|
||||||
var _p0 *uint16
|
|
||||||
_p0, err = syscall.UTF16PtrFromString(name)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return _createFile(_p0, access, mode, sa, createmode, attrs, templatefile)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _createFile(name *uint16, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) {
|
|
||||||
r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0)
|
|
||||||
handle = syscall.Handle(r0)
|
|
||||||
if handle == syscall.InvalidHandle {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func waitNamedPipe(name string, timeout uint32) (err error) {
|
|
||||||
var _p0 *uint16
|
|
||||||
_p0, err = syscall.UTF16PtrFromString(name)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return _waitNamedPipe(_p0, timeout)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _waitNamedPipe(name *uint16, timeout uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procWaitNamedPipeW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(timeout), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall6(procGetNamedPipeInfo.Addr(), 5, uintptr(pipe), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(outSize)), uintptr(unsafe.Pointer(inSize)), uintptr(unsafe.Pointer(maxInstances)), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall9(procGetNamedPipeHandleStateW.Addr(), 7, uintptr(pipe), uintptr(unsafe.Pointer(state)), uintptr(unsafe.Pointer(curInstances)), uintptr(unsafe.Pointer(maxCollectionCount)), uintptr(unsafe.Pointer(collectDataTimeout)), uintptr(unsafe.Pointer(userName)), uintptr(maxUserNameSize), 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func localAlloc(uFlags uint32, length uint32) (ptr uintptr) {
|
|
||||||
r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(uFlags), uintptr(length), 0)
|
|
||||||
ptr = uintptr(r0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) {
|
|
||||||
var _p0 *uint16
|
|
||||||
_p0, err = syscall.UTF16PtrFromString(accountName)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return _lookupAccountName(systemName, _p0, sid, sidSize, refDomain, refDomainSize, sidNameUse)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _lookupAccountName(systemName *uint16, accountName *uint16, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse)), 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func convertSidToStringSid(sid *byte, str **uint16) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(str)), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) {
|
|
||||||
var _p0 *uint16
|
|
||||||
_p0, err = syscall.UTF16PtrFromString(str)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return _convertStringSecurityDescriptorToSecurityDescriptor(_p0, revision, sd, size)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _convertStringSecurityDescriptorToSecurityDescriptor(str *uint16, revision uint32, sd *uintptr, size *uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall6(procConvertStringSecurityDescriptorToSecurityDescriptorW.Addr(), 4, uintptr(unsafe.Pointer(str)), uintptr(revision), uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(size)), 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall6(procConvertSecurityDescriptorToStringSecurityDescriptorW.Addr(), 5, uintptr(unsafe.Pointer(sd)), uintptr(revision), uintptr(secInfo), uintptr(unsafe.Pointer(sddl)), uintptr(unsafe.Pointer(sddlSize)), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func localFree(mem uintptr) {
|
|
||||||
syscall.Syscall(procLocalFree.Addr(), 1, uintptr(mem), 0, 0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getSecurityDescriptorLength(sd uintptr) (len uint32) {
|
|
||||||
r0, _, _ := syscall.Syscall(procGetSecurityDescriptorLength.Addr(), 1, uintptr(sd), 0, 0)
|
|
||||||
len = uint32(r0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getFileInformationByHandleEx(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), 4, uintptr(h), uintptr(class), uintptr(unsafe.Pointer(buffer)), uintptr(size), 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func setFileInformationByHandle(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall6(procSetFileInformationByHandle.Addr(), 4, uintptr(h), uintptr(class), uintptr(unsafe.Pointer(buffer)), uintptr(size), 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) {
|
|
||||||
var _p0 uint32
|
|
||||||
if releaseAll {
|
|
||||||
_p0 = 1
|
|
||||||
} else {
|
|
||||||
_p0 = 0
|
|
||||||
}
|
|
||||||
r0, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize)))
|
|
||||||
success = r0 != 0
|
|
||||||
if true {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func impersonateSelf(level uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procImpersonateSelf.Addr(), 1, uintptr(level), 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func revertToSelf() (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procRevertToSelf.Addr(), 0, 0, 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) {
|
|
||||||
var _p0 uint32
|
|
||||||
if openAsSelf {
|
|
||||||
_p0 = 1
|
|
||||||
} else {
|
|
||||||
_p0 = 0
|
|
||||||
}
|
|
||||||
r1, _, e1 := syscall.Syscall6(procOpenThreadToken.Addr(), 4, uintptr(thread), uintptr(accessMask), uintptr(_p0), uintptr(unsafe.Pointer(token)), 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getCurrentThread() (h syscall.Handle) {
|
|
||||||
r0, _, _ := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0)
|
|
||||||
h = syscall.Handle(r0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) {
|
|
||||||
var _p0 *uint16
|
|
||||||
_p0, err = syscall.UTF16PtrFromString(systemName)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var _p1 *uint16
|
|
||||||
_p1, err = syscall.UTF16PtrFromString(name)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return _lookupPrivilegeValue(_p0, _p1, luid)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _lookupPrivilegeValue(systemName *uint16, name *uint16, luid *uint64) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procLookupPrivilegeValueW.Addr(), 3, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid)))
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) {
|
|
||||||
var _p0 *uint16
|
|
||||||
_p0, err = syscall.UTF16PtrFromString(systemName)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return _lookupPrivilegeName(_p0, luid, buffer, size)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _lookupPrivilegeName(systemName *uint16, luid *uint64, buffer *uint16, size *uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall6(procLookupPrivilegeNameW.Addr(), 4, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) {
|
|
||||||
var _p0 *uint16
|
|
||||||
_p0, err = syscall.UTF16PtrFromString(systemName)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return _lookupPrivilegeDisplayName(_p0, name, buffer, size, languageId)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _lookupPrivilegeDisplayName(systemName *uint16, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall6(procLookupPrivilegeDisplayNameW.Addr(), 5, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(languageId)), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) {
|
|
||||||
var _p0 *byte
|
|
||||||
if len(b) > 0 {
|
|
||||||
_p0 = &b[0]
|
|
||||||
}
|
|
||||||
var _p1 uint32
|
|
||||||
if abort {
|
|
||||||
_p1 = 1
|
|
||||||
} else {
|
|
||||||
_p1 = 0
|
|
||||||
}
|
|
||||||
var _p2 uint32
|
|
||||||
if processSecurity {
|
|
||||||
_p2 = 1
|
|
||||||
} else {
|
|
||||||
_p2 = 0
|
|
||||||
}
|
|
||||||
r1, _, e1 := syscall.Syscall9(procBackupRead.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesRead)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) {
|
|
||||||
var _p0 *byte
|
|
||||||
if len(b) > 0 {
|
|
||||||
_p0 = &b[0]
|
|
||||||
}
|
|
||||||
var _p1 uint32
|
|
||||||
if abort {
|
|
||||||
_p1 = 1
|
|
||||||
} else {
|
|
||||||
_p1 = 0
|
|
||||||
}
|
|
||||||
var _p2 uint32
|
|
||||||
if processSecurity {
|
|
||||||
_p2 = 1
|
|
||||||
} else {
|
|
||||||
_p2 = 0
|
|
||||||
}
|
|
||||||
r1, _, e1 := syscall.Syscall9(procBackupWrite.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesWritten)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
if e1 != 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
} else {
|
|
||||||
err = syscall.EINVAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
202
vendor/github.com/docker/distribution/LICENSE
generated
vendored
202
vendor/github.com/docker/distribution/LICENSE
generated
vendored
@ -1,202 +0,0 @@
|
|||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "{}"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright {yyyy} {name of copyright owner}
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
247
vendor/github.com/docker/distribution/digestset/set.go
generated
vendored
247
vendor/github.com/docker/distribution/digestset/set.go
generated
vendored
@ -1,247 +0,0 @@
|
|||||||
package digestset
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
digest "github.com/opencontainers/go-digest"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// ErrDigestNotFound is used when a matching digest
|
|
||||||
// could not be found in a set.
|
|
||||||
ErrDigestNotFound = errors.New("digest not found")
|
|
||||||
|
|
||||||
// ErrDigestAmbiguous is used when multiple digests
|
|
||||||
// are found in a set. None of the matching digests
|
|
||||||
// should be considered valid matches.
|
|
||||||
ErrDigestAmbiguous = errors.New("ambiguous digest string")
|
|
||||||
)
|
|
||||||
|
|
||||||
// Set is used to hold a unique set of digests which
|
|
||||||
// may be easily referenced by easily referenced by a string
|
|
||||||
// representation of the digest as well as short representation.
|
|
||||||
// The uniqueness of the short representation is based on other
|
|
||||||
// digests in the set. If digests are omitted from this set,
|
|
||||||
// collisions in a larger set may not be detected, therefore it
|
|
||||||
// is important to always do short representation lookups on
|
|
||||||
// the complete set of digests. To mitigate collisions, an
|
|
||||||
// appropriately long short code should be used.
|
|
||||||
type Set struct {
|
|
||||||
mutex sync.RWMutex
|
|
||||||
entries digestEntries
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewSet creates an empty set of digests
|
|
||||||
// which may have digests added.
|
|
||||||
func NewSet() *Set {
|
|
||||||
return &Set{
|
|
||||||
entries: digestEntries{},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkShortMatch checks whether two digests match as either whole
|
|
||||||
// values or short values. This function does not test equality,
|
|
||||||
// rather whether the second value could match against the first
|
|
||||||
// value.
|
|
||||||
func checkShortMatch(alg digest.Algorithm, hex, shortAlg, shortHex string) bool {
|
|
||||||
if len(hex) == len(shortHex) {
|
|
||||||
if hex != shortHex {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if len(shortAlg) > 0 && string(alg) != shortAlg {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
} else if !strings.HasPrefix(hex, shortHex) {
|
|
||||||
return false
|
|
||||||
} else if len(shortAlg) > 0 && string(alg) != shortAlg {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lookup looks for a digest matching the given string representation.
|
|
||||||
// If no digests could be found ErrDigestNotFound will be returned
|
|
||||||
// with an empty digest value. If multiple matches are found
|
|
||||||
// ErrDigestAmbiguous will be returned with an empty digest value.
|
|
||||||
func (dst *Set) Lookup(d string) (digest.Digest, error) {
|
|
||||||
dst.mutex.RLock()
|
|
||||||
defer dst.mutex.RUnlock()
|
|
||||||
if len(dst.entries) == 0 {
|
|
||||||
return "", ErrDigestNotFound
|
|
||||||
}
|
|
||||||
var (
|
|
||||||
searchFunc func(int) bool
|
|
||||||
alg digest.Algorithm
|
|
||||||
hex string
|
|
||||||
)
|
|
||||||
dgst, err := digest.Parse(d)
|
|
||||||
if err == digest.ErrDigestInvalidFormat {
|
|
||||||
hex = d
|
|
||||||
searchFunc = func(i int) bool {
|
|
||||||
return dst.entries[i].val >= d
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
hex = dgst.Hex()
|
|
||||||
alg = dgst.Algorithm()
|
|
||||||
searchFunc = func(i int) bool {
|
|
||||||
if dst.entries[i].val == hex {
|
|
||||||
return dst.entries[i].alg >= alg
|
|
||||||
}
|
|
||||||
return dst.entries[i].val >= hex
|
|
||||||
}
|
|
||||||
}
|
|
||||||
idx := sort.Search(len(dst.entries), searchFunc)
|
|
||||||
if idx == len(dst.entries) || !checkShortMatch(dst.entries[idx].alg, dst.entries[idx].val, string(alg), hex) {
|
|
||||||
return "", ErrDigestNotFound
|
|
||||||
}
|
|
||||||
if dst.entries[idx].alg == alg && dst.entries[idx].val == hex {
|
|
||||||
return dst.entries[idx].digest, nil
|
|
||||||
}
|
|
||||||
if idx+1 < len(dst.entries) && checkShortMatch(dst.entries[idx+1].alg, dst.entries[idx+1].val, string(alg), hex) {
|
|
||||||
return "", ErrDigestAmbiguous
|
|
||||||
}
|
|
||||||
|
|
||||||
return dst.entries[idx].digest, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add adds the given digest to the set. An error will be returned
|
|
||||||
// if the given digest is invalid. If the digest already exists in the
|
|
||||||
// set, this operation will be a no-op.
|
|
||||||
func (dst *Set) Add(d digest.Digest) error {
|
|
||||||
if err := d.Validate(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
dst.mutex.Lock()
|
|
||||||
defer dst.mutex.Unlock()
|
|
||||||
entry := &digestEntry{alg: d.Algorithm(), val: d.Hex(), digest: d}
|
|
||||||
searchFunc := func(i int) bool {
|
|
||||||
if dst.entries[i].val == entry.val {
|
|
||||||
return dst.entries[i].alg >= entry.alg
|
|
||||||
}
|
|
||||||
return dst.entries[i].val >= entry.val
|
|
||||||
}
|
|
||||||
idx := sort.Search(len(dst.entries), searchFunc)
|
|
||||||
if idx == len(dst.entries) {
|
|
||||||
dst.entries = append(dst.entries, entry)
|
|
||||||
return nil
|
|
||||||
} else if dst.entries[idx].digest == d {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
entries := append(dst.entries, nil)
|
|
||||||
copy(entries[idx+1:], entries[idx:len(entries)-1])
|
|
||||||
entries[idx] = entry
|
|
||||||
dst.entries = entries
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove removes the given digest from the set. An err will be
|
|
||||||
// returned if the given digest is invalid. If the digest does
|
|
||||||
// not exist in the set, this operation will be a no-op.
|
|
||||||
func (dst *Set) Remove(d digest.Digest) error {
|
|
||||||
if err := d.Validate(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
dst.mutex.Lock()
|
|
||||||
defer dst.mutex.Unlock()
|
|
||||||
entry := &digestEntry{alg: d.Algorithm(), val: d.Hex(), digest: d}
|
|
||||||
searchFunc := func(i int) bool {
|
|
||||||
if dst.entries[i].val == entry.val {
|
|
||||||
return dst.entries[i].alg >= entry.alg
|
|
||||||
}
|
|
||||||
return dst.entries[i].val >= entry.val
|
|
||||||
}
|
|
||||||
idx := sort.Search(len(dst.entries), searchFunc)
|
|
||||||
// Not found if idx is after or value at idx is not digest
|
|
||||||
if idx == len(dst.entries) || dst.entries[idx].digest != d {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
entries := dst.entries
|
|
||||||
copy(entries[idx:], entries[idx+1:])
|
|
||||||
entries = entries[:len(entries)-1]
|
|
||||||
dst.entries = entries
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// All returns all the digests in the set
|
|
||||||
func (dst *Set) All() []digest.Digest {
|
|
||||||
dst.mutex.RLock()
|
|
||||||
defer dst.mutex.RUnlock()
|
|
||||||
retValues := make([]digest.Digest, len(dst.entries))
|
|
||||||
for i := range dst.entries {
|
|
||||||
retValues[i] = dst.entries[i].digest
|
|
||||||
}
|
|
||||||
|
|
||||||
return retValues
|
|
||||||
}
|
|
||||||
|
|
||||||
// ShortCodeTable returns a map of Digest to unique short codes. The
|
|
||||||
// length represents the minimum value, the maximum length may be the
|
|
||||||
// entire value of digest if uniqueness cannot be achieved without the
|
|
||||||
// full value. This function will attempt to make short codes as short
|
|
||||||
// as possible to be unique.
|
|
||||||
func ShortCodeTable(dst *Set, length int) map[digest.Digest]string {
|
|
||||||
dst.mutex.RLock()
|
|
||||||
defer dst.mutex.RUnlock()
|
|
||||||
m := make(map[digest.Digest]string, len(dst.entries))
|
|
||||||
l := length
|
|
||||||
resetIdx := 0
|
|
||||||
for i := 0; i < len(dst.entries); i++ {
|
|
||||||
var short string
|
|
||||||
extended := true
|
|
||||||
for extended {
|
|
||||||
extended = false
|
|
||||||
if len(dst.entries[i].val) <= l {
|
|
||||||
short = dst.entries[i].digest.String()
|
|
||||||
} else {
|
|
||||||
short = dst.entries[i].val[:l]
|
|
||||||
for j := i + 1; j < len(dst.entries); j++ {
|
|
||||||
if checkShortMatch(dst.entries[j].alg, dst.entries[j].val, "", short) {
|
|
||||||
if j > resetIdx {
|
|
||||||
resetIdx = j
|
|
||||||
}
|
|
||||||
extended = true
|
|
||||||
} else {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if extended {
|
|
||||||
l++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m[dst.entries[i].digest] = short
|
|
||||||
if i >= resetIdx {
|
|
||||||
l = length
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
type digestEntry struct {
|
|
||||||
alg digest.Algorithm
|
|
||||||
val string
|
|
||||||
digest digest.Digest
|
|
||||||
}
|
|
||||||
|
|
||||||
type digestEntries []*digestEntry
|
|
||||||
|
|
||||||
func (d digestEntries) Len() int {
|
|
||||||
return len(d)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d digestEntries) Less(i, j int) bool {
|
|
||||||
if d[i].val != d[j].val {
|
|
||||||
return d[i].val < d[j].val
|
|
||||||
}
|
|
||||||
return d[i].alg < d[j].alg
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d digestEntries) Swap(i, j int) {
|
|
||||||
d[i], d[j] = d[j], d[i]
|
|
||||||
}
|
|
42
vendor/github.com/docker/distribution/reference/helpers.go
generated
vendored
42
vendor/github.com/docker/distribution/reference/helpers.go
generated
vendored
@ -1,42 +0,0 @@
|
|||||||
package reference
|
|
||||||
|
|
||||||
import "path"
|
|
||||||
|
|
||||||
// IsNameOnly returns true if reference only contains a repo name.
|
|
||||||
func IsNameOnly(ref Named) bool {
|
|
||||||
if _, ok := ref.(NamedTagged); ok {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if _, ok := ref.(Canonical); ok {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// FamiliarName returns the familiar name string
|
|
||||||
// for the given named, familiarizing if needed.
|
|
||||||
func FamiliarName(ref Named) string {
|
|
||||||
if nn, ok := ref.(normalizedNamed); ok {
|
|
||||||
return nn.Familiar().Name()
|
|
||||||
}
|
|
||||||
return ref.Name()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FamiliarString returns the familiar string representation
|
|
||||||
// for the given reference, familiarizing if needed.
|
|
||||||
func FamiliarString(ref Reference) string {
|
|
||||||
if nn, ok := ref.(normalizedNamed); ok {
|
|
||||||
return nn.Familiar().String()
|
|
||||||
}
|
|
||||||
return ref.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FamiliarMatch reports whether ref matches the specified pattern.
|
|
||||||
// See https://godoc.org/path#Match for supported patterns.
|
|
||||||
func FamiliarMatch(pattern string, ref Reference) (bool, error) {
|
|
||||||
matched, err := path.Match(pattern, FamiliarString(ref))
|
|
||||||
if namedRef, isNamed := ref.(Named); isNamed && !matched {
|
|
||||||
matched, _ = path.Match(pattern, FamiliarName(namedRef))
|
|
||||||
}
|
|
||||||
return matched, err
|
|
||||||
}
|
|
170
vendor/github.com/docker/distribution/reference/normalize.go
generated
vendored
170
vendor/github.com/docker/distribution/reference/normalize.go
generated
vendored
@ -1,170 +0,0 @@
|
|||||||
package reference
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/docker/distribution/digestset"
|
|
||||||
"github.com/opencontainers/go-digest"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
legacyDefaultDomain = "index.docker.io"
|
|
||||||
defaultDomain = "docker.io"
|
|
||||||
officialRepoName = "library"
|
|
||||||
defaultTag = "latest"
|
|
||||||
)
|
|
||||||
|
|
||||||
// normalizedNamed represents a name which has been
|
|
||||||
// normalized and has a familiar form. A familiar name
|
|
||||||
// is what is used in Docker UI. An example normalized
|
|
||||||
// name is "docker.io/library/ubuntu" and corresponding
|
|
||||||
// familiar name of "ubuntu".
|
|
||||||
type normalizedNamed interface {
|
|
||||||
Named
|
|
||||||
Familiar() Named
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseNormalizedNamed parses a string into a named reference
|
|
||||||
// transforming a familiar name from Docker UI to a fully
|
|
||||||
// qualified reference. If the value may be an identifier
|
|
||||||
// use ParseAnyReference.
|
|
||||||
func ParseNormalizedNamed(s string) (Named, error) {
|
|
||||||
if ok := anchoredIdentifierRegexp.MatchString(s); ok {
|
|
||||||
return nil, fmt.Errorf("invalid repository name (%s), cannot specify 64-byte hexadecimal strings", s)
|
|
||||||
}
|
|
||||||
domain, remainder := splitDockerDomain(s)
|
|
||||||
var remoteName string
|
|
||||||
if tagSep := strings.IndexRune(remainder, ':'); tagSep > -1 {
|
|
||||||
remoteName = remainder[:tagSep]
|
|
||||||
} else {
|
|
||||||
remoteName = remainder
|
|
||||||
}
|
|
||||||
if strings.ToLower(remoteName) != remoteName {
|
|
||||||
return nil, errors.New("invalid reference format: repository name must be lowercase")
|
|
||||||
}
|
|
||||||
|
|
||||||
ref, err := Parse(domain + "/" + remainder)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
named, isNamed := ref.(Named)
|
|
||||||
if !isNamed {
|
|
||||||
return nil, fmt.Errorf("reference %s has no name", ref.String())
|
|
||||||
}
|
|
||||||
return named, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// splitDockerDomain splits a repository name to domain and remotename string.
|
|
||||||
// If no valid domain is found, the default domain is used. Repository name
|
|
||||||
// needs to be already validated before.
|
|
||||||
func splitDockerDomain(name string) (domain, remainder string) {
|
|
||||||
i := strings.IndexRune(name, '/')
|
|
||||||
if i == -1 || (!strings.ContainsAny(name[:i], ".:") && name[:i] != "localhost") {
|
|
||||||
domain, remainder = defaultDomain, name
|
|
||||||
} else {
|
|
||||||
domain, remainder = name[:i], name[i+1:]
|
|
||||||
}
|
|
||||||
if domain == legacyDefaultDomain {
|
|
||||||
domain = defaultDomain
|
|
||||||
}
|
|
||||||
if domain == defaultDomain && !strings.ContainsRune(remainder, '/') {
|
|
||||||
remainder = officialRepoName + "/" + remainder
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// familiarizeName returns a shortened version of the name familiar
|
|
||||||
// to to the Docker UI. Familiar names have the default domain
|
|
||||||
// "docker.io" and "library/" repository prefix removed.
|
|
||||||
// For example, "docker.io/library/redis" will have the familiar
|
|
||||||
// name "redis" and "docker.io/dmcgowan/myapp" will be "dmcgowan/myapp".
|
|
||||||
// Returns a familiarized named only reference.
|
|
||||||
func familiarizeName(named namedRepository) repository {
|
|
||||||
repo := repository{
|
|
||||||
domain: named.Domain(),
|
|
||||||
path: named.Path(),
|
|
||||||
}
|
|
||||||
|
|
||||||
if repo.domain == defaultDomain {
|
|
||||||
repo.domain = ""
|
|
||||||
// Handle official repositories which have the pattern "library/<official repo name>"
|
|
||||||
if split := strings.Split(repo.path, "/"); len(split) == 2 && split[0] == officialRepoName {
|
|
||||||
repo.path = split[1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return repo
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r reference) Familiar() Named {
|
|
||||||
return reference{
|
|
||||||
namedRepository: familiarizeName(r.namedRepository),
|
|
||||||
tag: r.tag,
|
|
||||||
digest: r.digest,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r repository) Familiar() Named {
|
|
||||||
return familiarizeName(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t taggedReference) Familiar() Named {
|
|
||||||
return taggedReference{
|
|
||||||
namedRepository: familiarizeName(t.namedRepository),
|
|
||||||
tag: t.tag,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c canonicalReference) Familiar() Named {
|
|
||||||
return canonicalReference{
|
|
||||||
namedRepository: familiarizeName(c.namedRepository),
|
|
||||||
digest: c.digest,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TagNameOnly adds the default tag "latest" to a reference if it only has
|
|
||||||
// a repo name.
|
|
||||||
func TagNameOnly(ref Named) Named {
|
|
||||||
if IsNameOnly(ref) {
|
|
||||||
namedTagged, err := WithTag(ref, defaultTag)
|
|
||||||
if err != nil {
|
|
||||||
// Default tag must be valid, to create a NamedTagged
|
|
||||||
// type with non-validated input the WithTag function
|
|
||||||
// should be used instead
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return namedTagged
|
|
||||||
}
|
|
||||||
return ref
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseAnyReference parses a reference string as a possible identifier,
|
|
||||||
// full digest, or familiar name.
|
|
||||||
func ParseAnyReference(ref string) (Reference, error) {
|
|
||||||
if ok := anchoredIdentifierRegexp.MatchString(ref); ok {
|
|
||||||
return digestReference("sha256:" + ref), nil
|
|
||||||
}
|
|
||||||
if dgst, err := digest.Parse(ref); err == nil {
|
|
||||||
return digestReference(dgst), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return ParseNormalizedNamed(ref)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseAnyReferenceWithSet parses a reference string as a possible short
|
|
||||||
// identifier to be matched in a digest set, a full digest, or familiar name.
|
|
||||||
func ParseAnyReferenceWithSet(ref string, ds *digestset.Set) (Reference, error) {
|
|
||||||
if ok := anchoredShortIdentifierRegexp.MatchString(ref); ok {
|
|
||||||
dgst, err := ds.Lookup(ref)
|
|
||||||
if err == nil {
|
|
||||||
return digestReference(dgst), nil
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if dgst, err := digest.Parse(ref); err == nil {
|
|
||||||
return digestReference(dgst), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ParseNormalizedNamed(ref)
|
|
||||||
}
|
|
433
vendor/github.com/docker/distribution/reference/reference.go
generated
vendored
433
vendor/github.com/docker/distribution/reference/reference.go
generated
vendored
@ -1,433 +0,0 @@
|
|||||||
// Package reference provides a general type to represent any way of referencing images within the registry.
|
|
||||||
// Its main purpose is to abstract tags and digests (content-addressable hash).
|
|
||||||
//
|
|
||||||
// Grammar
|
|
||||||
//
|
|
||||||
// reference := name [ ":" tag ] [ "@" digest ]
|
|
||||||
// name := [domain '/'] path-component ['/' path-component]*
|
|
||||||
// domain := domain-component ['.' domain-component]* [':' port-number]
|
|
||||||
// domain-component := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/
|
|
||||||
// port-number := /[0-9]+/
|
|
||||||
// path-component := alpha-numeric [separator alpha-numeric]*
|
|
||||||
// alpha-numeric := /[a-z0-9]+/
|
|
||||||
// separator := /[_.]|__|[-]*/
|
|
||||||
//
|
|
||||||
// tag := /[\w][\w.-]{0,127}/
|
|
||||||
//
|
|
||||||
// digest := digest-algorithm ":" digest-hex
|
|
||||||
// digest-algorithm := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ]*
|
|
||||||
// digest-algorithm-separator := /[+.-_]/
|
|
||||||
// digest-algorithm-component := /[A-Za-z][A-Za-z0-9]*/
|
|
||||||
// digest-hex := /[0-9a-fA-F]{32,}/ ; At least 128 bit digest value
|
|
||||||
//
|
|
||||||
// identifier := /[a-f0-9]{64}/
|
|
||||||
// short-identifier := /[a-f0-9]{6,64}/
|
|
||||||
package reference
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/opencontainers/go-digest"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// NameTotalLengthMax is the maximum total number of characters in a repository name.
|
|
||||||
NameTotalLengthMax = 255
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// ErrReferenceInvalidFormat represents an error while trying to parse a string as a reference.
|
|
||||||
ErrReferenceInvalidFormat = errors.New("invalid reference format")
|
|
||||||
|
|
||||||
// ErrTagInvalidFormat represents an error while trying to parse a string as a tag.
|
|
||||||
ErrTagInvalidFormat = errors.New("invalid tag format")
|
|
||||||
|
|
||||||
// ErrDigestInvalidFormat represents an error while trying to parse a string as a tag.
|
|
||||||
ErrDigestInvalidFormat = errors.New("invalid digest format")
|
|
||||||
|
|
||||||
// ErrNameContainsUppercase is returned for invalid repository names that contain uppercase characters.
|
|
||||||
ErrNameContainsUppercase = errors.New("repository name must be lowercase")
|
|
||||||
|
|
||||||
// ErrNameEmpty is returned for empty, invalid repository names.
|
|
||||||
ErrNameEmpty = errors.New("repository name must have at least one component")
|
|
||||||
|
|
||||||
// ErrNameTooLong is returned when a repository name is longer than NameTotalLengthMax.
|
|
||||||
ErrNameTooLong = fmt.Errorf("repository name must not be more than %v characters", NameTotalLengthMax)
|
|
||||||
|
|
||||||
// ErrNameNotCanonical is returned when a name is not canonical.
|
|
||||||
ErrNameNotCanonical = errors.New("repository name must be canonical")
|
|
||||||
)
|
|
||||||
|
|
||||||
// Reference is an opaque object reference identifier that may include
|
|
||||||
// modifiers such as a hostname, name, tag, and digest.
|
|
||||||
type Reference interface {
|
|
||||||
// String returns the full reference
|
|
||||||
String() string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field provides a wrapper type for resolving correct reference types when
|
|
||||||
// working with encoding.
|
|
||||||
type Field struct {
|
|
||||||
reference Reference
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsField wraps a reference in a Field for encoding.
|
|
||||||
func AsField(reference Reference) Field {
|
|
||||||
return Field{reference}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reference unwraps the reference type from the field to
|
|
||||||
// return the Reference object. This object should be
|
|
||||||
// of the appropriate type to further check for different
|
|
||||||
// reference types.
|
|
||||||
func (f Field) Reference() Reference {
|
|
||||||
return f.reference
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalText serializes the field to byte text which
|
|
||||||
// is the string of the reference.
|
|
||||||
func (f Field) MarshalText() (p []byte, err error) {
|
|
||||||
return []byte(f.reference.String()), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalText parses text bytes by invoking the
|
|
||||||
// reference parser to ensure the appropriately
|
|
||||||
// typed reference object is wrapped by field.
|
|
||||||
func (f *Field) UnmarshalText(p []byte) error {
|
|
||||||
r, err := Parse(string(p))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
f.reference = r
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Named is an object with a full name
|
|
||||||
type Named interface {
|
|
||||||
Reference
|
|
||||||
Name() string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tagged is an object which has a tag
|
|
||||||
type Tagged interface {
|
|
||||||
Reference
|
|
||||||
Tag() string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NamedTagged is an object including a name and tag.
|
|
||||||
type NamedTagged interface {
|
|
||||||
Named
|
|
||||||
Tag() string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Digested is an object which has a digest
|
|
||||||
// in which it can be referenced by
|
|
||||||
type Digested interface {
|
|
||||||
Reference
|
|
||||||
Digest() digest.Digest
|
|
||||||
}
|
|
||||||
|
|
||||||
// Canonical reference is an object with a fully unique
|
|
||||||
// name including a name with domain and digest
|
|
||||||
type Canonical interface {
|
|
||||||
Named
|
|
||||||
Digest() digest.Digest
|
|
||||||
}
|
|
||||||
|
|
||||||
// namedRepository is a reference to a repository with a name.
|
|
||||||
// A namedRepository has both domain and path components.
|
|
||||||
type namedRepository interface {
|
|
||||||
Named
|
|
||||||
Domain() string
|
|
||||||
Path() string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Domain returns the domain part of the Named reference
|
|
||||||
func Domain(named Named) string {
|
|
||||||
if r, ok := named.(namedRepository); ok {
|
|
||||||
return r.Domain()
|
|
||||||
}
|
|
||||||
domain, _ := splitDomain(named.Name())
|
|
||||||
return domain
|
|
||||||
}
|
|
||||||
|
|
||||||
// Path returns the name without the domain part of the Named reference
|
|
||||||
func Path(named Named) (name string) {
|
|
||||||
if r, ok := named.(namedRepository); ok {
|
|
||||||
return r.Path()
|
|
||||||
}
|
|
||||||
_, path := splitDomain(named.Name())
|
|
||||||
return path
|
|
||||||
}
|
|
||||||
|
|
||||||
func splitDomain(name string) (string, string) {
|
|
||||||
match := anchoredNameRegexp.FindStringSubmatch(name)
|
|
||||||
if len(match) != 3 {
|
|
||||||
return "", name
|
|
||||||
}
|
|
||||||
return match[1], match[2]
|
|
||||||
}
|
|
||||||
|
|
||||||
// SplitHostname splits a named reference into a
|
|
||||||
// hostname and name string. If no valid hostname is
|
|
||||||
// found, the hostname is empty and the full value
|
|
||||||
// is returned as name
|
|
||||||
// DEPRECATED: Use Domain or Path
|
|
||||||
func SplitHostname(named Named) (string, string) {
|
|
||||||
if r, ok := named.(namedRepository); ok {
|
|
||||||
return r.Domain(), r.Path()
|
|
||||||
}
|
|
||||||
return splitDomain(named.Name())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse parses s and returns a syntactically valid Reference.
|
|
||||||
// If an error was encountered it is returned, along with a nil Reference.
|
|
||||||
// NOTE: Parse will not handle short digests.
|
|
||||||
func Parse(s string) (Reference, error) {
|
|
||||||
matches := ReferenceRegexp.FindStringSubmatch(s)
|
|
||||||
if matches == nil {
|
|
||||||
if s == "" {
|
|
||||||
return nil, ErrNameEmpty
|
|
||||||
}
|
|
||||||
if ReferenceRegexp.FindStringSubmatch(strings.ToLower(s)) != nil {
|
|
||||||
return nil, ErrNameContainsUppercase
|
|
||||||
}
|
|
||||||
return nil, ErrReferenceInvalidFormat
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(matches[1]) > NameTotalLengthMax {
|
|
||||||
return nil, ErrNameTooLong
|
|
||||||
}
|
|
||||||
|
|
||||||
var repo repository
|
|
||||||
|
|
||||||
nameMatch := anchoredNameRegexp.FindStringSubmatch(matches[1])
|
|
||||||
if nameMatch != nil && len(nameMatch) == 3 {
|
|
||||||
repo.domain = nameMatch[1]
|
|
||||||
repo.path = nameMatch[2]
|
|
||||||
} else {
|
|
||||||
repo.domain = ""
|
|
||||||
repo.path = matches[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
ref := reference{
|
|
||||||
namedRepository: repo,
|
|
||||||
tag: matches[2],
|
|
||||||
}
|
|
||||||
if matches[3] != "" {
|
|
||||||
var err error
|
|
||||||
ref.digest, err = digest.Parse(matches[3])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
r := getBestReferenceType(ref)
|
|
||||||
if r == nil {
|
|
||||||
return nil, ErrNameEmpty
|
|
||||||
}
|
|
||||||
|
|
||||||
return r, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseNamed parses s and returns a syntactically valid reference implementing
|
|
||||||
// the Named interface. The reference must have a name and be in the canonical
|
|
||||||
// form, otherwise an error is returned.
|
|
||||||
// If an error was encountered it is returned, along with a nil Reference.
|
|
||||||
// NOTE: ParseNamed will not handle short digests.
|
|
||||||
func ParseNamed(s string) (Named, error) {
|
|
||||||
named, err := ParseNormalizedNamed(s)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if named.String() != s {
|
|
||||||
return nil, ErrNameNotCanonical
|
|
||||||
}
|
|
||||||
return named, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithName returns a named object representing the given string. If the input
|
|
||||||
// is invalid ErrReferenceInvalidFormat will be returned.
|
|
||||||
func WithName(name string) (Named, error) {
|
|
||||||
if len(name) > NameTotalLengthMax {
|
|
||||||
return nil, ErrNameTooLong
|
|
||||||
}
|
|
||||||
|
|
||||||
match := anchoredNameRegexp.FindStringSubmatch(name)
|
|
||||||
if match == nil || len(match) != 3 {
|
|
||||||
return nil, ErrReferenceInvalidFormat
|
|
||||||
}
|
|
||||||
return repository{
|
|
||||||
domain: match[1],
|
|
||||||
path: match[2],
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithTag combines the name from "name" and the tag from "tag" to form a
|
|
||||||
// reference incorporating both the name and the tag.
|
|
||||||
func WithTag(name Named, tag string) (NamedTagged, error) {
|
|
||||||
if !anchoredTagRegexp.MatchString(tag) {
|
|
||||||
return nil, ErrTagInvalidFormat
|
|
||||||
}
|
|
||||||
var repo repository
|
|
||||||
if r, ok := name.(namedRepository); ok {
|
|
||||||
repo.domain = r.Domain()
|
|
||||||
repo.path = r.Path()
|
|
||||||
} else {
|
|
||||||
repo.path = name.Name()
|
|
||||||
}
|
|
||||||
if canonical, ok := name.(Canonical); ok {
|
|
||||||
return reference{
|
|
||||||
namedRepository: repo,
|
|
||||||
tag: tag,
|
|
||||||
digest: canonical.Digest(),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
return taggedReference{
|
|
||||||
namedRepository: repo,
|
|
||||||
tag: tag,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDigest combines the name from "name" and the digest from "digest" to form
|
|
||||||
// a reference incorporating both the name and the digest.
|
|
||||||
func WithDigest(name Named, digest digest.Digest) (Canonical, error) {
|
|
||||||
if !anchoredDigestRegexp.MatchString(digest.String()) {
|
|
||||||
return nil, ErrDigestInvalidFormat
|
|
||||||
}
|
|
||||||
var repo repository
|
|
||||||
if r, ok := name.(namedRepository); ok {
|
|
||||||
repo.domain = r.Domain()
|
|
||||||
repo.path = r.Path()
|
|
||||||
} else {
|
|
||||||
repo.path = name.Name()
|
|
||||||
}
|
|
||||||
if tagged, ok := name.(Tagged); ok {
|
|
||||||
return reference{
|
|
||||||
namedRepository: repo,
|
|
||||||
tag: tagged.Tag(),
|
|
||||||
digest: digest,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
return canonicalReference{
|
|
||||||
namedRepository: repo,
|
|
||||||
digest: digest,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TrimNamed removes any tag or digest from the named reference.
|
|
||||||
func TrimNamed(ref Named) Named {
|
|
||||||
domain, path := SplitHostname(ref)
|
|
||||||
return repository{
|
|
||||||
domain: domain,
|
|
||||||
path: path,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getBestReferenceType(ref reference) Reference {
|
|
||||||
if ref.Name() == "" {
|
|
||||||
// Allow digest only references
|
|
||||||
if ref.digest != "" {
|
|
||||||
return digestReference(ref.digest)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if ref.tag == "" {
|
|
||||||
if ref.digest != "" {
|
|
||||||
return canonicalReference{
|
|
||||||
namedRepository: ref.namedRepository,
|
|
||||||
digest: ref.digest,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ref.namedRepository
|
|
||||||
}
|
|
||||||
if ref.digest == "" {
|
|
||||||
return taggedReference{
|
|
||||||
namedRepository: ref.namedRepository,
|
|
||||||
tag: ref.tag,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ref
|
|
||||||
}
|
|
||||||
|
|
||||||
type reference struct {
|
|
||||||
namedRepository
|
|
||||||
tag string
|
|
||||||
digest digest.Digest
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r reference) String() string {
|
|
||||||
return r.Name() + ":" + r.tag + "@" + r.digest.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r reference) Tag() string {
|
|
||||||
return r.tag
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r reference) Digest() digest.Digest {
|
|
||||||
return r.digest
|
|
||||||
}
|
|
||||||
|
|
||||||
type repository struct {
|
|
||||||
domain string
|
|
||||||
path string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r repository) String() string {
|
|
||||||
return r.Name()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r repository) Name() string {
|
|
||||||
if r.domain == "" {
|
|
||||||
return r.path
|
|
||||||
}
|
|
||||||
return r.domain + "/" + r.path
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r repository) Domain() string {
|
|
||||||
return r.domain
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r repository) Path() string {
|
|
||||||
return r.path
|
|
||||||
}
|
|
||||||
|
|
||||||
type digestReference digest.Digest
|
|
||||||
|
|
||||||
func (d digestReference) String() string {
|
|
||||||
return digest.Digest(d).String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d digestReference) Digest() digest.Digest {
|
|
||||||
return digest.Digest(d)
|
|
||||||
}
|
|
||||||
|
|
||||||
type taggedReference struct {
|
|
||||||
namedRepository
|
|
||||||
tag string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t taggedReference) String() string {
|
|
||||||
return t.Name() + ":" + t.tag
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t taggedReference) Tag() string {
|
|
||||||
return t.tag
|
|
||||||
}
|
|
||||||
|
|
||||||
type canonicalReference struct {
|
|
||||||
namedRepository
|
|
||||||
digest digest.Digest
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c canonicalReference) String() string {
|
|
||||||
return c.Name() + "@" + c.digest.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c canonicalReference) Digest() digest.Digest {
|
|
||||||
return c.digest
|
|
||||||
}
|
|
143
vendor/github.com/docker/distribution/reference/regexp.go
generated
vendored
143
vendor/github.com/docker/distribution/reference/regexp.go
generated
vendored
@ -1,143 +0,0 @@
|
|||||||
package reference
|
|
||||||
|
|
||||||
import "regexp"
|
|
||||||
|
|
||||||
var (
|
|
||||||
// alphaNumericRegexp defines the alpha numeric atom, typically a
|
|
||||||
// component of names. This only allows lower case characters and digits.
|
|
||||||
alphaNumericRegexp = match(`[a-z0-9]+`)
|
|
||||||
|
|
||||||
// separatorRegexp defines the separators allowed to be embedded in name
|
|
||||||
// components. This allow one period, one or two underscore and multiple
|
|
||||||
// dashes.
|
|
||||||
separatorRegexp = match(`(?:[._]|__|[-]*)`)
|
|
||||||
|
|
||||||
// nameComponentRegexp restricts registry path component names to start
|
|
||||||
// with at least one letter or number, with following parts able to be
|
|
||||||
// separated by one period, one or two underscore and multiple dashes.
|
|
||||||
nameComponentRegexp = expression(
|
|
||||||
alphaNumericRegexp,
|
|
||||||
optional(repeated(separatorRegexp, alphaNumericRegexp)))
|
|
||||||
|
|
||||||
// domainComponentRegexp restricts the registry domain component of a
|
|
||||||
// repository name to start with a component as defined by DomainRegexp
|
|
||||||
// and followed by an optional port.
|
|
||||||
domainComponentRegexp = match(`(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])`)
|
|
||||||
|
|
||||||
// DomainRegexp defines the structure of potential domain components
|
|
||||||
// that may be part of image names. This is purposely a subset of what is
|
|
||||||
// allowed by DNS to ensure backwards compatibility with Docker image
|
|
||||||
// names.
|
|
||||||
DomainRegexp = expression(
|
|
||||||
domainComponentRegexp,
|
|
||||||
optional(repeated(literal(`.`), domainComponentRegexp)),
|
|
||||||
optional(literal(`:`), match(`[0-9]+`)))
|
|
||||||
|
|
||||||
// TagRegexp matches valid tag names. From docker/docker:graph/tags.go.
|
|
||||||
TagRegexp = match(`[\w][\w.-]{0,127}`)
|
|
||||||
|
|
||||||
// anchoredTagRegexp matches valid tag names, anchored at the start and
|
|
||||||
// end of the matched string.
|
|
||||||
anchoredTagRegexp = anchored(TagRegexp)
|
|
||||||
|
|
||||||
// DigestRegexp matches valid digests.
|
|
||||||
DigestRegexp = match(`[A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}`)
|
|
||||||
|
|
||||||
// anchoredDigestRegexp matches valid digests, anchored at the start and
|
|
||||||
// end of the matched string.
|
|
||||||
anchoredDigestRegexp = anchored(DigestRegexp)
|
|
||||||
|
|
||||||
// NameRegexp is the format for the name component of references. The
|
|
||||||
// regexp has capturing groups for the domain and name part omitting
|
|
||||||
// the separating forward slash from either.
|
|
||||||
NameRegexp = expression(
|
|
||||||
optional(DomainRegexp, literal(`/`)),
|
|
||||||
nameComponentRegexp,
|
|
||||||
optional(repeated(literal(`/`), nameComponentRegexp)))
|
|
||||||
|
|
||||||
// anchoredNameRegexp is used to parse a name value, capturing the
|
|
||||||
// domain and trailing components.
|
|
||||||
anchoredNameRegexp = anchored(
|
|
||||||
optional(capture(DomainRegexp), literal(`/`)),
|
|
||||||
capture(nameComponentRegexp,
|
|
||||||
optional(repeated(literal(`/`), nameComponentRegexp))))
|
|
||||||
|
|
||||||
// ReferenceRegexp is the full supported format of a reference. The regexp
|
|
||||||
// is anchored and has capturing groups for name, tag, and digest
|
|
||||||
// components.
|
|
||||||
ReferenceRegexp = anchored(capture(NameRegexp),
|
|
||||||
optional(literal(":"), capture(TagRegexp)),
|
|
||||||
optional(literal("@"), capture(DigestRegexp)))
|
|
||||||
|
|
||||||
// IdentifierRegexp is the format for string identifier used as a
|
|
||||||
// content addressable identifier using sha256. These identifiers
|
|
||||||
// are like digests without the algorithm, since sha256 is used.
|
|
||||||
IdentifierRegexp = match(`([a-f0-9]{64})`)
|
|
||||||
|
|
||||||
// ShortIdentifierRegexp is the format used to represent a prefix
|
|
||||||
// of an identifier. A prefix may be used to match a sha256 identifier
|
|
||||||
// within a list of trusted identifiers.
|
|
||||||
ShortIdentifierRegexp = match(`([a-f0-9]{6,64})`)
|
|
||||||
|
|
||||||
// anchoredIdentifierRegexp is used to check or match an
|
|
||||||
// identifier value, anchored at start and end of string.
|
|
||||||
anchoredIdentifierRegexp = anchored(IdentifierRegexp)
|
|
||||||
|
|
||||||
// anchoredShortIdentifierRegexp is used to check if a value
|
|
||||||
// is a possible identifier prefix, anchored at start and end
|
|
||||||
// of string.
|
|
||||||
anchoredShortIdentifierRegexp = anchored(ShortIdentifierRegexp)
|
|
||||||
)
|
|
||||||
|
|
||||||
// match compiles the string to a regular expression.
|
|
||||||
var match = regexp.MustCompile
|
|
||||||
|
|
||||||
// literal compiles s into a literal regular expression, escaping any regexp
|
|
||||||
// reserved characters.
|
|
||||||
func literal(s string) *regexp.Regexp {
|
|
||||||
re := match(regexp.QuoteMeta(s))
|
|
||||||
|
|
||||||
if _, complete := re.LiteralPrefix(); !complete {
|
|
||||||
panic("must be a literal")
|
|
||||||
}
|
|
||||||
|
|
||||||
return re
|
|
||||||
}
|
|
||||||
|
|
||||||
// expression defines a full expression, where each regular expression must
|
|
||||||
// follow the previous.
|
|
||||||
func expression(res ...*regexp.Regexp) *regexp.Regexp {
|
|
||||||
var s string
|
|
||||||
for _, re := range res {
|
|
||||||
s += re.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
return match(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// optional wraps the expression in a non-capturing group and makes the
|
|
||||||
// production optional.
|
|
||||||
func optional(res ...*regexp.Regexp) *regexp.Regexp {
|
|
||||||
return match(group(expression(res...)).String() + `?`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// repeated wraps the regexp in a non-capturing group to get one or more
|
|
||||||
// matches.
|
|
||||||
func repeated(res ...*regexp.Regexp) *regexp.Regexp {
|
|
||||||
return match(group(expression(res...)).String() + `+`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// group wraps the regexp in a non-capturing group.
|
|
||||||
func group(res ...*regexp.Regexp) *regexp.Regexp {
|
|
||||||
return match(`(?:` + expression(res...).String() + `)`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// capture wraps the expression in a capturing group.
|
|
||||||
func capture(res ...*regexp.Regexp) *regexp.Regexp {
|
|
||||||
return match(`(` + expression(res...).String() + `)`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// anchored anchors the regular expression by adding start and end delimiters.
|
|
||||||
func anchored(res ...*regexp.Regexp) *regexp.Regexp {
|
|
||||||
return match(`^` + expression(res...).String() + `$`)
|
|
||||||
}
|
|
191
vendor/github.com/docker/docker/LICENSE
generated
vendored
191
vendor/github.com/docker/docker/LICENSE
generated
vendored
@ -1,191 +0,0 @@
|
|||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
https://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Copyright 2013-2017 Docker, Inc.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
19
vendor/github.com/docker/docker/NOTICE
generated
vendored
19
vendor/github.com/docker/docker/NOTICE
generated
vendored
@ -1,19 +0,0 @@
|
|||||||
Docker
|
|
||||||
Copyright 2012-2017 Docker, Inc.
|
|
||||||
|
|
||||||
This product includes software developed at Docker, Inc. (https://www.docker.com).
|
|
||||||
|
|
||||||
This product contains software (https://github.com/kr/pty) developed
|
|
||||||
by Keith Rarick, licensed under the MIT License.
|
|
||||||
|
|
||||||
The following is courtesy of our legal counsel:
|
|
||||||
|
|
||||||
|
|
||||||
Use and transfer of Docker may be subject to certain restrictions by the
|
|
||||||
United States and other governments.
|
|
||||||
It is your responsibility to ensure that your use and/or transfer does not
|
|
||||||
violate applicable laws.
|
|
||||||
|
|
||||||
For more information, please see https://www.bis.doc.gov
|
|
||||||
|
|
||||||
See also https://www.apache.org/dev/crypto.html and/or seek legal counsel.
|
|
42
vendor/github.com/docker/docker/api/README.md
generated
vendored
42
vendor/github.com/docker/docker/api/README.md
generated
vendored
@ -1,42 +0,0 @@
|
|||||||
# Working on the Engine API
|
|
||||||
|
|
||||||
The Engine API is an HTTP API used by the command-line client to communicate with the daemon. It can also be used by third-party software to control the daemon.
|
|
||||||
|
|
||||||
It consists of various components in this repository:
|
|
||||||
|
|
||||||
- `api/swagger.yaml` A Swagger definition of the API.
|
|
||||||
- `api/types/` Types shared by both the client and server, representing various objects, options, responses, etc. Most are written manually, but some are automatically generated from the Swagger definition. See [#27919](https://github.com/docker/docker/issues/27919) for progress on this.
|
|
||||||
- `cli/` The command-line client.
|
|
||||||
- `client/` The Go client used by the command-line client. It can also be used by third-party Go programs.
|
|
||||||
- `daemon/` The daemon, which serves the API.
|
|
||||||
|
|
||||||
## Swagger definition
|
|
||||||
|
|
||||||
The API is defined by the [Swagger](http://swagger.io/specification/) definition in `api/swagger.yaml`. This definition can be used to:
|
|
||||||
|
|
||||||
1. Automatically generate documentation.
|
|
||||||
2. Automatically generate the Go server and client. (A work-in-progress.)
|
|
||||||
3. Provide a machine readable version of the API for introspecting what it can do, automatically generating clients for other languages, etc.
|
|
||||||
|
|
||||||
## Updating the API documentation
|
|
||||||
|
|
||||||
The API documentation is generated entirely from `api/swagger.yaml`. If you make updates to the API, edit this file to represent the change in the documentation.
|
|
||||||
|
|
||||||
The file is split into two main sections:
|
|
||||||
|
|
||||||
- `definitions`, which defines re-usable objects used in requests and responses
|
|
||||||
- `paths`, which defines the API endpoints (and some inline objects which don't need to be reusable)
|
|
||||||
|
|
||||||
To make an edit, first look for the endpoint you want to edit under `paths`, then make the required edits. Endpoints may reference reusable objects with `$ref`, which can be found in the `definitions` section.
|
|
||||||
|
|
||||||
There is hopefully enough example material in the file for you to copy a similar pattern from elsewhere in the file (e.g. adding new fields or endpoints), but for the full reference, see the [Swagger specification](https://github.com/docker/docker/issues/27919).
|
|
||||||
|
|
||||||
`swagger.yaml` is validated by `hack/validate/swagger` to ensure it is a valid Swagger definition. This is useful when making edits to ensure you are doing the right thing.
|
|
||||||
|
|
||||||
## Viewing the API documentation
|
|
||||||
|
|
||||||
When you make edits to `swagger.yaml`, you may want to check the generated API documentation to ensure it renders correctly.
|
|
||||||
|
|
||||||
Run `make swagger-docs` and a preview will be running at `http://localhost`. Some of the styling may be incorrect, but you'll be able to ensure that it is generating the correct documentation.
|
|
||||||
|
|
||||||
The production documentation is generated by vendoring `swagger.yaml` into [docker/docker.github.io](https://github.com/docker/docker.github.io).
|
|
11
vendor/github.com/docker/docker/api/common.go
generated
vendored
11
vendor/github.com/docker/docker/api/common.go
generated
vendored
@ -1,11 +0,0 @@
|
|||||||
package api // import "github.com/docker/docker/api"
|
|
||||||
|
|
||||||
// Common constants for daemon and client.
|
|
||||||
const (
|
|
||||||
// DefaultVersion of Current REST API
|
|
||||||
DefaultVersion = "1.38"
|
|
||||||
|
|
||||||
// NoBaseImageSpecifier is the symbol used by the FROM
|
|
||||||
// command to specify that no base image is to be used.
|
|
||||||
NoBaseImageSpecifier = "scratch"
|
|
||||||
)
|
|
6
vendor/github.com/docker/docker/api/common_unix.go
generated
vendored
6
vendor/github.com/docker/docker/api/common_unix.go
generated
vendored
@ -1,6 +0,0 @@
|
|||||||
// +build !windows
|
|
||||||
|
|
||||||
package api // import "github.com/docker/docker/api"
|
|
||||||
|
|
||||||
// MinVersion represents Minimum REST API version supported
|
|
||||||
const MinVersion = "1.12"
|
|
8
vendor/github.com/docker/docker/api/common_windows.go
generated
vendored
8
vendor/github.com/docker/docker/api/common_windows.go
generated
vendored
@ -1,8 +0,0 @@
|
|||||||
package api // import "github.com/docker/docker/api"
|
|
||||||
|
|
||||||
// MinVersion represents Minimum REST API version supported
|
|
||||||
// Technically the first daemon API version released on Windows is v1.25 in
|
|
||||||
// engine version 1.13. However, some clients are explicitly using downlevel
|
|
||||||
// APIs (e.g. docker-compose v2.1 file format) and that is just too restrictive.
|
|
||||||
// Hence also allowing 1.24 on Windows.
|
|
||||||
const MinVersion string = "1.24"
|
|
12
vendor/github.com/docker/docker/api/swagger-gen.yaml
generated
vendored
12
vendor/github.com/docker/docker/api/swagger-gen.yaml
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
|
|
||||||
layout:
|
|
||||||
models:
|
|
||||||
- name: definition
|
|
||||||
source: asset:model
|
|
||||||
target: "{{ joinFilePath .Target .ModelPackage }}"
|
|
||||||
file_name: "{{ (snakize (pascalize .Name)) }}.go"
|
|
||||||
operations:
|
|
||||||
- name: handler
|
|
||||||
source: asset:serverOperation
|
|
||||||
target: "{{ joinFilePath .Target .APIPackage .Package }}"
|
|
||||||
file_name: "{{ (snakize (pascalize .Name)) }}.go"
|
|
10122
vendor/github.com/docker/docker/api/swagger.yaml
generated
vendored
10122
vendor/github.com/docker/docker/api/swagger.yaml
generated
vendored
File diff suppressed because it is too large
Load Diff
22
vendor/github.com/docker/docker/api/types/auth.go
generated
vendored
22
vendor/github.com/docker/docker/api/types/auth.go
generated
vendored
@ -1,22 +0,0 @@
|
|||||||
package types // import "github.com/docker/docker/api/types"
|
|
||||||
|
|
||||||
// AuthConfig contains authorization information for connecting to a Registry
|
|
||||||
type AuthConfig struct {
|
|
||||||
Username string `json:"username,omitempty"`
|
|
||||||
Password string `json:"password,omitempty"`
|
|
||||||
Auth string `json:"auth,omitempty"`
|
|
||||||
|
|
||||||
// Email is an optional value associated with the username.
|
|
||||||
// This field is deprecated and will be removed in a later
|
|
||||||
// version of docker.
|
|
||||||
Email string `json:"email,omitempty"`
|
|
||||||
|
|
||||||
ServerAddress string `json:"serveraddress,omitempty"`
|
|
||||||
|
|
||||||
// IdentityToken is used to authenticate the user and get
|
|
||||||
// an access token for the registry.
|
|
||||||
IdentityToken string `json:"identitytoken,omitempty"`
|
|
||||||
|
|
||||||
// RegistryToken is a bearer token to be sent to a registry
|
|
||||||
RegistryToken string `json:"registrytoken,omitempty"`
|
|
||||||
}
|
|
23
vendor/github.com/docker/docker/api/types/blkiodev/blkio.go
generated
vendored
23
vendor/github.com/docker/docker/api/types/blkiodev/blkio.go
generated
vendored
@ -1,23 +0,0 @@
|
|||||||
package blkiodev // import "github.com/docker/docker/api/types/blkiodev"
|
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
// WeightDevice is a structure that holds device:weight pair
|
|
||||||
type WeightDevice struct {
|
|
||||||
Path string
|
|
||||||
Weight uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *WeightDevice) String() string {
|
|
||||||
return fmt.Sprintf("%s:%d", w.Path, w.Weight)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ThrottleDevice is a structure that holds device:rate_per_second pair
|
|
||||||
type ThrottleDevice struct {
|
|
||||||
Path string
|
|
||||||
Rate uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *ThrottleDevice) String() string {
|
|
||||||
return fmt.Sprintf("%s:%d", t.Path, t.Rate)
|
|
||||||
}
|
|
390
vendor/github.com/docker/docker/api/types/client.go
generated
vendored
390
vendor/github.com/docker/docker/api/types/client.go
generated
vendored
@ -1,390 +0,0 @@
|
|||||||
package types // import "github.com/docker/docker/api/types"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"io"
|
|
||||||
"net"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/container"
|
|
||||||
"github.com/docker/docker/api/types/filters"
|
|
||||||
"github.com/docker/go-units"
|
|
||||||
)
|
|
||||||
|
|
||||||
// CheckpointCreateOptions holds parameters to create a checkpoint from a container
|
|
||||||
type CheckpointCreateOptions struct {
|
|
||||||
CheckpointID string
|
|
||||||
CheckpointDir string
|
|
||||||
Exit bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// CheckpointListOptions holds parameters to list checkpoints for a container
|
|
||||||
type CheckpointListOptions struct {
|
|
||||||
CheckpointDir string
|
|
||||||
}
|
|
||||||
|
|
||||||
// CheckpointDeleteOptions holds parameters to delete a checkpoint from a container
|
|
||||||
type CheckpointDeleteOptions struct {
|
|
||||||
CheckpointID string
|
|
||||||
CheckpointDir string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerAttachOptions holds parameters to attach to a container.
|
|
||||||
type ContainerAttachOptions struct {
|
|
||||||
Stream bool
|
|
||||||
Stdin bool
|
|
||||||
Stdout bool
|
|
||||||
Stderr bool
|
|
||||||
DetachKeys string
|
|
||||||
Logs bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerCommitOptions holds parameters to commit changes into a container.
|
|
||||||
type ContainerCommitOptions struct {
|
|
||||||
Reference string
|
|
||||||
Comment string
|
|
||||||
Author string
|
|
||||||
Changes []string
|
|
||||||
Pause bool
|
|
||||||
Config *container.Config
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerExecInspect holds information returned by exec inspect.
|
|
||||||
type ContainerExecInspect struct {
|
|
||||||
ExecID string
|
|
||||||
ContainerID string
|
|
||||||
Running bool
|
|
||||||
ExitCode int
|
|
||||||
Pid int
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerListOptions holds parameters to list containers with.
|
|
||||||
type ContainerListOptions struct {
|
|
||||||
Quiet bool
|
|
||||||
Size bool
|
|
||||||
All bool
|
|
||||||
Latest bool
|
|
||||||
Since string
|
|
||||||
Before string
|
|
||||||
Limit int
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerLogsOptions holds parameters to filter logs with.
|
|
||||||
type ContainerLogsOptions struct {
|
|
||||||
ShowStdout bool
|
|
||||||
ShowStderr bool
|
|
||||||
Since string
|
|
||||||
Until string
|
|
||||||
Timestamps bool
|
|
||||||
Follow bool
|
|
||||||
Tail string
|
|
||||||
Details bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerRemoveOptions holds parameters to remove containers.
|
|
||||||
type ContainerRemoveOptions struct {
|
|
||||||
RemoveVolumes bool
|
|
||||||
RemoveLinks bool
|
|
||||||
Force bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerStartOptions holds parameters to start containers.
|
|
||||||
type ContainerStartOptions struct {
|
|
||||||
CheckpointID string
|
|
||||||
CheckpointDir string
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyToContainerOptions holds information
|
|
||||||
// about files to copy into a container
|
|
||||||
type CopyToContainerOptions struct {
|
|
||||||
AllowOverwriteDirWithFile bool
|
|
||||||
CopyUIDGID bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// EventsOptions holds parameters to filter events with.
|
|
||||||
type EventsOptions struct {
|
|
||||||
Since string
|
|
||||||
Until string
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkListOptions holds parameters to filter the list of networks with.
|
|
||||||
type NetworkListOptions struct {
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// HijackedResponse holds connection information for a hijacked request.
|
|
||||||
type HijackedResponse struct {
|
|
||||||
Conn net.Conn
|
|
||||||
Reader *bufio.Reader
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close closes the hijacked connection and reader.
|
|
||||||
func (h *HijackedResponse) Close() {
|
|
||||||
h.Conn.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
// CloseWriter is an interface that implements structs
|
|
||||||
// that close input streams to prevent from writing.
|
|
||||||
type CloseWriter interface {
|
|
||||||
CloseWrite() error
|
|
||||||
}
|
|
||||||
|
|
||||||
// CloseWrite closes a readWriter for writing.
|
|
||||||
func (h *HijackedResponse) CloseWrite() error {
|
|
||||||
if conn, ok := h.Conn.(CloseWriter); ok {
|
|
||||||
return conn.CloseWrite()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageBuildOptions holds the information
|
|
||||||
// necessary to build images.
|
|
||||||
type ImageBuildOptions struct {
|
|
||||||
Tags []string
|
|
||||||
SuppressOutput bool
|
|
||||||
RemoteContext string
|
|
||||||
NoCache bool
|
|
||||||
Remove bool
|
|
||||||
ForceRemove bool
|
|
||||||
PullParent bool
|
|
||||||
Isolation container.Isolation
|
|
||||||
CPUSetCPUs string
|
|
||||||
CPUSetMems string
|
|
||||||
CPUShares int64
|
|
||||||
CPUQuota int64
|
|
||||||
CPUPeriod int64
|
|
||||||
Memory int64
|
|
||||||
MemorySwap int64
|
|
||||||
CgroupParent string
|
|
||||||
NetworkMode string
|
|
||||||
ShmSize int64
|
|
||||||
Dockerfile string
|
|
||||||
Ulimits []*units.Ulimit
|
|
||||||
// BuildArgs needs to be a *string instead of just a string so that
|
|
||||||
// we can tell the difference between "" (empty string) and no value
|
|
||||||
// at all (nil). See the parsing of buildArgs in
|
|
||||||
// api/server/router/build/build_routes.go for even more info.
|
|
||||||
BuildArgs map[string]*string
|
|
||||||
AuthConfigs map[string]AuthConfig
|
|
||||||
Context io.Reader
|
|
||||||
Labels map[string]string
|
|
||||||
// squash the resulting image's layers to the parent
|
|
||||||
// preserves the original image and creates a new one from the parent with all
|
|
||||||
// the changes applied to a single layer
|
|
||||||
Squash bool
|
|
||||||
// CacheFrom specifies images that are used for matching cache. Images
|
|
||||||
// specified here do not need to have a valid parent chain to match cache.
|
|
||||||
CacheFrom []string
|
|
||||||
SecurityOpt []string
|
|
||||||
ExtraHosts []string // List of extra hosts
|
|
||||||
Target string
|
|
||||||
SessionID string
|
|
||||||
Platform string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageBuildResponse holds information
|
|
||||||
// returned by a server after building
|
|
||||||
// an image.
|
|
||||||
type ImageBuildResponse struct {
|
|
||||||
Body io.ReadCloser
|
|
||||||
OSType string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageCreateOptions holds information to create images.
|
|
||||||
type ImageCreateOptions struct {
|
|
||||||
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry.
|
|
||||||
Platform string // Platform is the target platform of the image if it needs to be pulled from the registry.
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageImportSource holds source information for ImageImport
|
|
||||||
type ImageImportSource struct {
|
|
||||||
Source io.Reader // Source is the data to send to the server to create this image from. You must set SourceName to "-" to leverage this.
|
|
||||||
SourceName string // SourceName is the name of the image to pull. Set to "-" to leverage the Source attribute.
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageImportOptions holds information to import images from the client host.
|
|
||||||
type ImageImportOptions struct {
|
|
||||||
Tag string // Tag is the name to tag this image with. This attribute is deprecated.
|
|
||||||
Message string // Message is the message to tag the image with
|
|
||||||
Changes []string // Changes are the raw changes to apply to this image
|
|
||||||
Platform string // Platform is the target platform of the image
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageListOptions holds parameters to filter the list of images with.
|
|
||||||
type ImageListOptions struct {
|
|
||||||
All bool
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageLoadResponse returns information to the client about a load process.
|
|
||||||
type ImageLoadResponse struct {
|
|
||||||
// Body must be closed to avoid a resource leak
|
|
||||||
Body io.ReadCloser
|
|
||||||
JSON bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImagePullOptions holds information to pull images.
|
|
||||||
type ImagePullOptions struct {
|
|
||||||
All bool
|
|
||||||
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
|
||||||
PrivilegeFunc RequestPrivilegeFunc
|
|
||||||
Platform string
|
|
||||||
}
|
|
||||||
|
|
||||||
// RequestPrivilegeFunc is a function interface that
|
|
||||||
// clients can supply to retry operations after
|
|
||||||
// getting an authorization error.
|
|
||||||
// This function returns the registry authentication
|
|
||||||
// header value in base 64 format, or an error
|
|
||||||
// if the privilege request fails.
|
|
||||||
type RequestPrivilegeFunc func() (string, error)
|
|
||||||
|
|
||||||
//ImagePushOptions holds information to push images.
|
|
||||||
type ImagePushOptions ImagePullOptions
|
|
||||||
|
|
||||||
// ImageRemoveOptions holds parameters to remove images.
|
|
||||||
type ImageRemoveOptions struct {
|
|
||||||
Force bool
|
|
||||||
PruneChildren bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageSearchOptions holds parameters to search images with.
|
|
||||||
type ImageSearchOptions struct {
|
|
||||||
RegistryAuth string
|
|
||||||
PrivilegeFunc RequestPrivilegeFunc
|
|
||||||
Filters filters.Args
|
|
||||||
Limit int
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResizeOptions holds parameters to resize a tty.
|
|
||||||
// It can be used to resize container ttys and
|
|
||||||
// exec process ttys too.
|
|
||||||
type ResizeOptions struct {
|
|
||||||
Height uint
|
|
||||||
Width uint
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeListOptions holds parameters to list nodes with.
|
|
||||||
type NodeListOptions struct {
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeRemoveOptions holds parameters to remove nodes with.
|
|
||||||
type NodeRemoveOptions struct {
|
|
||||||
Force bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServiceCreateOptions contains the options to use when creating a service.
|
|
||||||
type ServiceCreateOptions struct {
|
|
||||||
// EncodedRegistryAuth is the encoded registry authorization credentials to
|
|
||||||
// use when updating the service.
|
|
||||||
//
|
|
||||||
// This field follows the format of the X-Registry-Auth header.
|
|
||||||
EncodedRegistryAuth string
|
|
||||||
|
|
||||||
// QueryRegistry indicates whether the service update requires
|
|
||||||
// contacting a registry. A registry may be contacted to retrieve
|
|
||||||
// the image digest and manifest, which in turn can be used to update
|
|
||||||
// platform or other information about the service.
|
|
||||||
QueryRegistry bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServiceCreateResponse contains the information returned to a client
|
|
||||||
// on the creation of a new service.
|
|
||||||
type ServiceCreateResponse struct {
|
|
||||||
// ID is the ID of the created service.
|
|
||||||
ID string
|
|
||||||
// Warnings is a set of non-fatal warning messages to pass on to the user.
|
|
||||||
Warnings []string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Values for RegistryAuthFrom in ServiceUpdateOptions
|
|
||||||
const (
|
|
||||||
RegistryAuthFromSpec = "spec"
|
|
||||||
RegistryAuthFromPreviousSpec = "previous-spec"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ServiceUpdateOptions contains the options to be used for updating services.
|
|
||||||
type ServiceUpdateOptions struct {
|
|
||||||
// EncodedRegistryAuth is the encoded registry authorization credentials to
|
|
||||||
// use when updating the service.
|
|
||||||
//
|
|
||||||
// This field follows the format of the X-Registry-Auth header.
|
|
||||||
EncodedRegistryAuth string
|
|
||||||
|
|
||||||
// TODO(stevvooe): Consider moving the version parameter of ServiceUpdate
|
|
||||||
// into this field. While it does open API users up to racy writes, most
|
|
||||||
// users may not need that level of consistency in practice.
|
|
||||||
|
|
||||||
// RegistryAuthFrom specifies where to find the registry authorization
|
|
||||||
// credentials if they are not given in EncodedRegistryAuth. Valid
|
|
||||||
// values are "spec" and "previous-spec".
|
|
||||||
RegistryAuthFrom string
|
|
||||||
|
|
||||||
// Rollback indicates whether a server-side rollback should be
|
|
||||||
// performed. When this is set, the provided spec will be ignored.
|
|
||||||
// The valid values are "previous" and "none". An empty value is the
|
|
||||||
// same as "none".
|
|
||||||
Rollback string
|
|
||||||
|
|
||||||
// QueryRegistry indicates whether the service update requires
|
|
||||||
// contacting a registry. A registry may be contacted to retrieve
|
|
||||||
// the image digest and manifest, which in turn can be used to update
|
|
||||||
// platform or other information about the service.
|
|
||||||
QueryRegistry bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServiceListOptions holds parameters to list services with.
|
|
||||||
type ServiceListOptions struct {
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServiceInspectOptions holds parameters related to the "service inspect"
|
|
||||||
// operation.
|
|
||||||
type ServiceInspectOptions struct {
|
|
||||||
InsertDefaults bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskListOptions holds parameters to list tasks with.
|
|
||||||
type TaskListOptions struct {
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginRemoveOptions holds parameters to remove plugins.
|
|
||||||
type PluginRemoveOptions struct {
|
|
||||||
Force bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginEnableOptions holds parameters to enable plugins.
|
|
||||||
type PluginEnableOptions struct {
|
|
||||||
Timeout int
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginDisableOptions holds parameters to disable plugins.
|
|
||||||
type PluginDisableOptions struct {
|
|
||||||
Force bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginInstallOptions holds parameters to install a plugin.
|
|
||||||
type PluginInstallOptions struct {
|
|
||||||
Disabled bool
|
|
||||||
AcceptAllPermissions bool
|
|
||||||
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
|
||||||
RemoteRef string // RemoteRef is the plugin name on the registry
|
|
||||||
PrivilegeFunc RequestPrivilegeFunc
|
|
||||||
AcceptPermissionsFunc func(PluginPrivileges) (bool, error)
|
|
||||||
Args []string
|
|
||||||
}
|
|
||||||
|
|
||||||
// SwarmUnlockKeyResponse contains the response for Engine API:
|
|
||||||
// GET /swarm/unlockkey
|
|
||||||
type SwarmUnlockKeyResponse struct {
|
|
||||||
// UnlockKey is the unlock key in ASCII-armored format.
|
|
||||||
UnlockKey string
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginCreateOptions hold all options to plugin create.
|
|
||||||
type PluginCreateOptions struct {
|
|
||||||
RepoName string
|
|
||||||
}
|
|
57
vendor/github.com/docker/docker/api/types/configs.go
generated
vendored
57
vendor/github.com/docker/docker/api/types/configs.go
generated
vendored
@ -1,57 +0,0 @@
|
|||||||
package types // import "github.com/docker/docker/api/types"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/docker/docker/api/types/container"
|
|
||||||
"github.com/docker/docker/api/types/network"
|
|
||||||
)
|
|
||||||
|
|
||||||
// configs holds structs used for internal communication between the
|
|
||||||
// frontend (such as an http server) and the backend (such as the
|
|
||||||
// docker daemon).
|
|
||||||
|
|
||||||
// ContainerCreateConfig is the parameter set to ContainerCreate()
|
|
||||||
type ContainerCreateConfig struct {
|
|
||||||
Name string
|
|
||||||
Config *container.Config
|
|
||||||
HostConfig *container.HostConfig
|
|
||||||
NetworkingConfig *network.NetworkingConfig
|
|
||||||
AdjustCPUShares bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerRmConfig holds arguments for the container remove
|
|
||||||
// operation. This struct is used to tell the backend what operations
|
|
||||||
// to perform.
|
|
||||||
type ContainerRmConfig struct {
|
|
||||||
ForceRemove, RemoveVolume, RemoveLink bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExecConfig is a small subset of the Config struct that holds the configuration
|
|
||||||
// for the exec feature of docker.
|
|
||||||
type ExecConfig struct {
|
|
||||||
User string // User that will run the command
|
|
||||||
Privileged bool // Is the container in privileged mode
|
|
||||||
Tty bool // Attach standard streams to a tty.
|
|
||||||
AttachStdin bool // Attach the standard input, makes possible user interaction
|
|
||||||
AttachStderr bool // Attach the standard error
|
|
||||||
AttachStdout bool // Attach the standard output
|
|
||||||
Detach bool // Execute in detach mode
|
|
||||||
DetachKeys string // Escape keys for detach
|
|
||||||
Env []string // Environment variables
|
|
||||||
WorkingDir string // Working directory
|
|
||||||
Cmd []string // Execution commands and args
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginRmConfig holds arguments for plugin remove.
|
|
||||||
type PluginRmConfig struct {
|
|
||||||
ForceRemove bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginEnableConfig holds arguments for plugin enable
|
|
||||||
type PluginEnableConfig struct {
|
|
||||||
Timeout int
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginDisableConfig holds arguments for plugin disable.
|
|
||||||
type PluginDisableConfig struct {
|
|
||||||
ForceDisable bool
|
|
||||||
}
|
|
69
vendor/github.com/docker/docker/api/types/container/config.go
generated
vendored
69
vendor/github.com/docker/docker/api/types/container/config.go
generated
vendored
@ -1,69 +0,0 @@
|
|||||||
package container // import "github.com/docker/docker/api/types/container"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/strslice"
|
|
||||||
"github.com/docker/go-connections/nat"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MinimumDuration puts a minimum on user configured duration.
|
|
||||||
// This is to prevent API error on time unit. For example, API may
|
|
||||||
// set 3 as healthcheck interval with intention of 3 seconds, but
|
|
||||||
// Docker interprets it as 3 nanoseconds.
|
|
||||||
const MinimumDuration = 1 * time.Millisecond
|
|
||||||
|
|
||||||
// HealthConfig holds configuration settings for the HEALTHCHECK feature.
|
|
||||||
type HealthConfig struct {
|
|
||||||
// Test is the test to perform to check that the container is healthy.
|
|
||||||
// An empty slice means to inherit the default.
|
|
||||||
// The options are:
|
|
||||||
// {} : inherit healthcheck
|
|
||||||
// {"NONE"} : disable healthcheck
|
|
||||||
// {"CMD", args...} : exec arguments directly
|
|
||||||
// {"CMD-SHELL", command} : run command with system's default shell
|
|
||||||
Test []string `json:",omitempty"`
|
|
||||||
|
|
||||||
// Zero means to inherit. Durations are expressed as integer nanoseconds.
|
|
||||||
Interval time.Duration `json:",omitempty"` // Interval is the time to wait between checks.
|
|
||||||
Timeout time.Duration `json:",omitempty"` // Timeout is the time to wait before considering the check to have hung.
|
|
||||||
StartPeriod time.Duration `json:",omitempty"` // The start period for the container to initialize before the retries starts to count down.
|
|
||||||
|
|
||||||
// Retries is the number of consecutive failures needed to consider a container as unhealthy.
|
|
||||||
// Zero means inherit.
|
|
||||||
Retries int `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Config contains the configuration data about a container.
|
|
||||||
// It should hold only portable information about the container.
|
|
||||||
// Here, "portable" means "independent from the host we are running on".
|
|
||||||
// Non-portable information *should* appear in HostConfig.
|
|
||||||
// All fields added to this struct must be marked `omitempty` to keep getting
|
|
||||||
// predictable hashes from the old `v1Compatibility` configuration.
|
|
||||||
type Config struct {
|
|
||||||
Hostname string // Hostname
|
|
||||||
Domainname string // Domainname
|
|
||||||
User string // User that will run the command(s) inside the container, also support user:group
|
|
||||||
AttachStdin bool // Attach the standard input, makes possible user interaction
|
|
||||||
AttachStdout bool // Attach the standard output
|
|
||||||
AttachStderr bool // Attach the standard error
|
|
||||||
ExposedPorts nat.PortSet `json:",omitempty"` // List of exposed ports
|
|
||||||
Tty bool // Attach standard streams to a tty, including stdin if it is not closed.
|
|
||||||
OpenStdin bool // Open stdin
|
|
||||||
StdinOnce bool // If true, close stdin after the 1 attached client disconnects.
|
|
||||||
Env []string // List of environment variable to set in the container
|
|
||||||
Cmd strslice.StrSlice // Command to run when starting the container
|
|
||||||
Healthcheck *HealthConfig `json:",omitempty"` // Healthcheck describes how to check the container is healthy
|
|
||||||
ArgsEscaped bool `json:",omitempty"` // True if command is already escaped (Windows specific)
|
|
||||||
Image string // Name of the image as it was passed by the operator (e.g. could be symbolic)
|
|
||||||
Volumes map[string]struct{} // List of volumes (mounts) used for the container
|
|
||||||
WorkingDir string // Current directory (PWD) in the command will be launched
|
|
||||||
Entrypoint strslice.StrSlice // Entrypoint to run when starting the container
|
|
||||||
NetworkDisabled bool `json:",omitempty"` // Is network disabled
|
|
||||||
MacAddress string `json:",omitempty"` // Mac Address of the container
|
|
||||||
OnBuild []string // ONBUILD metadata that were defined on the image Dockerfile
|
|
||||||
Labels map[string]string // List of labels set to this container
|
|
||||||
StopSignal string `json:",omitempty"` // Signal to stop a container
|
|
||||||
StopTimeout *int `json:",omitempty"` // Timeout (in seconds) to stop a container
|
|
||||||
Shell strslice.StrSlice `json:",omitempty"` // Shell for shell-form of RUN, CMD, ENTRYPOINT
|
|
||||||
}
|
|
21
vendor/github.com/docker/docker/api/types/container/container_changes.go
generated
vendored
21
vendor/github.com/docker/docker/api/types/container/container_changes.go
generated
vendored
@ -1,21 +0,0 @@
|
|||||||
package container
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// DO NOT EDIT THIS FILE
|
|
||||||
// This file was generated by `swagger generate operation`
|
|
||||||
//
|
|
||||||
// See hack/generate-swagger-api.sh
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// ContainerChangeResponseItem change item in response to ContainerChanges operation
|
|
||||||
// swagger:model ContainerChangeResponseItem
|
|
||||||
type ContainerChangeResponseItem struct {
|
|
||||||
|
|
||||||
// Kind of change
|
|
||||||
// Required: true
|
|
||||||
Kind uint8 `json:"Kind"`
|
|
||||||
|
|
||||||
// Path to file that has changed
|
|
||||||
// Required: true
|
|
||||||
Path string `json:"Path"`
|
|
||||||
}
|
|
21
vendor/github.com/docker/docker/api/types/container/container_create.go
generated
vendored
21
vendor/github.com/docker/docker/api/types/container/container_create.go
generated
vendored
@ -1,21 +0,0 @@
|
|||||||
package container
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// DO NOT EDIT THIS FILE
|
|
||||||
// This file was generated by `swagger generate operation`
|
|
||||||
//
|
|
||||||
// See hack/generate-swagger-api.sh
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// ContainerCreateCreatedBody OK response to ContainerCreate operation
|
|
||||||
// swagger:model ContainerCreateCreatedBody
|
|
||||||
type ContainerCreateCreatedBody struct {
|
|
||||||
|
|
||||||
// The ID of the created container
|
|
||||||
// Required: true
|
|
||||||
ID string `json:"Id"`
|
|
||||||
|
|
||||||
// Warnings encountered when creating the container
|
|
||||||
// Required: true
|
|
||||||
Warnings []string `json:"Warnings"`
|
|
||||||
}
|
|
21
vendor/github.com/docker/docker/api/types/container/container_top.go
generated
vendored
21
vendor/github.com/docker/docker/api/types/container/container_top.go
generated
vendored
@ -1,21 +0,0 @@
|
|||||||
package container
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// DO NOT EDIT THIS FILE
|
|
||||||
// This file was generated by `swagger generate operation`
|
|
||||||
//
|
|
||||||
// See hack/generate-swagger-api.sh
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// ContainerTopOKBody OK response to ContainerTop operation
|
|
||||||
// swagger:model ContainerTopOKBody
|
|
||||||
type ContainerTopOKBody struct {
|
|
||||||
|
|
||||||
// Each process running in the container, where each is process is an array of values corresponding to the titles
|
|
||||||
// Required: true
|
|
||||||
Processes [][]string `json:"Processes"`
|
|
||||||
|
|
||||||
// The ps column titles
|
|
||||||
// Required: true
|
|
||||||
Titles []string `json:"Titles"`
|
|
||||||
}
|
|
17
vendor/github.com/docker/docker/api/types/container/container_update.go
generated
vendored
17
vendor/github.com/docker/docker/api/types/container/container_update.go
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
package container
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// DO NOT EDIT THIS FILE
|
|
||||||
// This file was generated by `swagger generate operation`
|
|
||||||
//
|
|
||||||
// See hack/generate-swagger-api.sh
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// ContainerUpdateOKBody OK response to ContainerUpdate operation
|
|
||||||
// swagger:model ContainerUpdateOKBody
|
|
||||||
type ContainerUpdateOKBody struct {
|
|
||||||
|
|
||||||
// warnings
|
|
||||||
// Required: true
|
|
||||||
Warnings []string `json:"Warnings"`
|
|
||||||
}
|
|
29
vendor/github.com/docker/docker/api/types/container/container_wait.go
generated
vendored
29
vendor/github.com/docker/docker/api/types/container/container_wait.go
generated
vendored
@ -1,29 +0,0 @@
|
|||||||
package container
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// DO NOT EDIT THIS FILE
|
|
||||||
// This file was generated by `swagger generate operation`
|
|
||||||
//
|
|
||||||
// See hack/generate-swagger-api.sh
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// ContainerWaitOKBodyError container waiting error, if any
|
|
||||||
// swagger:model ContainerWaitOKBodyError
|
|
||||||
type ContainerWaitOKBodyError struct {
|
|
||||||
|
|
||||||
// Details of an error
|
|
||||||
Message string `json:"Message,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerWaitOKBody OK response to ContainerWait operation
|
|
||||||
// swagger:model ContainerWaitOKBody
|
|
||||||
type ContainerWaitOKBody struct {
|
|
||||||
|
|
||||||
// error
|
|
||||||
// Required: true
|
|
||||||
Error *ContainerWaitOKBodyError `json:"Error"`
|
|
||||||
|
|
||||||
// Exit code of the container
|
|
||||||
// Required: true
|
|
||||||
StatusCode int64 `json:"StatusCode"`
|
|
||||||
}
|
|
406
vendor/github.com/docker/docker/api/types/container/host_config.go
generated
vendored
406
vendor/github.com/docker/docker/api/types/container/host_config.go
generated
vendored
@ -1,406 +0,0 @@
|
|||||||
package container // import "github.com/docker/docker/api/types/container"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/blkiodev"
|
|
||||||
"github.com/docker/docker/api/types/mount"
|
|
||||||
"github.com/docker/docker/api/types/strslice"
|
|
||||||
"github.com/docker/go-connections/nat"
|
|
||||||
"github.com/docker/go-units"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Isolation represents the isolation technology of a container. The supported
|
|
||||||
// values are platform specific
|
|
||||||
type Isolation string
|
|
||||||
|
|
||||||
// IsDefault indicates the default isolation technology of a container. On Linux this
|
|
||||||
// is the native driver. On Windows, this is a Windows Server Container.
|
|
||||||
func (i Isolation) IsDefault() bool {
|
|
||||||
return strings.ToLower(string(i)) == "default" || string(i) == ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsHyperV indicates the use of a Hyper-V partition for isolation
|
|
||||||
func (i Isolation) IsHyperV() bool {
|
|
||||||
return strings.ToLower(string(i)) == "hyperv"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsProcess indicates the use of process isolation
|
|
||||||
func (i Isolation) IsProcess() bool {
|
|
||||||
return strings.ToLower(string(i)) == "process"
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
// IsolationEmpty is unspecified (same behavior as default)
|
|
||||||
IsolationEmpty = Isolation("")
|
|
||||||
// IsolationDefault is the default isolation mode on current daemon
|
|
||||||
IsolationDefault = Isolation("default")
|
|
||||||
// IsolationProcess is process isolation mode
|
|
||||||
IsolationProcess = Isolation("process")
|
|
||||||
// IsolationHyperV is HyperV isolation mode
|
|
||||||
IsolationHyperV = Isolation("hyperv")
|
|
||||||
)
|
|
||||||
|
|
||||||
// IpcMode represents the container ipc stack.
|
|
||||||
type IpcMode string
|
|
||||||
|
|
||||||
// IsPrivate indicates whether the container uses its own private ipc namespace which can not be shared.
|
|
||||||
func (n IpcMode) IsPrivate() bool {
|
|
||||||
return n == "private"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsHost indicates whether the container shares the host's ipc namespace.
|
|
||||||
func (n IpcMode) IsHost() bool {
|
|
||||||
return n == "host"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsShareable indicates whether the container's ipc namespace can be shared with another container.
|
|
||||||
func (n IpcMode) IsShareable() bool {
|
|
||||||
return n == "shareable"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsContainer indicates whether the container uses another container's ipc namespace.
|
|
||||||
func (n IpcMode) IsContainer() bool {
|
|
||||||
parts := strings.SplitN(string(n), ":", 2)
|
|
||||||
return len(parts) > 1 && parts[0] == "container"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsNone indicates whether container IpcMode is set to "none".
|
|
||||||
func (n IpcMode) IsNone() bool {
|
|
||||||
return n == "none"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsEmpty indicates whether container IpcMode is empty
|
|
||||||
func (n IpcMode) IsEmpty() bool {
|
|
||||||
return n == ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Valid indicates whether the ipc mode is valid.
|
|
||||||
func (n IpcMode) Valid() bool {
|
|
||||||
return n.IsEmpty() || n.IsNone() || n.IsPrivate() || n.IsHost() || n.IsShareable() || n.IsContainer()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Container returns the name of the container ipc stack is going to be used.
|
|
||||||
func (n IpcMode) Container() string {
|
|
||||||
parts := strings.SplitN(string(n), ":", 2)
|
|
||||||
if len(parts) > 1 && parts[0] == "container" {
|
|
||||||
return parts[1]
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkMode represents the container network stack.
|
|
||||||
type NetworkMode string
|
|
||||||
|
|
||||||
// IsNone indicates whether container isn't using a network stack.
|
|
||||||
func (n NetworkMode) IsNone() bool {
|
|
||||||
return n == "none"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsDefault indicates whether container uses the default network stack.
|
|
||||||
func (n NetworkMode) IsDefault() bool {
|
|
||||||
return n == "default"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsPrivate indicates whether container uses its private network stack.
|
|
||||||
func (n NetworkMode) IsPrivate() bool {
|
|
||||||
return !(n.IsHost() || n.IsContainer())
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsContainer indicates whether container uses a container network stack.
|
|
||||||
func (n NetworkMode) IsContainer() bool {
|
|
||||||
parts := strings.SplitN(string(n), ":", 2)
|
|
||||||
return len(parts) > 1 && parts[0] == "container"
|
|
||||||
}
|
|
||||||
|
|
||||||
// ConnectedContainer is the id of the container which network this container is connected to.
|
|
||||||
func (n NetworkMode) ConnectedContainer() string {
|
|
||||||
parts := strings.SplitN(string(n), ":", 2)
|
|
||||||
if len(parts) > 1 {
|
|
||||||
return parts[1]
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
//UserDefined indicates user-created network
|
|
||||||
func (n NetworkMode) UserDefined() string {
|
|
||||||
if n.IsUserDefined() {
|
|
||||||
return string(n)
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// UsernsMode represents userns mode in the container.
|
|
||||||
type UsernsMode string
|
|
||||||
|
|
||||||
// IsHost indicates whether the container uses the host's userns.
|
|
||||||
func (n UsernsMode) IsHost() bool {
|
|
||||||
return n == "host"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsPrivate indicates whether the container uses the a private userns.
|
|
||||||
func (n UsernsMode) IsPrivate() bool {
|
|
||||||
return !(n.IsHost())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Valid indicates whether the userns is valid.
|
|
||||||
func (n UsernsMode) Valid() bool {
|
|
||||||
parts := strings.Split(string(n), ":")
|
|
||||||
switch mode := parts[0]; mode {
|
|
||||||
case "", "host":
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// CgroupSpec represents the cgroup to use for the container.
|
|
||||||
type CgroupSpec string
|
|
||||||
|
|
||||||
// IsContainer indicates whether the container is using another container cgroup
|
|
||||||
func (c CgroupSpec) IsContainer() bool {
|
|
||||||
parts := strings.SplitN(string(c), ":", 2)
|
|
||||||
return len(parts) > 1 && parts[0] == "container"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Valid indicates whether the cgroup spec is valid.
|
|
||||||
func (c CgroupSpec) Valid() bool {
|
|
||||||
return c.IsContainer() || c == ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Container returns the name of the container whose cgroup will be used.
|
|
||||||
func (c CgroupSpec) Container() string {
|
|
||||||
parts := strings.SplitN(string(c), ":", 2)
|
|
||||||
if len(parts) > 1 {
|
|
||||||
return parts[1]
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// UTSMode represents the UTS namespace of the container.
|
|
||||||
type UTSMode string
|
|
||||||
|
|
||||||
// IsPrivate indicates whether the container uses its private UTS namespace.
|
|
||||||
func (n UTSMode) IsPrivate() bool {
|
|
||||||
return !(n.IsHost())
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsHost indicates whether the container uses the host's UTS namespace.
|
|
||||||
func (n UTSMode) IsHost() bool {
|
|
||||||
return n == "host"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Valid indicates whether the UTS namespace is valid.
|
|
||||||
func (n UTSMode) Valid() bool {
|
|
||||||
parts := strings.Split(string(n), ":")
|
|
||||||
switch mode := parts[0]; mode {
|
|
||||||
case "", "host":
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// PidMode represents the pid namespace of the container.
|
|
||||||
type PidMode string
|
|
||||||
|
|
||||||
// IsPrivate indicates whether the container uses its own new pid namespace.
|
|
||||||
func (n PidMode) IsPrivate() bool {
|
|
||||||
return !(n.IsHost() || n.IsContainer())
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsHost indicates whether the container uses the host's pid namespace.
|
|
||||||
func (n PidMode) IsHost() bool {
|
|
||||||
return n == "host"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsContainer indicates whether the container uses a container's pid namespace.
|
|
||||||
func (n PidMode) IsContainer() bool {
|
|
||||||
parts := strings.SplitN(string(n), ":", 2)
|
|
||||||
return len(parts) > 1 && parts[0] == "container"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Valid indicates whether the pid namespace is valid.
|
|
||||||
func (n PidMode) Valid() bool {
|
|
||||||
parts := strings.Split(string(n), ":")
|
|
||||||
switch mode := parts[0]; mode {
|
|
||||||
case "", "host":
|
|
||||||
case "container":
|
|
||||||
if len(parts) != 2 || parts[1] == "" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Container returns the name of the container whose pid namespace is going to be used.
|
|
||||||
func (n PidMode) Container() string {
|
|
||||||
parts := strings.SplitN(string(n), ":", 2)
|
|
||||||
if len(parts) > 1 {
|
|
||||||
return parts[1]
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeviceMapping represents the device mapping between the host and the container.
|
|
||||||
type DeviceMapping struct {
|
|
||||||
PathOnHost string
|
|
||||||
PathInContainer string
|
|
||||||
CgroupPermissions string
|
|
||||||
}
|
|
||||||
|
|
||||||
// RestartPolicy represents the restart policies of the container.
|
|
||||||
type RestartPolicy struct {
|
|
||||||
Name string
|
|
||||||
MaximumRetryCount int
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsNone indicates whether the container has the "no" restart policy.
|
|
||||||
// This means the container will not automatically restart when exiting.
|
|
||||||
func (rp *RestartPolicy) IsNone() bool {
|
|
||||||
return rp.Name == "no" || rp.Name == ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsAlways indicates whether the container has the "always" restart policy.
|
|
||||||
// This means the container will automatically restart regardless of the exit status.
|
|
||||||
func (rp *RestartPolicy) IsAlways() bool {
|
|
||||||
return rp.Name == "always"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsOnFailure indicates whether the container has the "on-failure" restart policy.
|
|
||||||
// This means the container will automatically restart of exiting with a non-zero exit status.
|
|
||||||
func (rp *RestartPolicy) IsOnFailure() bool {
|
|
||||||
return rp.Name == "on-failure"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsUnlessStopped indicates whether the container has the
|
|
||||||
// "unless-stopped" restart policy. This means the container will
|
|
||||||
// automatically restart unless user has put it to stopped state.
|
|
||||||
func (rp *RestartPolicy) IsUnlessStopped() bool {
|
|
||||||
return rp.Name == "unless-stopped"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsSame compares two RestartPolicy to see if they are the same
|
|
||||||
func (rp *RestartPolicy) IsSame(tp *RestartPolicy) bool {
|
|
||||||
return rp.Name == tp.Name && rp.MaximumRetryCount == tp.MaximumRetryCount
|
|
||||||
}
|
|
||||||
|
|
||||||
// LogMode is a type to define the available modes for logging
|
|
||||||
// These modes affect how logs are handled when log messages start piling up.
|
|
||||||
type LogMode string
|
|
||||||
|
|
||||||
// Available logging modes
|
|
||||||
const (
|
|
||||||
LogModeUnset = ""
|
|
||||||
LogModeBlocking LogMode = "blocking"
|
|
||||||
LogModeNonBlock LogMode = "non-blocking"
|
|
||||||
)
|
|
||||||
|
|
||||||
// LogConfig represents the logging configuration of the container.
|
|
||||||
type LogConfig struct {
|
|
||||||
Type string
|
|
||||||
Config map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resources contains container's resources (cgroups config, ulimits...)
|
|
||||||
type Resources struct {
|
|
||||||
// Applicable to all platforms
|
|
||||||
CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers)
|
|
||||||
Memory int64 // Memory limit (in bytes)
|
|
||||||
NanoCPUs int64 `json:"NanoCpus"` // CPU quota in units of 10<sup>-9</sup> CPUs.
|
|
||||||
|
|
||||||
// Applicable to UNIX platforms
|
|
||||||
CgroupParent string // Parent cgroup.
|
|
||||||
BlkioWeight uint16 // Block IO weight (relative weight vs. other containers)
|
|
||||||
BlkioWeightDevice []*blkiodev.WeightDevice
|
|
||||||
BlkioDeviceReadBps []*blkiodev.ThrottleDevice
|
|
||||||
BlkioDeviceWriteBps []*blkiodev.ThrottleDevice
|
|
||||||
BlkioDeviceReadIOps []*blkiodev.ThrottleDevice
|
|
||||||
BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice
|
|
||||||
CPUPeriod int64 `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period
|
|
||||||
CPUQuota int64 `json:"CpuQuota"` // CPU CFS (Completely Fair Scheduler) quota
|
|
||||||
CPURealtimePeriod int64 `json:"CpuRealtimePeriod"` // CPU real-time period
|
|
||||||
CPURealtimeRuntime int64 `json:"CpuRealtimeRuntime"` // CPU real-time runtime
|
|
||||||
CpusetCpus string // CpusetCpus 0-2, 0,1
|
|
||||||
CpusetMems string // CpusetMems 0-2, 0,1
|
|
||||||
Devices []DeviceMapping // List of devices to map inside the container
|
|
||||||
DeviceCgroupRules []string // List of rule to be added to the device cgroup
|
|
||||||
DiskQuota int64 // Disk limit (in bytes)
|
|
||||||
KernelMemory int64 // Kernel memory limit (in bytes)
|
|
||||||
MemoryReservation int64 // Memory soft limit (in bytes)
|
|
||||||
MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap
|
|
||||||
MemorySwappiness *int64 // Tuning container memory swappiness behaviour
|
|
||||||
OomKillDisable *bool // Whether to disable OOM Killer or not
|
|
||||||
PidsLimit int64 // Setting pids limit for a container
|
|
||||||
Ulimits []*units.Ulimit // List of ulimits to be set in the container
|
|
||||||
|
|
||||||
// Applicable to Windows
|
|
||||||
CPUCount int64 `json:"CpuCount"` // CPU count
|
|
||||||
CPUPercent int64 `json:"CpuPercent"` // CPU percent
|
|
||||||
IOMaximumIOps uint64 // Maximum IOps for the container system drive
|
|
||||||
IOMaximumBandwidth uint64 // Maximum IO in bytes per second for the container system drive
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateConfig holds the mutable attributes of a Container.
|
|
||||||
// Those attributes can be updated at runtime.
|
|
||||||
type UpdateConfig struct {
|
|
||||||
// Contains container's resources (cgroups, ulimits)
|
|
||||||
Resources
|
|
||||||
RestartPolicy RestartPolicy
|
|
||||||
}
|
|
||||||
|
|
||||||
// HostConfig the non-portable Config structure of a container.
|
|
||||||
// Here, "non-portable" means "dependent of the host we are running on".
|
|
||||||
// Portable information *should* appear in Config.
|
|
||||||
type HostConfig struct {
|
|
||||||
// Applicable to all platforms
|
|
||||||
Binds []string // List of volume bindings for this container
|
|
||||||
ContainerIDFile string // File (path) where the containerId is written
|
|
||||||
LogConfig LogConfig // Configuration of the logs for this container
|
|
||||||
NetworkMode NetworkMode // Network mode to use for the container
|
|
||||||
PortBindings nat.PortMap // Port mapping between the exposed port (container) and the host
|
|
||||||
RestartPolicy RestartPolicy // Restart policy to be used for the container
|
|
||||||
AutoRemove bool // Automatically remove container when it exits
|
|
||||||
VolumeDriver string // Name of the volume driver used to mount volumes
|
|
||||||
VolumesFrom []string // List of volumes to take from other container
|
|
||||||
|
|
||||||
// Applicable to UNIX platforms
|
|
||||||
CapAdd strslice.StrSlice // List of kernel capabilities to add to the container
|
|
||||||
CapDrop strslice.StrSlice // List of kernel capabilities to remove from the container
|
|
||||||
DNS []string `json:"Dns"` // List of DNS server to lookup
|
|
||||||
DNSOptions []string `json:"DnsOptions"` // List of DNSOption to look for
|
|
||||||
DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for
|
|
||||||
ExtraHosts []string // List of extra hosts
|
|
||||||
GroupAdd []string // List of additional groups that the container process will run as
|
|
||||||
IpcMode IpcMode // IPC namespace to use for the container
|
|
||||||
Cgroup CgroupSpec // Cgroup to use for the container
|
|
||||||
Links []string // List of links (in the name:alias form)
|
|
||||||
OomScoreAdj int // Container preference for OOM-killing
|
|
||||||
PidMode PidMode // PID namespace to use for the container
|
|
||||||
Privileged bool // Is the container in privileged mode
|
|
||||||
PublishAllPorts bool // Should docker publish all exposed port for the container
|
|
||||||
ReadonlyRootfs bool // Is the container root filesystem in read-only
|
|
||||||
SecurityOpt []string // List of string values to customize labels for MLS systems, such as SELinux.
|
|
||||||
StorageOpt map[string]string `json:",omitempty"` // Storage driver options per container.
|
|
||||||
Tmpfs map[string]string `json:",omitempty"` // List of tmpfs (mounts) used for the container
|
|
||||||
UTSMode UTSMode // UTS namespace to use for the container
|
|
||||||
UsernsMode UsernsMode // The user namespace to use for the container
|
|
||||||
ShmSize int64 // Total shm memory usage
|
|
||||||
Sysctls map[string]string `json:",omitempty"` // List of Namespaced sysctls used for the container
|
|
||||||
Runtime string `json:",omitempty"` // Runtime to use with this container
|
|
||||||
|
|
||||||
// Applicable to Windows
|
|
||||||
ConsoleSize [2]uint // Initial console size (height,width)
|
|
||||||
Isolation Isolation // Isolation technology of the container (e.g. default, hyperv)
|
|
||||||
|
|
||||||
// Contains container's resources (cgroups, ulimits)
|
|
||||||
Resources
|
|
||||||
|
|
||||||
// Mounts specs used by the container
|
|
||||||
Mounts []mount.Mount `json:",omitempty"`
|
|
||||||
|
|
||||||
// Run a custom init inside the container, if null, use the daemon's configured settings
|
|
||||||
Init *bool `json:",omitempty"`
|
|
||||||
}
|
|
41
vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go
generated
vendored
41
vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go
generated
vendored
@ -1,41 +0,0 @@
|
|||||||
// +build !windows
|
|
||||||
|
|
||||||
package container // import "github.com/docker/docker/api/types/container"
|
|
||||||
|
|
||||||
// IsValid indicates if an isolation technology is valid
|
|
||||||
func (i Isolation) IsValid() bool {
|
|
||||||
return i.IsDefault()
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkName returns the name of the network stack.
|
|
||||||
func (n NetworkMode) NetworkName() string {
|
|
||||||
if n.IsBridge() {
|
|
||||||
return "bridge"
|
|
||||||
} else if n.IsHost() {
|
|
||||||
return "host"
|
|
||||||
} else if n.IsContainer() {
|
|
||||||
return "container"
|
|
||||||
} else if n.IsNone() {
|
|
||||||
return "none"
|
|
||||||
} else if n.IsDefault() {
|
|
||||||
return "default"
|
|
||||||
} else if n.IsUserDefined() {
|
|
||||||
return n.UserDefined()
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsBridge indicates whether container uses the bridge network stack
|
|
||||||
func (n NetworkMode) IsBridge() bool {
|
|
||||||
return n == "bridge"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsHost indicates whether container uses the host network stack.
|
|
||||||
func (n NetworkMode) IsHost() bool {
|
|
||||||
return n == "host"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsUserDefined indicates user-created network
|
|
||||||
func (n NetworkMode) IsUserDefined() bool {
|
|
||||||
return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer()
|
|
||||||
}
|
|
40
vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go
generated
vendored
40
vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go
generated
vendored
@ -1,40 +0,0 @@
|
|||||||
package container // import "github.com/docker/docker/api/types/container"
|
|
||||||
|
|
||||||
// IsBridge indicates whether container uses the bridge network stack
|
|
||||||
// in windows it is given the name NAT
|
|
||||||
func (n NetworkMode) IsBridge() bool {
|
|
||||||
return n == "nat"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsHost indicates whether container uses the host network stack.
|
|
||||||
// returns false as this is not supported by windows
|
|
||||||
func (n NetworkMode) IsHost() bool {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsUserDefined indicates user-created network
|
|
||||||
func (n NetworkMode) IsUserDefined() bool {
|
|
||||||
return !n.IsDefault() && !n.IsNone() && !n.IsBridge() && !n.IsContainer()
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsValid indicates if an isolation technology is valid
|
|
||||||
func (i Isolation) IsValid() bool {
|
|
||||||
return i.IsDefault() || i.IsHyperV() || i.IsProcess()
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkName returns the name of the network stack.
|
|
||||||
func (n NetworkMode) NetworkName() string {
|
|
||||||
if n.IsDefault() {
|
|
||||||
return "default"
|
|
||||||
} else if n.IsBridge() {
|
|
||||||
return "nat"
|
|
||||||
} else if n.IsNone() {
|
|
||||||
return "none"
|
|
||||||
} else if n.IsContainer() {
|
|
||||||
return "container"
|
|
||||||
} else if n.IsUserDefined() {
|
|
||||||
return n.UserDefined()
|
|
||||||
}
|
|
||||||
|
|
||||||
return ""
|
|
||||||
}
|
|
22
vendor/github.com/docker/docker/api/types/container/waitcondition.go
generated
vendored
22
vendor/github.com/docker/docker/api/types/container/waitcondition.go
generated
vendored
@ -1,22 +0,0 @@
|
|||||||
package container // import "github.com/docker/docker/api/types/container"
|
|
||||||
|
|
||||||
// WaitCondition is a type used to specify a container state for which
|
|
||||||
// to wait.
|
|
||||||
type WaitCondition string
|
|
||||||
|
|
||||||
// Possible WaitCondition Values.
|
|
||||||
//
|
|
||||||
// WaitConditionNotRunning (default) is used to wait for any of the non-running
|
|
||||||
// states: "created", "exited", "dead", "removing", or "removed".
|
|
||||||
//
|
|
||||||
// WaitConditionNextExit is used to wait for the next time the state changes
|
|
||||||
// to a non-running state. If the state is currently "created" or "exited",
|
|
||||||
// this would cause Wait() to block until either the container runs and exits
|
|
||||||
// or is removed.
|
|
||||||
//
|
|
||||||
// WaitConditionRemoved is used to wait for the container to be removed.
|
|
||||||
const (
|
|
||||||
WaitConditionNotRunning WaitCondition = "not-running"
|
|
||||||
WaitConditionNextExit WaitCondition = "next-exit"
|
|
||||||
WaitConditionRemoved WaitCondition = "removed"
|
|
||||||
)
|
|
13
vendor/github.com/docker/docker/api/types/error_response.go
generated
vendored
13
vendor/github.com/docker/docker/api/types/error_response.go
generated
vendored
@ -1,13 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// ErrorResponse Represents an error.
|
|
||||||
// swagger:model ErrorResponse
|
|
||||||
type ErrorResponse struct {
|
|
||||||
|
|
||||||
// The error message.
|
|
||||||
// Required: true
|
|
||||||
Message string `json:"message"`
|
|
||||||
}
|
|
52
vendor/github.com/docker/docker/api/types/events/events.go
generated
vendored
52
vendor/github.com/docker/docker/api/types/events/events.go
generated
vendored
@ -1,52 +0,0 @@
|
|||||||
package events // import "github.com/docker/docker/api/types/events"
|
|
||||||
|
|
||||||
const (
|
|
||||||
// ContainerEventType is the event type that containers generate
|
|
||||||
ContainerEventType = "container"
|
|
||||||
// DaemonEventType is the event type that daemon generate
|
|
||||||
DaemonEventType = "daemon"
|
|
||||||
// ImageEventType is the event type that images generate
|
|
||||||
ImageEventType = "image"
|
|
||||||
// NetworkEventType is the event type that networks generate
|
|
||||||
NetworkEventType = "network"
|
|
||||||
// PluginEventType is the event type that plugins generate
|
|
||||||
PluginEventType = "plugin"
|
|
||||||
// VolumeEventType is the event type that volumes generate
|
|
||||||
VolumeEventType = "volume"
|
|
||||||
// ServiceEventType is the event type that services generate
|
|
||||||
ServiceEventType = "service"
|
|
||||||
// NodeEventType is the event type that nodes generate
|
|
||||||
NodeEventType = "node"
|
|
||||||
// SecretEventType is the event type that secrets generate
|
|
||||||
SecretEventType = "secret"
|
|
||||||
// ConfigEventType is the event type that configs generate
|
|
||||||
ConfigEventType = "config"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Actor describes something that generates events,
|
|
||||||
// like a container, or a network, or a volume.
|
|
||||||
// It has a defined name and a set or attributes.
|
|
||||||
// The container attributes are its labels, other actors
|
|
||||||
// can generate these attributes from other properties.
|
|
||||||
type Actor struct {
|
|
||||||
ID string
|
|
||||||
Attributes map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Message represents the information an event contains
|
|
||||||
type Message struct {
|
|
||||||
// Deprecated information from JSONMessage.
|
|
||||||
// With data only in container events.
|
|
||||||
Status string `json:"status,omitempty"`
|
|
||||||
ID string `json:"id,omitempty"`
|
|
||||||
From string `json:"from,omitempty"`
|
|
||||||
|
|
||||||
Type string
|
|
||||||
Action string
|
|
||||||
Actor Actor
|
|
||||||
// Engine events are local scope. Cluster events are swarm scope.
|
|
||||||
Scope string `json:"scope,omitempty"`
|
|
||||||
|
|
||||||
Time int64 `json:"time,omitempty"`
|
|
||||||
TimeNano int64 `json:"timeNano,omitempty"`
|
|
||||||
}
|
|
350
vendor/github.com/docker/docker/api/types/filters/parse.go
generated
vendored
350
vendor/github.com/docker/docker/api/types/filters/parse.go
generated
vendored
@ -1,350 +0,0 @@
|
|||||||
/*Package filters provides tools for encoding a mapping of keys to a set of
|
|
||||||
multiple values.
|
|
||||||
*/
|
|
||||||
package filters // import "github.com/docker/docker/api/types/filters"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/versions"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Args stores a mapping of keys to a set of multiple values.
|
|
||||||
type Args struct {
|
|
||||||
fields map[string]map[string]bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// KeyValuePair are used to initialize a new Args
|
|
||||||
type KeyValuePair struct {
|
|
||||||
Key string
|
|
||||||
Value string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Arg creates a new KeyValuePair for initializing Args
|
|
||||||
func Arg(key, value string) KeyValuePair {
|
|
||||||
return KeyValuePair{Key: key, Value: value}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewArgs returns a new Args populated with the initial args
|
|
||||||
func NewArgs(initialArgs ...KeyValuePair) Args {
|
|
||||||
args := Args{fields: map[string]map[string]bool{}}
|
|
||||||
for _, arg := range initialArgs {
|
|
||||||
args.Add(arg.Key, arg.Value)
|
|
||||||
}
|
|
||||||
return args
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseFlag parses a key=value string and adds it to an Args.
|
|
||||||
//
|
|
||||||
// Deprecated: Use Args.Add()
|
|
||||||
func ParseFlag(arg string, prev Args) (Args, error) {
|
|
||||||
filters := prev
|
|
||||||
if len(arg) == 0 {
|
|
||||||
return filters, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if !strings.Contains(arg, "=") {
|
|
||||||
return filters, ErrBadFormat
|
|
||||||
}
|
|
||||||
|
|
||||||
f := strings.SplitN(arg, "=", 2)
|
|
||||||
|
|
||||||
name := strings.ToLower(strings.TrimSpace(f[0]))
|
|
||||||
value := strings.TrimSpace(f[1])
|
|
||||||
|
|
||||||
filters.Add(name, value)
|
|
||||||
|
|
||||||
return filters, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrBadFormat is an error returned when a filter is not in the form key=value
|
|
||||||
//
|
|
||||||
// Deprecated: this error will be removed in a future version
|
|
||||||
var ErrBadFormat = errors.New("bad format of filter (expected name=value)")
|
|
||||||
|
|
||||||
// ToParam encodes the Args as args JSON encoded string
|
|
||||||
//
|
|
||||||
// Deprecated: use ToJSON
|
|
||||||
func ToParam(a Args) (string, error) {
|
|
||||||
return ToJSON(a)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON returns a JSON byte representation of the Args
|
|
||||||
func (args Args) MarshalJSON() ([]byte, error) {
|
|
||||||
if len(args.fields) == 0 {
|
|
||||||
return []byte{}, nil
|
|
||||||
}
|
|
||||||
return json.Marshal(args.fields)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToJSON returns the Args as a JSON encoded string
|
|
||||||
func ToJSON(a Args) (string, error) {
|
|
||||||
if a.Len() == 0 {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
buf, err := json.Marshal(a)
|
|
||||||
return string(buf), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToParamWithVersion encodes Args as a JSON string. If version is less than 1.22
|
|
||||||
// then the encoded format will use an older legacy format where the values are a
|
|
||||||
// list of strings, instead of a set.
|
|
||||||
//
|
|
||||||
// Deprecated: Use ToJSON
|
|
||||||
func ToParamWithVersion(version string, a Args) (string, error) {
|
|
||||||
if a.Len() == 0 {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if version != "" && versions.LessThan(version, "1.22") {
|
|
||||||
buf, err := json.Marshal(convertArgsToSlice(a.fields))
|
|
||||||
return string(buf), err
|
|
||||||
}
|
|
||||||
|
|
||||||
return ToJSON(a)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromParam decodes a JSON encoded string into Args
|
|
||||||
//
|
|
||||||
// Deprecated: use FromJSON
|
|
||||||
func FromParam(p string) (Args, error) {
|
|
||||||
return FromJSON(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromJSON decodes a JSON encoded string into Args
|
|
||||||
func FromJSON(p string) (Args, error) {
|
|
||||||
args := NewArgs()
|
|
||||||
|
|
||||||
if p == "" {
|
|
||||||
return args, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
raw := []byte(p)
|
|
||||||
err := json.Unmarshal(raw, &args)
|
|
||||||
if err == nil {
|
|
||||||
return args, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fallback to parsing arguments in the legacy slice format
|
|
||||||
deprecated := map[string][]string{}
|
|
||||||
if legacyErr := json.Unmarshal(raw, &deprecated); legacyErr != nil {
|
|
||||||
return args, err
|
|
||||||
}
|
|
||||||
|
|
||||||
args.fields = deprecatedArgs(deprecated)
|
|
||||||
return args, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON populates the Args from JSON encode bytes
|
|
||||||
func (args Args) UnmarshalJSON(raw []byte) error {
|
|
||||||
if len(raw) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return json.Unmarshal(raw, &args.fields)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get returns the list of values associated with the key
|
|
||||||
func (args Args) Get(key string) []string {
|
|
||||||
values := args.fields[key]
|
|
||||||
if values == nil {
|
|
||||||
return make([]string, 0)
|
|
||||||
}
|
|
||||||
slice := make([]string, 0, len(values))
|
|
||||||
for key := range values {
|
|
||||||
slice = append(slice, key)
|
|
||||||
}
|
|
||||||
return slice
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a new value to the set of values
|
|
||||||
func (args Args) Add(key, value string) {
|
|
||||||
if _, ok := args.fields[key]; ok {
|
|
||||||
args.fields[key][value] = true
|
|
||||||
} else {
|
|
||||||
args.fields[key] = map[string]bool{value: true}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Del removes a value from the set
|
|
||||||
func (args Args) Del(key, value string) {
|
|
||||||
if _, ok := args.fields[key]; ok {
|
|
||||||
delete(args.fields[key], value)
|
|
||||||
if len(args.fields[key]) == 0 {
|
|
||||||
delete(args.fields, key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Len returns the number of keys in the mapping
|
|
||||||
func (args Args) Len() int {
|
|
||||||
return len(args.fields)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MatchKVList returns true if all the pairs in sources exist as key=value
|
|
||||||
// pairs in the mapping at key, or if there are no values at key.
|
|
||||||
func (args Args) MatchKVList(key string, sources map[string]string) bool {
|
|
||||||
fieldValues := args.fields[key]
|
|
||||||
|
|
||||||
//do not filter if there is no filter set or cannot determine filter
|
|
||||||
if len(fieldValues) == 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(sources) == 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
for value := range fieldValues {
|
|
||||||
testKV := strings.SplitN(value, "=", 2)
|
|
||||||
|
|
||||||
v, ok := sources[testKV[0]]
|
|
||||||
if !ok {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if len(testKV) == 2 && testKV[1] != v {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match returns true if any of the values at key match the source string
|
|
||||||
func (args Args) Match(field, source string) bool {
|
|
||||||
if args.ExactMatch(field, source) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldValues := args.fields[field]
|
|
||||||
for name2match := range fieldValues {
|
|
||||||
match, err := regexp.MatchString(name2match, source)
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if match {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExactMatch returns true if the source matches exactly one of the values.
|
|
||||||
func (args Args) ExactMatch(key, source string) bool {
|
|
||||||
fieldValues, ok := args.fields[key]
|
|
||||||
//do not filter if there is no filter set or cannot determine filter
|
|
||||||
if !ok || len(fieldValues) == 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// try to match full name value to avoid O(N) regular expression matching
|
|
||||||
return fieldValues[source]
|
|
||||||
}
|
|
||||||
|
|
||||||
// UniqueExactMatch returns true if there is only one value and the source
|
|
||||||
// matches exactly the value.
|
|
||||||
func (args Args) UniqueExactMatch(key, source string) bool {
|
|
||||||
fieldValues := args.fields[key]
|
|
||||||
//do not filter if there is no filter set or cannot determine filter
|
|
||||||
if len(fieldValues) == 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if len(args.fields[key]) != 1 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// try to match full name value to avoid O(N) regular expression matching
|
|
||||||
return fieldValues[source]
|
|
||||||
}
|
|
||||||
|
|
||||||
// FuzzyMatch returns true if the source matches exactly one value, or the
|
|
||||||
// source has one of the values as a prefix.
|
|
||||||
func (args Args) FuzzyMatch(key, source string) bool {
|
|
||||||
if args.ExactMatch(key, source) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldValues := args.fields[key]
|
|
||||||
for prefix := range fieldValues {
|
|
||||||
if strings.HasPrefix(source, prefix) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Include returns true if the key exists in the mapping
|
|
||||||
//
|
|
||||||
// Deprecated: use Contains
|
|
||||||
func (args Args) Include(field string) bool {
|
|
||||||
_, ok := args.fields[field]
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// Contains returns true if the key exists in the mapping
|
|
||||||
func (args Args) Contains(field string) bool {
|
|
||||||
_, ok := args.fields[field]
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
type invalidFilter string
|
|
||||||
|
|
||||||
func (e invalidFilter) Error() string {
|
|
||||||
return "Invalid filter '" + string(e) + "'"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (invalidFilter) InvalidParameter() {}
|
|
||||||
|
|
||||||
// Validate compared the set of accepted keys against the keys in the mapping.
|
|
||||||
// An error is returned if any mapping keys are not in the accepted set.
|
|
||||||
func (args Args) Validate(accepted map[string]bool) error {
|
|
||||||
for name := range args.fields {
|
|
||||||
if !accepted[name] {
|
|
||||||
return invalidFilter(name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// WalkValues iterates over the list of values for a key in the mapping and calls
|
|
||||||
// op() for each value. If op returns an error the iteration stops and the
|
|
||||||
// error is returned.
|
|
||||||
func (args Args) WalkValues(field string, op func(value string) error) error {
|
|
||||||
if _, ok := args.fields[field]; !ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
for v := range args.fields[field] {
|
|
||||||
if err := op(v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func deprecatedArgs(d map[string][]string) map[string]map[string]bool {
|
|
||||||
m := map[string]map[string]bool{}
|
|
||||||
for k, v := range d {
|
|
||||||
values := map[string]bool{}
|
|
||||||
for _, vv := range v {
|
|
||||||
values[vv] = true
|
|
||||||
}
|
|
||||||
m[k] = values
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func convertArgsToSlice(f map[string]map[string]bool) map[string][]string {
|
|
||||||
m := map[string][]string{}
|
|
||||||
for k, v := range f {
|
|
||||||
values := []string{}
|
|
||||||
for kk := range v {
|
|
||||||
if v[kk] {
|
|
||||||
values = append(values, kk)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m[k] = values
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
17
vendor/github.com/docker/docker/api/types/graph_driver_data.go
generated
vendored
17
vendor/github.com/docker/docker/api/types/graph_driver_data.go
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// GraphDriverData Information about a container's graph driver.
|
|
||||||
// swagger:model GraphDriverData
|
|
||||||
type GraphDriverData struct {
|
|
||||||
|
|
||||||
// data
|
|
||||||
// Required: true
|
|
||||||
Data map[string]string `json:"Data"`
|
|
||||||
|
|
||||||
// name
|
|
||||||
// Required: true
|
|
||||||
Name string `json:"Name"`
|
|
||||||
}
|
|
13
vendor/github.com/docker/docker/api/types/id_response.go
generated
vendored
13
vendor/github.com/docker/docker/api/types/id_response.go
generated
vendored
@ -1,13 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// IDResponse Response to an API call that returns just an Id
|
|
||||||
// swagger:model IdResponse
|
|
||||||
type IDResponse struct {
|
|
||||||
|
|
||||||
// The id of the newly created object.
|
|
||||||
// Required: true
|
|
||||||
ID string `json:"Id"`
|
|
||||||
}
|
|
37
vendor/github.com/docker/docker/api/types/image/image_history.go
generated
vendored
37
vendor/github.com/docker/docker/api/types/image/image_history.go
generated
vendored
@ -1,37 +0,0 @@
|
|||||||
package image
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// DO NOT EDIT THIS FILE
|
|
||||||
// This file was generated by `swagger generate operation`
|
|
||||||
//
|
|
||||||
// See hack/generate-swagger-api.sh
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// HistoryResponseItem individual image layer information in response to ImageHistory operation
|
|
||||||
// swagger:model HistoryResponseItem
|
|
||||||
type HistoryResponseItem struct {
|
|
||||||
|
|
||||||
// comment
|
|
||||||
// Required: true
|
|
||||||
Comment string `json:"Comment"`
|
|
||||||
|
|
||||||
// created
|
|
||||||
// Required: true
|
|
||||||
Created int64 `json:"Created"`
|
|
||||||
|
|
||||||
// created by
|
|
||||||
// Required: true
|
|
||||||
CreatedBy string `json:"CreatedBy"`
|
|
||||||
|
|
||||||
// Id
|
|
||||||
// Required: true
|
|
||||||
ID string `json:"Id"`
|
|
||||||
|
|
||||||
// size
|
|
||||||
// Required: true
|
|
||||||
Size int64 `json:"Size"`
|
|
||||||
|
|
||||||
// tags
|
|
||||||
// Required: true
|
|
||||||
Tags []string `json:"Tags"`
|
|
||||||
}
|
|
15
vendor/github.com/docker/docker/api/types/image_delete_response_item.go
generated
vendored
15
vendor/github.com/docker/docker/api/types/image_delete_response_item.go
generated
vendored
@ -1,15 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// ImageDeleteResponseItem image delete response item
|
|
||||||
// swagger:model ImageDeleteResponseItem
|
|
||||||
type ImageDeleteResponseItem struct {
|
|
||||||
|
|
||||||
// The image ID of an image that was deleted
|
|
||||||
Deleted string `json:"Deleted,omitempty"`
|
|
||||||
|
|
||||||
// The image ID of an image that was untagged
|
|
||||||
Untagged string `json:"Untagged,omitempty"`
|
|
||||||
}
|
|
49
vendor/github.com/docker/docker/api/types/image_summary.go
generated
vendored
49
vendor/github.com/docker/docker/api/types/image_summary.go
generated
vendored
@ -1,49 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// ImageSummary image summary
|
|
||||||
// swagger:model ImageSummary
|
|
||||||
type ImageSummary struct {
|
|
||||||
|
|
||||||
// containers
|
|
||||||
// Required: true
|
|
||||||
Containers int64 `json:"Containers"`
|
|
||||||
|
|
||||||
// created
|
|
||||||
// Required: true
|
|
||||||
Created int64 `json:"Created"`
|
|
||||||
|
|
||||||
// Id
|
|
||||||
// Required: true
|
|
||||||
ID string `json:"Id"`
|
|
||||||
|
|
||||||
// labels
|
|
||||||
// Required: true
|
|
||||||
Labels map[string]string `json:"Labels"`
|
|
||||||
|
|
||||||
// parent Id
|
|
||||||
// Required: true
|
|
||||||
ParentID string `json:"ParentId"`
|
|
||||||
|
|
||||||
// repo digests
|
|
||||||
// Required: true
|
|
||||||
RepoDigests []string `json:"RepoDigests"`
|
|
||||||
|
|
||||||
// repo tags
|
|
||||||
// Required: true
|
|
||||||
RepoTags []string `json:"RepoTags"`
|
|
||||||
|
|
||||||
// shared size
|
|
||||||
// Required: true
|
|
||||||
SharedSize int64 `json:"SharedSize"`
|
|
||||||
|
|
||||||
// size
|
|
||||||
// Required: true
|
|
||||||
Size int64 `json:"Size"`
|
|
||||||
|
|
||||||
// virtual size
|
|
||||||
// Required: true
|
|
||||||
VirtualSize int64 `json:"VirtualSize"`
|
|
||||||
}
|
|
130
vendor/github.com/docker/docker/api/types/mount/mount.go
generated
vendored
130
vendor/github.com/docker/docker/api/types/mount/mount.go
generated
vendored
@ -1,130 +0,0 @@
|
|||||||
package mount // import "github.com/docker/docker/api/types/mount"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Type represents the type of a mount.
|
|
||||||
type Type string
|
|
||||||
|
|
||||||
// Type constants
|
|
||||||
const (
|
|
||||||
// TypeBind is the type for mounting host dir
|
|
||||||
TypeBind Type = "bind"
|
|
||||||
// TypeVolume is the type for remote storage volumes
|
|
||||||
TypeVolume Type = "volume"
|
|
||||||
// TypeTmpfs is the type for mounting tmpfs
|
|
||||||
TypeTmpfs Type = "tmpfs"
|
|
||||||
// TypeNamedPipe is the type for mounting Windows named pipes
|
|
||||||
TypeNamedPipe Type = "npipe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Mount represents a mount (volume).
|
|
||||||
type Mount struct {
|
|
||||||
Type Type `json:",omitempty"`
|
|
||||||
// Source specifies the name of the mount. Depending on mount type, this
|
|
||||||
// may be a volume name or a host path, or even ignored.
|
|
||||||
// Source is not supported for tmpfs (must be an empty value)
|
|
||||||
Source string `json:",omitempty"`
|
|
||||||
Target string `json:",omitempty"`
|
|
||||||
ReadOnly bool `json:",omitempty"`
|
|
||||||
Consistency Consistency `json:",omitempty"`
|
|
||||||
|
|
||||||
BindOptions *BindOptions `json:",omitempty"`
|
|
||||||
VolumeOptions *VolumeOptions `json:",omitempty"`
|
|
||||||
TmpfsOptions *TmpfsOptions `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Propagation represents the propagation of a mount.
|
|
||||||
type Propagation string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// PropagationRPrivate RPRIVATE
|
|
||||||
PropagationRPrivate Propagation = "rprivate"
|
|
||||||
// PropagationPrivate PRIVATE
|
|
||||||
PropagationPrivate Propagation = "private"
|
|
||||||
// PropagationRShared RSHARED
|
|
||||||
PropagationRShared Propagation = "rshared"
|
|
||||||
// PropagationShared SHARED
|
|
||||||
PropagationShared Propagation = "shared"
|
|
||||||
// PropagationRSlave RSLAVE
|
|
||||||
PropagationRSlave Propagation = "rslave"
|
|
||||||
// PropagationSlave SLAVE
|
|
||||||
PropagationSlave Propagation = "slave"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Propagations is the list of all valid mount propagations
|
|
||||||
var Propagations = []Propagation{
|
|
||||||
PropagationRPrivate,
|
|
||||||
PropagationPrivate,
|
|
||||||
PropagationRShared,
|
|
||||||
PropagationShared,
|
|
||||||
PropagationRSlave,
|
|
||||||
PropagationSlave,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Consistency represents the consistency requirements of a mount.
|
|
||||||
type Consistency string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// ConsistencyFull guarantees bind mount-like consistency
|
|
||||||
ConsistencyFull Consistency = "consistent"
|
|
||||||
// ConsistencyCached mounts can cache read data and FS structure
|
|
||||||
ConsistencyCached Consistency = "cached"
|
|
||||||
// ConsistencyDelegated mounts can cache read and written data and structure
|
|
||||||
ConsistencyDelegated Consistency = "delegated"
|
|
||||||
// ConsistencyDefault provides "consistent" behavior unless overridden
|
|
||||||
ConsistencyDefault Consistency = "default"
|
|
||||||
)
|
|
||||||
|
|
||||||
// BindOptions defines options specific to mounts of type "bind".
|
|
||||||
type BindOptions struct {
|
|
||||||
Propagation Propagation `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// VolumeOptions represents the options for a mount of type volume.
|
|
||||||
type VolumeOptions struct {
|
|
||||||
NoCopy bool `json:",omitempty"`
|
|
||||||
Labels map[string]string `json:",omitempty"`
|
|
||||||
DriverConfig *Driver `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Driver represents a volume driver.
|
|
||||||
type Driver struct {
|
|
||||||
Name string `json:",omitempty"`
|
|
||||||
Options map[string]string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TmpfsOptions defines options specific to mounts of type "tmpfs".
|
|
||||||
type TmpfsOptions struct {
|
|
||||||
// Size sets the size of the tmpfs, in bytes.
|
|
||||||
//
|
|
||||||
// This will be converted to an operating system specific value
|
|
||||||
// depending on the host. For example, on linux, it will be converted to
|
|
||||||
// use a 'k', 'm' or 'g' syntax. BSD, though not widely supported with
|
|
||||||
// docker, uses a straight byte value.
|
|
||||||
//
|
|
||||||
// Percentages are not supported.
|
|
||||||
SizeBytes int64 `json:",omitempty"`
|
|
||||||
// Mode of the tmpfs upon creation
|
|
||||||
Mode os.FileMode `json:",omitempty"`
|
|
||||||
|
|
||||||
// TODO(stevvooe): There are several more tmpfs flags, specified in the
|
|
||||||
// daemon, that are accepted. Only the most basic are added for now.
|
|
||||||
//
|
|
||||||
// From docker/docker/pkg/mount/flags.go:
|
|
||||||
//
|
|
||||||
// var validFlags = map[string]bool{
|
|
||||||
// "": true,
|
|
||||||
// "size": true, X
|
|
||||||
// "mode": true, X
|
|
||||||
// "uid": true,
|
|
||||||
// "gid": true,
|
|
||||||
// "nr_inodes": true,
|
|
||||||
// "nr_blocks": true,
|
|
||||||
// "mpol": true,
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Some of these may be straightforward to add, but others, such as
|
|
||||||
// uid/gid have implications in a clustered system.
|
|
||||||
}
|
|
108
vendor/github.com/docker/docker/api/types/network/network.go
generated
vendored
108
vendor/github.com/docker/docker/api/types/network/network.go
generated
vendored
@ -1,108 +0,0 @@
|
|||||||
package network // import "github.com/docker/docker/api/types/network"
|
|
||||||
|
|
||||||
// Address represents an IP address
|
|
||||||
type Address struct {
|
|
||||||
Addr string
|
|
||||||
PrefixLen int
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPAM represents IP Address Management
|
|
||||||
type IPAM struct {
|
|
||||||
Driver string
|
|
||||||
Options map[string]string //Per network IPAM driver options
|
|
||||||
Config []IPAMConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPAMConfig represents IPAM configurations
|
|
||||||
type IPAMConfig struct {
|
|
||||||
Subnet string `json:",omitempty"`
|
|
||||||
IPRange string `json:",omitempty"`
|
|
||||||
Gateway string `json:",omitempty"`
|
|
||||||
AuxAddress map[string]string `json:"AuxiliaryAddresses,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// EndpointIPAMConfig represents IPAM configurations for the endpoint
|
|
||||||
type EndpointIPAMConfig struct {
|
|
||||||
IPv4Address string `json:",omitempty"`
|
|
||||||
IPv6Address string `json:",omitempty"`
|
|
||||||
LinkLocalIPs []string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy makes a copy of the endpoint ipam config
|
|
||||||
func (cfg *EndpointIPAMConfig) Copy() *EndpointIPAMConfig {
|
|
||||||
cfgCopy := *cfg
|
|
||||||
cfgCopy.LinkLocalIPs = make([]string, 0, len(cfg.LinkLocalIPs))
|
|
||||||
cfgCopy.LinkLocalIPs = append(cfgCopy.LinkLocalIPs, cfg.LinkLocalIPs...)
|
|
||||||
return &cfgCopy
|
|
||||||
}
|
|
||||||
|
|
||||||
// PeerInfo represents one peer of an overlay network
|
|
||||||
type PeerInfo struct {
|
|
||||||
Name string
|
|
||||||
IP string
|
|
||||||
}
|
|
||||||
|
|
||||||
// EndpointSettings stores the network endpoint details
|
|
||||||
type EndpointSettings struct {
|
|
||||||
// Configurations
|
|
||||||
IPAMConfig *EndpointIPAMConfig
|
|
||||||
Links []string
|
|
||||||
Aliases []string
|
|
||||||
// Operational data
|
|
||||||
NetworkID string
|
|
||||||
EndpointID string
|
|
||||||
Gateway string
|
|
||||||
IPAddress string
|
|
||||||
IPPrefixLen int
|
|
||||||
IPv6Gateway string
|
|
||||||
GlobalIPv6Address string
|
|
||||||
GlobalIPv6PrefixLen int
|
|
||||||
MacAddress string
|
|
||||||
DriverOpts map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Task carries the information about one backend task
|
|
||||||
type Task struct {
|
|
||||||
Name string
|
|
||||||
EndpointID string
|
|
||||||
EndpointIP string
|
|
||||||
Info map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServiceInfo represents service parameters with the list of service's tasks
|
|
||||||
type ServiceInfo struct {
|
|
||||||
VIP string
|
|
||||||
Ports []string
|
|
||||||
LocalLBIndex int
|
|
||||||
Tasks []Task
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy makes a deep copy of `EndpointSettings`
|
|
||||||
func (es *EndpointSettings) Copy() *EndpointSettings {
|
|
||||||
epCopy := *es
|
|
||||||
if es.IPAMConfig != nil {
|
|
||||||
epCopy.IPAMConfig = es.IPAMConfig.Copy()
|
|
||||||
}
|
|
||||||
|
|
||||||
if es.Links != nil {
|
|
||||||
links := make([]string, 0, len(es.Links))
|
|
||||||
epCopy.Links = append(links, es.Links...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if es.Aliases != nil {
|
|
||||||
aliases := make([]string, 0, len(es.Aliases))
|
|
||||||
epCopy.Aliases = append(aliases, es.Aliases...)
|
|
||||||
}
|
|
||||||
return &epCopy
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkingConfig represents the container's networking configuration for each of its interfaces
|
|
||||||
// Carries the networking configs specified in the `docker run` and `docker network connect` commands
|
|
||||||
type NetworkingConfig struct {
|
|
||||||
EndpointsConfig map[string]*EndpointSettings // Endpoint configs for each connecting network
|
|
||||||
}
|
|
||||||
|
|
||||||
// ConfigReference specifies the source which provides a network's configuration
|
|
||||||
type ConfigReference struct {
|
|
||||||
Network string
|
|
||||||
}
|
|
203
vendor/github.com/docker/docker/api/types/plugin.go
generated
vendored
203
vendor/github.com/docker/docker/api/types/plugin.go
generated
vendored
@ -1,203 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// Plugin A plugin for the Engine API
|
|
||||||
// swagger:model Plugin
|
|
||||||
type Plugin struct {
|
|
||||||
|
|
||||||
// config
|
|
||||||
// Required: true
|
|
||||||
Config PluginConfig `json:"Config"`
|
|
||||||
|
|
||||||
// True if the plugin is running. False if the plugin is not running, only installed.
|
|
||||||
// Required: true
|
|
||||||
Enabled bool `json:"Enabled"`
|
|
||||||
|
|
||||||
// Id
|
|
||||||
ID string `json:"Id,omitempty"`
|
|
||||||
|
|
||||||
// name
|
|
||||||
// Required: true
|
|
||||||
Name string `json:"Name"`
|
|
||||||
|
|
||||||
// plugin remote reference used to push/pull the plugin
|
|
||||||
PluginReference string `json:"PluginReference,omitempty"`
|
|
||||||
|
|
||||||
// settings
|
|
||||||
// Required: true
|
|
||||||
Settings PluginSettings `json:"Settings"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginConfig The config of a plugin.
|
|
||||||
// swagger:model PluginConfig
|
|
||||||
type PluginConfig struct {
|
|
||||||
|
|
||||||
// args
|
|
||||||
// Required: true
|
|
||||||
Args PluginConfigArgs `json:"Args"`
|
|
||||||
|
|
||||||
// description
|
|
||||||
// Required: true
|
|
||||||
Description string `json:"Description"`
|
|
||||||
|
|
||||||
// Docker Version used to create the plugin
|
|
||||||
DockerVersion string `json:"DockerVersion,omitempty"`
|
|
||||||
|
|
||||||
// documentation
|
|
||||||
// Required: true
|
|
||||||
Documentation string `json:"Documentation"`
|
|
||||||
|
|
||||||
// entrypoint
|
|
||||||
// Required: true
|
|
||||||
Entrypoint []string `json:"Entrypoint"`
|
|
||||||
|
|
||||||
// env
|
|
||||||
// Required: true
|
|
||||||
Env []PluginEnv `json:"Env"`
|
|
||||||
|
|
||||||
// interface
|
|
||||||
// Required: true
|
|
||||||
Interface PluginConfigInterface `json:"Interface"`
|
|
||||||
|
|
||||||
// ipc host
|
|
||||||
// Required: true
|
|
||||||
IpcHost bool `json:"IpcHost"`
|
|
||||||
|
|
||||||
// linux
|
|
||||||
// Required: true
|
|
||||||
Linux PluginConfigLinux `json:"Linux"`
|
|
||||||
|
|
||||||
// mounts
|
|
||||||
// Required: true
|
|
||||||
Mounts []PluginMount `json:"Mounts"`
|
|
||||||
|
|
||||||
// network
|
|
||||||
// Required: true
|
|
||||||
Network PluginConfigNetwork `json:"Network"`
|
|
||||||
|
|
||||||
// pid host
|
|
||||||
// Required: true
|
|
||||||
PidHost bool `json:"PidHost"`
|
|
||||||
|
|
||||||
// propagated mount
|
|
||||||
// Required: true
|
|
||||||
PropagatedMount string `json:"PropagatedMount"`
|
|
||||||
|
|
||||||
// user
|
|
||||||
User PluginConfigUser `json:"User,omitempty"`
|
|
||||||
|
|
||||||
// work dir
|
|
||||||
// Required: true
|
|
||||||
WorkDir string `json:"WorkDir"`
|
|
||||||
|
|
||||||
// rootfs
|
|
||||||
Rootfs *PluginConfigRootfs `json:"rootfs,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginConfigArgs plugin config args
|
|
||||||
// swagger:model PluginConfigArgs
|
|
||||||
type PluginConfigArgs struct {
|
|
||||||
|
|
||||||
// description
|
|
||||||
// Required: true
|
|
||||||
Description string `json:"Description"`
|
|
||||||
|
|
||||||
// name
|
|
||||||
// Required: true
|
|
||||||
Name string `json:"Name"`
|
|
||||||
|
|
||||||
// settable
|
|
||||||
// Required: true
|
|
||||||
Settable []string `json:"Settable"`
|
|
||||||
|
|
||||||
// value
|
|
||||||
// Required: true
|
|
||||||
Value []string `json:"Value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginConfigInterface The interface between Docker and the plugin
|
|
||||||
// swagger:model PluginConfigInterface
|
|
||||||
type PluginConfigInterface struct {
|
|
||||||
|
|
||||||
// Protocol to use for clients connecting to the plugin.
|
|
||||||
ProtocolScheme string `json:"ProtocolScheme,omitempty"`
|
|
||||||
|
|
||||||
// socket
|
|
||||||
// Required: true
|
|
||||||
Socket string `json:"Socket"`
|
|
||||||
|
|
||||||
// types
|
|
||||||
// Required: true
|
|
||||||
Types []PluginInterfaceType `json:"Types"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginConfigLinux plugin config linux
|
|
||||||
// swagger:model PluginConfigLinux
|
|
||||||
type PluginConfigLinux struct {
|
|
||||||
|
|
||||||
// allow all devices
|
|
||||||
// Required: true
|
|
||||||
AllowAllDevices bool `json:"AllowAllDevices"`
|
|
||||||
|
|
||||||
// capabilities
|
|
||||||
// Required: true
|
|
||||||
Capabilities []string `json:"Capabilities"`
|
|
||||||
|
|
||||||
// devices
|
|
||||||
// Required: true
|
|
||||||
Devices []PluginDevice `json:"Devices"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginConfigNetwork plugin config network
|
|
||||||
// swagger:model PluginConfigNetwork
|
|
||||||
type PluginConfigNetwork struct {
|
|
||||||
|
|
||||||
// type
|
|
||||||
// Required: true
|
|
||||||
Type string `json:"Type"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginConfigRootfs plugin config rootfs
|
|
||||||
// swagger:model PluginConfigRootfs
|
|
||||||
type PluginConfigRootfs struct {
|
|
||||||
|
|
||||||
// diff ids
|
|
||||||
DiffIds []string `json:"diff_ids"`
|
|
||||||
|
|
||||||
// type
|
|
||||||
Type string `json:"type,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginConfigUser plugin config user
|
|
||||||
// swagger:model PluginConfigUser
|
|
||||||
type PluginConfigUser struct {
|
|
||||||
|
|
||||||
// g ID
|
|
||||||
GID uint32 `json:"GID,omitempty"`
|
|
||||||
|
|
||||||
// UID
|
|
||||||
UID uint32 `json:"UID,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginSettings Settings that can be modified by users.
|
|
||||||
// swagger:model PluginSettings
|
|
||||||
type PluginSettings struct {
|
|
||||||
|
|
||||||
// args
|
|
||||||
// Required: true
|
|
||||||
Args []string `json:"Args"`
|
|
||||||
|
|
||||||
// devices
|
|
||||||
// Required: true
|
|
||||||
Devices []PluginDevice `json:"Devices"`
|
|
||||||
|
|
||||||
// env
|
|
||||||
// Required: true
|
|
||||||
Env []string `json:"Env"`
|
|
||||||
|
|
||||||
// mounts
|
|
||||||
// Required: true
|
|
||||||
Mounts []PluginMount `json:"Mounts"`
|
|
||||||
}
|
|
25
vendor/github.com/docker/docker/api/types/plugin_device.go
generated
vendored
25
vendor/github.com/docker/docker/api/types/plugin_device.go
generated
vendored
@ -1,25 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// PluginDevice plugin device
|
|
||||||
// swagger:model PluginDevice
|
|
||||||
type PluginDevice struct {
|
|
||||||
|
|
||||||
// description
|
|
||||||
// Required: true
|
|
||||||
Description string `json:"Description"`
|
|
||||||
|
|
||||||
// name
|
|
||||||
// Required: true
|
|
||||||
Name string `json:"Name"`
|
|
||||||
|
|
||||||
// path
|
|
||||||
// Required: true
|
|
||||||
Path *string `json:"Path"`
|
|
||||||
|
|
||||||
// settable
|
|
||||||
// Required: true
|
|
||||||
Settable []string `json:"Settable"`
|
|
||||||
}
|
|
25
vendor/github.com/docker/docker/api/types/plugin_env.go
generated
vendored
25
vendor/github.com/docker/docker/api/types/plugin_env.go
generated
vendored
@ -1,25 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// PluginEnv plugin env
|
|
||||||
// swagger:model PluginEnv
|
|
||||||
type PluginEnv struct {
|
|
||||||
|
|
||||||
// description
|
|
||||||
// Required: true
|
|
||||||
Description string `json:"Description"`
|
|
||||||
|
|
||||||
// name
|
|
||||||
// Required: true
|
|
||||||
Name string `json:"Name"`
|
|
||||||
|
|
||||||
// settable
|
|
||||||
// Required: true
|
|
||||||
Settable []string `json:"Settable"`
|
|
||||||
|
|
||||||
// value
|
|
||||||
// Required: true
|
|
||||||
Value *string `json:"Value"`
|
|
||||||
}
|
|
21
vendor/github.com/docker/docker/api/types/plugin_interface_type.go
generated
vendored
21
vendor/github.com/docker/docker/api/types/plugin_interface_type.go
generated
vendored
@ -1,21 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// PluginInterfaceType plugin interface type
|
|
||||||
// swagger:model PluginInterfaceType
|
|
||||||
type PluginInterfaceType struct {
|
|
||||||
|
|
||||||
// capability
|
|
||||||
// Required: true
|
|
||||||
Capability string `json:"Capability"`
|
|
||||||
|
|
||||||
// prefix
|
|
||||||
// Required: true
|
|
||||||
Prefix string `json:"Prefix"`
|
|
||||||
|
|
||||||
// version
|
|
||||||
// Required: true
|
|
||||||
Version string `json:"Version"`
|
|
||||||
}
|
|
37
vendor/github.com/docker/docker/api/types/plugin_mount.go
generated
vendored
37
vendor/github.com/docker/docker/api/types/plugin_mount.go
generated
vendored
@ -1,37 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// PluginMount plugin mount
|
|
||||||
// swagger:model PluginMount
|
|
||||||
type PluginMount struct {
|
|
||||||
|
|
||||||
// description
|
|
||||||
// Required: true
|
|
||||||
Description string `json:"Description"`
|
|
||||||
|
|
||||||
// destination
|
|
||||||
// Required: true
|
|
||||||
Destination string `json:"Destination"`
|
|
||||||
|
|
||||||
// name
|
|
||||||
// Required: true
|
|
||||||
Name string `json:"Name"`
|
|
||||||
|
|
||||||
// options
|
|
||||||
// Required: true
|
|
||||||
Options []string `json:"Options"`
|
|
||||||
|
|
||||||
// settable
|
|
||||||
// Required: true
|
|
||||||
Settable []string `json:"Settable"`
|
|
||||||
|
|
||||||
// source
|
|
||||||
// Required: true
|
|
||||||
Source *string `json:"Source"`
|
|
||||||
|
|
||||||
// type
|
|
||||||
// Required: true
|
|
||||||
Type string `json:"Type"`
|
|
||||||
}
|
|
71
vendor/github.com/docker/docker/api/types/plugin_responses.go
generated
vendored
71
vendor/github.com/docker/docker/api/types/plugin_responses.go
generated
vendored
@ -1,71 +0,0 @@
|
|||||||
package types // import "github.com/docker/docker/api/types"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"sort"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PluginsListResponse contains the response for the Engine API
|
|
||||||
type PluginsListResponse []*Plugin
|
|
||||||
|
|
||||||
// UnmarshalJSON implements json.Unmarshaler for PluginInterfaceType
|
|
||||||
func (t *PluginInterfaceType) UnmarshalJSON(p []byte) error {
|
|
||||||
versionIndex := len(p)
|
|
||||||
prefixIndex := 0
|
|
||||||
if len(p) < 2 || p[0] != '"' || p[len(p)-1] != '"' {
|
|
||||||
return fmt.Errorf("%q is not a plugin interface type", p)
|
|
||||||
}
|
|
||||||
p = p[1 : len(p)-1]
|
|
||||||
loop:
|
|
||||||
for i, b := range p {
|
|
||||||
switch b {
|
|
||||||
case '.':
|
|
||||||
prefixIndex = i
|
|
||||||
case '/':
|
|
||||||
versionIndex = i
|
|
||||||
break loop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
t.Prefix = string(p[:prefixIndex])
|
|
||||||
t.Capability = string(p[prefixIndex+1 : versionIndex])
|
|
||||||
if versionIndex < len(p) {
|
|
||||||
t.Version = string(p[versionIndex+1:])
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON implements json.Marshaler for PluginInterfaceType
|
|
||||||
func (t *PluginInterfaceType) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(t.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
// String implements fmt.Stringer for PluginInterfaceType
|
|
||||||
func (t PluginInterfaceType) String() string {
|
|
||||||
return fmt.Sprintf("%s.%s/%s", t.Prefix, t.Capability, t.Version)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginPrivilege describes a permission the user has to accept
|
|
||||||
// upon installing a plugin.
|
|
||||||
type PluginPrivilege struct {
|
|
||||||
Name string
|
|
||||||
Description string
|
|
||||||
Value []string
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginPrivileges is a list of PluginPrivilege
|
|
||||||
type PluginPrivileges []PluginPrivilege
|
|
||||||
|
|
||||||
func (s PluginPrivileges) Len() int {
|
|
||||||
return len(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s PluginPrivileges) Less(i, j int) bool {
|
|
||||||
return s[i].Name < s[j].Name
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s PluginPrivileges) Swap(i, j int) {
|
|
||||||
sort.Strings(s[i].Value)
|
|
||||||
sort.Strings(s[j].Value)
|
|
||||||
s[i], s[j] = s[j], s[i]
|
|
||||||
}
|
|
23
vendor/github.com/docker/docker/api/types/port.go
generated
vendored
23
vendor/github.com/docker/docker/api/types/port.go
generated
vendored
@ -1,23 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// Port An open port on a container
|
|
||||||
// swagger:model Port
|
|
||||||
type Port struct {
|
|
||||||
|
|
||||||
// Host IP address that the container's port is mapped to
|
|
||||||
IP string `json:"IP,omitempty"`
|
|
||||||
|
|
||||||
// Port on the container
|
|
||||||
// Required: true
|
|
||||||
PrivatePort uint16 `json:"PrivatePort"`
|
|
||||||
|
|
||||||
// Port exposed on the host
|
|
||||||
PublicPort uint16 `json:"PublicPort,omitempty"`
|
|
||||||
|
|
||||||
// type
|
|
||||||
// Required: true
|
|
||||||
Type string `json:"Type"`
|
|
||||||
}
|
|
21
vendor/github.com/docker/docker/api/types/registry/authenticate.go
generated
vendored
21
vendor/github.com/docker/docker/api/types/registry/authenticate.go
generated
vendored
@ -1,21 +0,0 @@
|
|||||||
package registry // import "github.com/docker/docker/api/types/registry"
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// DO NOT EDIT THIS FILE
|
|
||||||
// This file was generated by `swagger generate operation`
|
|
||||||
//
|
|
||||||
// See hack/generate-swagger-api.sh
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// AuthenticateOKBody authenticate o k body
|
|
||||||
// swagger:model AuthenticateOKBody
|
|
||||||
type AuthenticateOKBody struct {
|
|
||||||
|
|
||||||
// An opaque token used to authenticate a user after a successful login
|
|
||||||
// Required: true
|
|
||||||
IdentityToken string `json:"IdentityToken"`
|
|
||||||
|
|
||||||
// The status of the authentication
|
|
||||||
// Required: true
|
|
||||||
Status string `json:"Status"`
|
|
||||||
}
|
|
119
vendor/github.com/docker/docker/api/types/registry/registry.go
generated
vendored
119
vendor/github.com/docker/docker/api/types/registry/registry.go
generated
vendored
@ -1,119 +0,0 @@
|
|||||||
package registry // import "github.com/docker/docker/api/types/registry"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net"
|
|
||||||
|
|
||||||
"github.com/opencontainers/image-spec/specs-go/v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ServiceConfig stores daemon registry services configuration.
|
|
||||||
type ServiceConfig struct {
|
|
||||||
AllowNondistributableArtifactsCIDRs []*NetIPNet
|
|
||||||
AllowNondistributableArtifactsHostnames []string
|
|
||||||
InsecureRegistryCIDRs []*NetIPNet `json:"InsecureRegistryCIDRs"`
|
|
||||||
IndexConfigs map[string]*IndexInfo `json:"IndexConfigs"`
|
|
||||||
Mirrors []string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetIPNet is the net.IPNet type, which can be marshalled and
|
|
||||||
// unmarshalled to JSON
|
|
||||||
type NetIPNet net.IPNet
|
|
||||||
|
|
||||||
// String returns the CIDR notation of ipnet
|
|
||||||
func (ipnet *NetIPNet) String() string {
|
|
||||||
return (*net.IPNet)(ipnet).String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON returns the JSON representation of the IPNet
|
|
||||||
func (ipnet *NetIPNet) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal((*net.IPNet)(ipnet).String())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON sets the IPNet from a byte array of JSON
|
|
||||||
func (ipnet *NetIPNet) UnmarshalJSON(b []byte) (err error) {
|
|
||||||
var ipnetStr string
|
|
||||||
if err = json.Unmarshal(b, &ipnetStr); err == nil {
|
|
||||||
var cidr *net.IPNet
|
|
||||||
if _, cidr, err = net.ParseCIDR(ipnetStr); err == nil {
|
|
||||||
*ipnet = NetIPNet(*cidr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// IndexInfo contains information about a registry
|
|
||||||
//
|
|
||||||
// RepositoryInfo Examples:
|
|
||||||
// {
|
|
||||||
// "Index" : {
|
|
||||||
// "Name" : "docker.io",
|
|
||||||
// "Mirrors" : ["https://registry-2.docker.io/v1/", "https://registry-3.docker.io/v1/"],
|
|
||||||
// "Secure" : true,
|
|
||||||
// "Official" : true,
|
|
||||||
// },
|
|
||||||
// "RemoteName" : "library/debian",
|
|
||||||
// "LocalName" : "debian",
|
|
||||||
// "CanonicalName" : "docker.io/debian"
|
|
||||||
// "Official" : true,
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// {
|
|
||||||
// "Index" : {
|
|
||||||
// "Name" : "127.0.0.1:5000",
|
|
||||||
// "Mirrors" : [],
|
|
||||||
// "Secure" : false,
|
|
||||||
// "Official" : false,
|
|
||||||
// },
|
|
||||||
// "RemoteName" : "user/repo",
|
|
||||||
// "LocalName" : "127.0.0.1:5000/user/repo",
|
|
||||||
// "CanonicalName" : "127.0.0.1:5000/user/repo",
|
|
||||||
// "Official" : false,
|
|
||||||
// }
|
|
||||||
type IndexInfo struct {
|
|
||||||
// Name is the name of the registry, such as "docker.io"
|
|
||||||
Name string
|
|
||||||
// Mirrors is a list of mirrors, expressed as URIs
|
|
||||||
Mirrors []string
|
|
||||||
// Secure is set to false if the registry is part of the list of
|
|
||||||
// insecure registries. Insecure registries accept HTTP and/or accept
|
|
||||||
// HTTPS with certificates from unknown CAs.
|
|
||||||
Secure bool
|
|
||||||
// Official indicates whether this is an official registry
|
|
||||||
Official bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// SearchResult describes a search result returned from a registry
|
|
||||||
type SearchResult struct {
|
|
||||||
// StarCount indicates the number of stars this repository has
|
|
||||||
StarCount int `json:"star_count"`
|
|
||||||
// IsOfficial is true if the result is from an official repository.
|
|
||||||
IsOfficial bool `json:"is_official"`
|
|
||||||
// Name is the name of the repository
|
|
||||||
Name string `json:"name"`
|
|
||||||
// IsAutomated indicates whether the result is automated
|
|
||||||
IsAutomated bool `json:"is_automated"`
|
|
||||||
// Description is a textual description of the repository
|
|
||||||
Description string `json:"description"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// SearchResults lists a collection search results returned from a registry
|
|
||||||
type SearchResults struct {
|
|
||||||
// Query contains the query string that generated the search results
|
|
||||||
Query string `json:"query"`
|
|
||||||
// NumResults indicates the number of results the query returned
|
|
||||||
NumResults int `json:"num_results"`
|
|
||||||
// Results is a slice containing the actual results for the search
|
|
||||||
Results []SearchResult `json:"results"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// DistributionInspect describes the result obtained from contacting the
|
|
||||||
// registry to retrieve image metadata
|
|
||||||
type DistributionInspect struct {
|
|
||||||
// Descriptor contains information about the manifest, including
|
|
||||||
// the content addressable digest
|
|
||||||
Descriptor v1.Descriptor
|
|
||||||
// Platforms contains the list of platforms supported by the image,
|
|
||||||
// obtained by parsing the manifest
|
|
||||||
Platforms []v1.Platform
|
|
||||||
}
|
|
93
vendor/github.com/docker/docker/api/types/seccomp.go
generated
vendored
93
vendor/github.com/docker/docker/api/types/seccomp.go
generated
vendored
@ -1,93 +0,0 @@
|
|||||||
package types // import "github.com/docker/docker/api/types"
|
|
||||||
|
|
||||||
// Seccomp represents the config for a seccomp profile for syscall restriction.
|
|
||||||
type Seccomp struct {
|
|
||||||
DefaultAction Action `json:"defaultAction"`
|
|
||||||
// Architectures is kept to maintain backward compatibility with the old
|
|
||||||
// seccomp profile.
|
|
||||||
Architectures []Arch `json:"architectures,omitempty"`
|
|
||||||
ArchMap []Architecture `json:"archMap,omitempty"`
|
|
||||||
Syscalls []*Syscall `json:"syscalls"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Architecture is used to represent a specific architecture
|
|
||||||
// and its sub-architectures
|
|
||||||
type Architecture struct {
|
|
||||||
Arch Arch `json:"architecture"`
|
|
||||||
SubArches []Arch `json:"subArchitectures"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Arch used for architectures
|
|
||||||
type Arch string
|
|
||||||
|
|
||||||
// Additional architectures permitted to be used for system calls
|
|
||||||
// By default only the native architecture of the kernel is permitted
|
|
||||||
const (
|
|
||||||
ArchX86 Arch = "SCMP_ARCH_X86"
|
|
||||||
ArchX86_64 Arch = "SCMP_ARCH_X86_64"
|
|
||||||
ArchX32 Arch = "SCMP_ARCH_X32"
|
|
||||||
ArchARM Arch = "SCMP_ARCH_ARM"
|
|
||||||
ArchAARCH64 Arch = "SCMP_ARCH_AARCH64"
|
|
||||||
ArchMIPS Arch = "SCMP_ARCH_MIPS"
|
|
||||||
ArchMIPS64 Arch = "SCMP_ARCH_MIPS64"
|
|
||||||
ArchMIPS64N32 Arch = "SCMP_ARCH_MIPS64N32"
|
|
||||||
ArchMIPSEL Arch = "SCMP_ARCH_MIPSEL"
|
|
||||||
ArchMIPSEL64 Arch = "SCMP_ARCH_MIPSEL64"
|
|
||||||
ArchMIPSEL64N32 Arch = "SCMP_ARCH_MIPSEL64N32"
|
|
||||||
ArchPPC Arch = "SCMP_ARCH_PPC"
|
|
||||||
ArchPPC64 Arch = "SCMP_ARCH_PPC64"
|
|
||||||
ArchPPC64LE Arch = "SCMP_ARCH_PPC64LE"
|
|
||||||
ArchS390 Arch = "SCMP_ARCH_S390"
|
|
||||||
ArchS390X Arch = "SCMP_ARCH_S390X"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Action taken upon Seccomp rule match
|
|
||||||
type Action string
|
|
||||||
|
|
||||||
// Define actions for Seccomp rules
|
|
||||||
const (
|
|
||||||
ActKill Action = "SCMP_ACT_KILL"
|
|
||||||
ActTrap Action = "SCMP_ACT_TRAP"
|
|
||||||
ActErrno Action = "SCMP_ACT_ERRNO"
|
|
||||||
ActTrace Action = "SCMP_ACT_TRACE"
|
|
||||||
ActAllow Action = "SCMP_ACT_ALLOW"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Operator used to match syscall arguments in Seccomp
|
|
||||||
type Operator string
|
|
||||||
|
|
||||||
// Define operators for syscall arguments in Seccomp
|
|
||||||
const (
|
|
||||||
OpNotEqual Operator = "SCMP_CMP_NE"
|
|
||||||
OpLessThan Operator = "SCMP_CMP_LT"
|
|
||||||
OpLessEqual Operator = "SCMP_CMP_LE"
|
|
||||||
OpEqualTo Operator = "SCMP_CMP_EQ"
|
|
||||||
OpGreaterEqual Operator = "SCMP_CMP_GE"
|
|
||||||
OpGreaterThan Operator = "SCMP_CMP_GT"
|
|
||||||
OpMaskedEqual Operator = "SCMP_CMP_MASKED_EQ"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Arg used for matching specific syscall arguments in Seccomp
|
|
||||||
type Arg struct {
|
|
||||||
Index uint `json:"index"`
|
|
||||||
Value uint64 `json:"value"`
|
|
||||||
ValueTwo uint64 `json:"valueTwo"`
|
|
||||||
Op Operator `json:"op"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Filter is used to conditionally apply Seccomp rules
|
|
||||||
type Filter struct {
|
|
||||||
Caps []string `json:"caps,omitempty"`
|
|
||||||
Arches []string `json:"arches,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Syscall is used to match a group of syscalls in Seccomp
|
|
||||||
type Syscall struct {
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
Names []string `json:"names,omitempty"`
|
|
||||||
Action Action `json:"action"`
|
|
||||||
Args []*Arg `json:"args"`
|
|
||||||
Comment string `json:"comment"`
|
|
||||||
Includes Filter `json:"includes"`
|
|
||||||
Excludes Filter `json:"excludes"`
|
|
||||||
}
|
|
12
vendor/github.com/docker/docker/api/types/service_update_response.go
generated
vendored
12
vendor/github.com/docker/docker/api/types/service_update_response.go
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// ServiceUpdateResponse service update response
|
|
||||||
// swagger:model ServiceUpdateResponse
|
|
||||||
type ServiceUpdateResponse struct {
|
|
||||||
|
|
||||||
// Optional warning messages
|
|
||||||
Warnings []string `json:"Warnings"`
|
|
||||||
}
|
|
181
vendor/github.com/docker/docker/api/types/stats.go
generated
vendored
181
vendor/github.com/docker/docker/api/types/stats.go
generated
vendored
@ -1,181 +0,0 @@
|
|||||||
// Package types is used for API stability in the types and response to the
|
|
||||||
// consumers of the API stats endpoint.
|
|
||||||
package types // import "github.com/docker/docker/api/types"
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
// ThrottlingData stores CPU throttling stats of one running container.
|
|
||||||
// Not used on Windows.
|
|
||||||
type ThrottlingData struct {
|
|
||||||
// Number of periods with throttling active
|
|
||||||
Periods uint64 `json:"periods"`
|
|
||||||
// Number of periods when the container hits its throttling limit.
|
|
||||||
ThrottledPeriods uint64 `json:"throttled_periods"`
|
|
||||||
// Aggregate time the container was throttled for in nanoseconds.
|
|
||||||
ThrottledTime uint64 `json:"throttled_time"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CPUUsage stores All CPU stats aggregated since container inception.
|
|
||||||
type CPUUsage struct {
|
|
||||||
// Total CPU time consumed.
|
|
||||||
// Units: nanoseconds (Linux)
|
|
||||||
// Units: 100's of nanoseconds (Windows)
|
|
||||||
TotalUsage uint64 `json:"total_usage"`
|
|
||||||
|
|
||||||
// Total CPU time consumed per core (Linux). Not used on Windows.
|
|
||||||
// Units: nanoseconds.
|
|
||||||
PercpuUsage []uint64 `json:"percpu_usage,omitempty"`
|
|
||||||
|
|
||||||
// Time spent by tasks of the cgroup in kernel mode (Linux).
|
|
||||||
// Time spent by all container processes in kernel mode (Windows).
|
|
||||||
// Units: nanoseconds (Linux).
|
|
||||||
// Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers.
|
|
||||||
UsageInKernelmode uint64 `json:"usage_in_kernelmode"`
|
|
||||||
|
|
||||||
// Time spent by tasks of the cgroup in user mode (Linux).
|
|
||||||
// Time spent by all container processes in user mode (Windows).
|
|
||||||
// Units: nanoseconds (Linux).
|
|
||||||
// Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers
|
|
||||||
UsageInUsermode uint64 `json:"usage_in_usermode"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CPUStats aggregates and wraps all CPU related info of container
|
|
||||||
type CPUStats struct {
|
|
||||||
// CPU Usage. Linux and Windows.
|
|
||||||
CPUUsage CPUUsage `json:"cpu_usage"`
|
|
||||||
|
|
||||||
// System Usage. Linux only.
|
|
||||||
SystemUsage uint64 `json:"system_cpu_usage,omitempty"`
|
|
||||||
|
|
||||||
// Online CPUs. Linux only.
|
|
||||||
OnlineCPUs uint32 `json:"online_cpus,omitempty"`
|
|
||||||
|
|
||||||
// Throttling Data. Linux only.
|
|
||||||
ThrottlingData ThrottlingData `json:"throttling_data,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// MemoryStats aggregates all memory stats since container inception on Linux.
|
|
||||||
// Windows returns stats for commit and private working set only.
|
|
||||||
type MemoryStats struct {
|
|
||||||
// Linux Memory Stats
|
|
||||||
|
|
||||||
// current res_counter usage for memory
|
|
||||||
Usage uint64 `json:"usage,omitempty"`
|
|
||||||
// maximum usage ever recorded.
|
|
||||||
MaxUsage uint64 `json:"max_usage,omitempty"`
|
|
||||||
// TODO(vishh): Export these as stronger types.
|
|
||||||
// all the stats exported via memory.stat.
|
|
||||||
Stats map[string]uint64 `json:"stats,omitempty"`
|
|
||||||
// number of times memory usage hits limits.
|
|
||||||
Failcnt uint64 `json:"failcnt,omitempty"`
|
|
||||||
Limit uint64 `json:"limit,omitempty"`
|
|
||||||
|
|
||||||
// Windows Memory Stats
|
|
||||||
// See https://technet.microsoft.com/en-us/magazine/ff382715.aspx
|
|
||||||
|
|
||||||
// committed bytes
|
|
||||||
Commit uint64 `json:"commitbytes,omitempty"`
|
|
||||||
// peak committed bytes
|
|
||||||
CommitPeak uint64 `json:"commitpeakbytes,omitempty"`
|
|
||||||
// private working set
|
|
||||||
PrivateWorkingSet uint64 `json:"privateworkingset,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// BlkioStatEntry is one small entity to store a piece of Blkio stats
|
|
||||||
// Not used on Windows.
|
|
||||||
type BlkioStatEntry struct {
|
|
||||||
Major uint64 `json:"major"`
|
|
||||||
Minor uint64 `json:"minor"`
|
|
||||||
Op string `json:"op"`
|
|
||||||
Value uint64 `json:"value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// BlkioStats stores All IO service stats for data read and write.
|
|
||||||
// This is a Linux specific structure as the differences between expressing
|
|
||||||
// block I/O on Windows and Linux are sufficiently significant to make
|
|
||||||
// little sense attempting to morph into a combined structure.
|
|
||||||
type BlkioStats struct {
|
|
||||||
// number of bytes transferred to and from the block device
|
|
||||||
IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"`
|
|
||||||
IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive"`
|
|
||||||
IoQueuedRecursive []BlkioStatEntry `json:"io_queue_recursive"`
|
|
||||||
IoServiceTimeRecursive []BlkioStatEntry `json:"io_service_time_recursive"`
|
|
||||||
IoWaitTimeRecursive []BlkioStatEntry `json:"io_wait_time_recursive"`
|
|
||||||
IoMergedRecursive []BlkioStatEntry `json:"io_merged_recursive"`
|
|
||||||
IoTimeRecursive []BlkioStatEntry `json:"io_time_recursive"`
|
|
||||||
SectorsRecursive []BlkioStatEntry `json:"sectors_recursive"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// StorageStats is the disk I/O stats for read/write on Windows.
|
|
||||||
type StorageStats struct {
|
|
||||||
ReadCountNormalized uint64 `json:"read_count_normalized,omitempty"`
|
|
||||||
ReadSizeBytes uint64 `json:"read_size_bytes,omitempty"`
|
|
||||||
WriteCountNormalized uint64 `json:"write_count_normalized,omitempty"`
|
|
||||||
WriteSizeBytes uint64 `json:"write_size_bytes,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkStats aggregates the network stats of one container
|
|
||||||
type NetworkStats struct {
|
|
||||||
// Bytes received. Windows and Linux.
|
|
||||||
RxBytes uint64 `json:"rx_bytes"`
|
|
||||||
// Packets received. Windows and Linux.
|
|
||||||
RxPackets uint64 `json:"rx_packets"`
|
|
||||||
// Received errors. Not used on Windows. Note that we dont `omitempty` this
|
|
||||||
// field as it is expected in the >=v1.21 API stats structure.
|
|
||||||
RxErrors uint64 `json:"rx_errors"`
|
|
||||||
// Incoming packets dropped. Windows and Linux.
|
|
||||||
RxDropped uint64 `json:"rx_dropped"`
|
|
||||||
// Bytes sent. Windows and Linux.
|
|
||||||
TxBytes uint64 `json:"tx_bytes"`
|
|
||||||
// Packets sent. Windows and Linux.
|
|
||||||
TxPackets uint64 `json:"tx_packets"`
|
|
||||||
// Sent errors. Not used on Windows. Note that we dont `omitempty` this
|
|
||||||
// field as it is expected in the >=v1.21 API stats structure.
|
|
||||||
TxErrors uint64 `json:"tx_errors"`
|
|
||||||
// Outgoing packets dropped. Windows and Linux.
|
|
||||||
TxDropped uint64 `json:"tx_dropped"`
|
|
||||||
// Endpoint ID. Not used on Linux.
|
|
||||||
EndpointID string `json:"endpoint_id,omitempty"`
|
|
||||||
// Instance ID. Not used on Linux.
|
|
||||||
InstanceID string `json:"instance_id,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PidsStats contains the stats of a container's pids
|
|
||||||
type PidsStats struct {
|
|
||||||
// Current is the number of pids in the cgroup
|
|
||||||
Current uint64 `json:"current,omitempty"`
|
|
||||||
// Limit is the hard limit on the number of pids in the cgroup.
|
|
||||||
// A "Limit" of 0 means that there is no limit.
|
|
||||||
Limit uint64 `json:"limit,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stats is Ultimate struct aggregating all types of stats of one container
|
|
||||||
type Stats struct {
|
|
||||||
// Common stats
|
|
||||||
Read time.Time `json:"read"`
|
|
||||||
PreRead time.Time `json:"preread"`
|
|
||||||
|
|
||||||
// Linux specific stats, not populated on Windows.
|
|
||||||
PidsStats PidsStats `json:"pids_stats,omitempty"`
|
|
||||||
BlkioStats BlkioStats `json:"blkio_stats,omitempty"`
|
|
||||||
|
|
||||||
// Windows specific stats, not populated on Linux.
|
|
||||||
NumProcs uint32 `json:"num_procs"`
|
|
||||||
StorageStats StorageStats `json:"storage_stats,omitempty"`
|
|
||||||
|
|
||||||
// Shared stats
|
|
||||||
CPUStats CPUStats `json:"cpu_stats,omitempty"`
|
|
||||||
PreCPUStats CPUStats `json:"precpu_stats,omitempty"` // "Pre"="Previous"
|
|
||||||
MemoryStats MemoryStats `json:"memory_stats,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// StatsJSON is newly used Networks
|
|
||||||
type StatsJSON struct {
|
|
||||||
Stats
|
|
||||||
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
ID string `json:"id,omitempty"`
|
|
||||||
|
|
||||||
// Networks request version >=1.21
|
|
||||||
Networks map[string]NetworkStats `json:"networks,omitempty"`
|
|
||||||
}
|
|
30
vendor/github.com/docker/docker/api/types/strslice/strslice.go
generated
vendored
30
vendor/github.com/docker/docker/api/types/strslice/strslice.go
generated
vendored
@ -1,30 +0,0 @@
|
|||||||
package strslice // import "github.com/docker/docker/api/types/strslice"
|
|
||||||
|
|
||||||
import "encoding/json"
|
|
||||||
|
|
||||||
// StrSlice represents a string or an array of strings.
|
|
||||||
// We need to override the json decoder to accept both options.
|
|
||||||
type StrSlice []string
|
|
||||||
|
|
||||||
// UnmarshalJSON decodes the byte slice whether it's a string or an array of
|
|
||||||
// strings. This method is needed to implement json.Unmarshaler.
|
|
||||||
func (e *StrSlice) UnmarshalJSON(b []byte) error {
|
|
||||||
if len(b) == 0 {
|
|
||||||
// With no input, we preserve the existing value by returning nil and
|
|
||||||
// leaving the target alone. This allows defining default values for
|
|
||||||
// the type.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
p := make([]string, 0, 1)
|
|
||||||
if err := json.Unmarshal(b, &p); err != nil {
|
|
||||||
var s string
|
|
||||||
if err := json.Unmarshal(b, &s); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
p = append(p, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
*e = p
|
|
||||||
return nil
|
|
||||||
}
|
|
40
vendor/github.com/docker/docker/api/types/swarm/common.go
generated
vendored
40
vendor/github.com/docker/docker/api/types/swarm/common.go
generated
vendored
@ -1,40 +0,0 @@
|
|||||||
package swarm // import "github.com/docker/docker/api/types/swarm"
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
// Version represents the internal object version.
|
|
||||||
type Version struct {
|
|
||||||
Index uint64 `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Meta is a base object inherited by most of the other once.
|
|
||||||
type Meta struct {
|
|
||||||
Version Version `json:",omitempty"`
|
|
||||||
CreatedAt time.Time `json:",omitempty"`
|
|
||||||
UpdatedAt time.Time `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Annotations represents how to describe an object.
|
|
||||||
type Annotations struct {
|
|
||||||
Name string `json:",omitempty"`
|
|
||||||
Labels map[string]string `json:"Labels"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Driver represents a driver (network, logging, secrets backend).
|
|
||||||
type Driver struct {
|
|
||||||
Name string `json:",omitempty"`
|
|
||||||
Options map[string]string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TLSInfo represents the TLS information about what CA certificate is trusted,
|
|
||||||
// and who the issuer for a TLS certificate is
|
|
||||||
type TLSInfo struct {
|
|
||||||
// TrustRoot is the trusted CA root certificate in PEM format
|
|
||||||
TrustRoot string `json:",omitempty"`
|
|
||||||
|
|
||||||
// CertIssuer is the raw subject bytes of the issuer
|
|
||||||
CertIssuerSubject []byte `json:",omitempty"`
|
|
||||||
|
|
||||||
// CertIssuerPublicKey is the raw public key bytes of the issuer
|
|
||||||
CertIssuerPublicKey []byte `json:",omitempty"`
|
|
||||||
}
|
|
35
vendor/github.com/docker/docker/api/types/swarm/config.go
generated
vendored
35
vendor/github.com/docker/docker/api/types/swarm/config.go
generated
vendored
@ -1,35 +0,0 @@
|
|||||||
package swarm // import "github.com/docker/docker/api/types/swarm"
|
|
||||||
|
|
||||||
import "os"
|
|
||||||
|
|
||||||
// Config represents a config.
|
|
||||||
type Config struct {
|
|
||||||
ID string
|
|
||||||
Meta
|
|
||||||
Spec ConfigSpec
|
|
||||||
}
|
|
||||||
|
|
||||||
// ConfigSpec represents a config specification from a config in swarm
|
|
||||||
type ConfigSpec struct {
|
|
||||||
Annotations
|
|
||||||
Data []byte `json:",omitempty"`
|
|
||||||
|
|
||||||
// Templating controls whether and how to evaluate the config payload as
|
|
||||||
// a template. If it is not set, no templating is used.
|
|
||||||
Templating *Driver `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ConfigReferenceFileTarget is a file target in a config reference
|
|
||||||
type ConfigReferenceFileTarget struct {
|
|
||||||
Name string
|
|
||||||
UID string
|
|
||||||
GID string
|
|
||||||
Mode os.FileMode
|
|
||||||
}
|
|
||||||
|
|
||||||
// ConfigReference is a reference to a config in swarm
|
|
||||||
type ConfigReference struct {
|
|
||||||
File *ConfigReferenceFileTarget
|
|
||||||
ConfigID string
|
|
||||||
ConfigName string
|
|
||||||
}
|
|
73
vendor/github.com/docker/docker/api/types/swarm/container.go
generated
vendored
73
vendor/github.com/docker/docker/api/types/swarm/container.go
generated
vendored
@ -1,73 +0,0 @@
|
|||||||
package swarm // import "github.com/docker/docker/api/types/swarm"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/container"
|
|
||||||
"github.com/docker/docker/api/types/mount"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DNSConfig specifies DNS related configurations in resolver configuration file (resolv.conf)
|
|
||||||
// Detailed documentation is available in:
|
|
||||||
// http://man7.org/linux/man-pages/man5/resolv.conf.5.html
|
|
||||||
// `nameserver`, `search`, `options` have been supported.
|
|
||||||
// TODO: `domain` is not supported yet.
|
|
||||||
type DNSConfig struct {
|
|
||||||
// Nameservers specifies the IP addresses of the name servers
|
|
||||||
Nameservers []string `json:",omitempty"`
|
|
||||||
// Search specifies the search list for host-name lookup
|
|
||||||
Search []string `json:",omitempty"`
|
|
||||||
// Options allows certain internal resolver variables to be modified
|
|
||||||
Options []string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// SELinuxContext contains the SELinux labels of the container.
|
|
||||||
type SELinuxContext struct {
|
|
||||||
Disable bool
|
|
||||||
|
|
||||||
User string
|
|
||||||
Role string
|
|
||||||
Type string
|
|
||||||
Level string
|
|
||||||
}
|
|
||||||
|
|
||||||
// CredentialSpec for managed service account (Windows only)
|
|
||||||
type CredentialSpec struct {
|
|
||||||
File string
|
|
||||||
Registry string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Privileges defines the security options for the container.
|
|
||||||
type Privileges struct {
|
|
||||||
CredentialSpec *CredentialSpec
|
|
||||||
SELinuxContext *SELinuxContext
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerSpec represents the spec of a container.
|
|
||||||
type ContainerSpec struct {
|
|
||||||
Image string `json:",omitempty"`
|
|
||||||
Labels map[string]string `json:",omitempty"`
|
|
||||||
Command []string `json:",omitempty"`
|
|
||||||
Args []string `json:",omitempty"`
|
|
||||||
Hostname string `json:",omitempty"`
|
|
||||||
Env []string `json:",omitempty"`
|
|
||||||
Dir string `json:",omitempty"`
|
|
||||||
User string `json:",omitempty"`
|
|
||||||
Groups []string `json:",omitempty"`
|
|
||||||
Privileges *Privileges `json:",omitempty"`
|
|
||||||
StopSignal string `json:",omitempty"`
|
|
||||||
TTY bool `json:",omitempty"`
|
|
||||||
OpenStdin bool `json:",omitempty"`
|
|
||||||
ReadOnly bool `json:",omitempty"`
|
|
||||||
Mounts []mount.Mount `json:",omitempty"`
|
|
||||||
StopGracePeriod *time.Duration `json:",omitempty"`
|
|
||||||
Healthcheck *container.HealthConfig `json:",omitempty"`
|
|
||||||
// The format of extra hosts on swarmkit is specified in:
|
|
||||||
// http://man7.org/linux/man-pages/man5/hosts.5.html
|
|
||||||
// IP_address canonical_hostname [aliases...]
|
|
||||||
Hosts []string `json:",omitempty"`
|
|
||||||
DNSConfig *DNSConfig `json:",omitempty"`
|
|
||||||
Secrets []*SecretReference `json:",omitempty"`
|
|
||||||
Configs []*ConfigReference `json:",omitempty"`
|
|
||||||
Isolation container.Isolation `json:",omitempty"`
|
|
||||||
}
|
|
121
vendor/github.com/docker/docker/api/types/swarm/network.go
generated
vendored
121
vendor/github.com/docker/docker/api/types/swarm/network.go
generated
vendored
@ -1,121 +0,0 @@
|
|||||||
package swarm // import "github.com/docker/docker/api/types/swarm"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/docker/docker/api/types/network"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Endpoint represents an endpoint.
|
|
||||||
type Endpoint struct {
|
|
||||||
Spec EndpointSpec `json:",omitempty"`
|
|
||||||
Ports []PortConfig `json:",omitempty"`
|
|
||||||
VirtualIPs []EndpointVirtualIP `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// EndpointSpec represents the spec of an endpoint.
|
|
||||||
type EndpointSpec struct {
|
|
||||||
Mode ResolutionMode `json:",omitempty"`
|
|
||||||
Ports []PortConfig `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolutionMode represents a resolution mode.
|
|
||||||
type ResolutionMode string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// ResolutionModeVIP VIP
|
|
||||||
ResolutionModeVIP ResolutionMode = "vip"
|
|
||||||
// ResolutionModeDNSRR DNSRR
|
|
||||||
ResolutionModeDNSRR ResolutionMode = "dnsrr"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PortConfig represents the config of a port.
|
|
||||||
type PortConfig struct {
|
|
||||||
Name string `json:",omitempty"`
|
|
||||||
Protocol PortConfigProtocol `json:",omitempty"`
|
|
||||||
// TargetPort is the port inside the container
|
|
||||||
TargetPort uint32 `json:",omitempty"`
|
|
||||||
// PublishedPort is the port on the swarm hosts
|
|
||||||
PublishedPort uint32 `json:",omitempty"`
|
|
||||||
// PublishMode is the mode in which port is published
|
|
||||||
PublishMode PortConfigPublishMode `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PortConfigPublishMode represents the mode in which the port is to
|
|
||||||
// be published.
|
|
||||||
type PortConfigPublishMode string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// PortConfigPublishModeIngress is used for ports published
|
|
||||||
// for ingress load balancing using routing mesh.
|
|
||||||
PortConfigPublishModeIngress PortConfigPublishMode = "ingress"
|
|
||||||
// PortConfigPublishModeHost is used for ports published
|
|
||||||
// for direct host level access on the host where the task is running.
|
|
||||||
PortConfigPublishModeHost PortConfigPublishMode = "host"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PortConfigProtocol represents the protocol of a port.
|
|
||||||
type PortConfigProtocol string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// TODO(stevvooe): These should be used generally, not just for PortConfig.
|
|
||||||
|
|
||||||
// PortConfigProtocolTCP TCP
|
|
||||||
PortConfigProtocolTCP PortConfigProtocol = "tcp"
|
|
||||||
// PortConfigProtocolUDP UDP
|
|
||||||
PortConfigProtocolUDP PortConfigProtocol = "udp"
|
|
||||||
// PortConfigProtocolSCTP SCTP
|
|
||||||
PortConfigProtocolSCTP PortConfigProtocol = "sctp"
|
|
||||||
)
|
|
||||||
|
|
||||||
// EndpointVirtualIP represents the virtual ip of a port.
|
|
||||||
type EndpointVirtualIP struct {
|
|
||||||
NetworkID string `json:",omitempty"`
|
|
||||||
Addr string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Network represents a network.
|
|
||||||
type Network struct {
|
|
||||||
ID string
|
|
||||||
Meta
|
|
||||||
Spec NetworkSpec `json:",omitempty"`
|
|
||||||
DriverState Driver `json:",omitempty"`
|
|
||||||
IPAMOptions *IPAMOptions `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkSpec represents the spec of a network.
|
|
||||||
type NetworkSpec struct {
|
|
||||||
Annotations
|
|
||||||
DriverConfiguration *Driver `json:",omitempty"`
|
|
||||||
IPv6Enabled bool `json:",omitempty"`
|
|
||||||
Internal bool `json:",omitempty"`
|
|
||||||
Attachable bool `json:",omitempty"`
|
|
||||||
Ingress bool `json:",omitempty"`
|
|
||||||
IPAMOptions *IPAMOptions `json:",omitempty"`
|
|
||||||
ConfigFrom *network.ConfigReference `json:",omitempty"`
|
|
||||||
Scope string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkAttachmentConfig represents the configuration of a network attachment.
|
|
||||||
type NetworkAttachmentConfig struct {
|
|
||||||
Target string `json:",omitempty"`
|
|
||||||
Aliases []string `json:",omitempty"`
|
|
||||||
DriverOpts map[string]string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkAttachment represents a network attachment.
|
|
||||||
type NetworkAttachment struct {
|
|
||||||
Network Network `json:",omitempty"`
|
|
||||||
Addresses []string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPAMOptions represents ipam options.
|
|
||||||
type IPAMOptions struct {
|
|
||||||
Driver Driver `json:",omitempty"`
|
|
||||||
Configs []IPAMConfig `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPAMConfig represents ipam configuration.
|
|
||||||
type IPAMConfig struct {
|
|
||||||
Subnet string `json:",omitempty"`
|
|
||||||
Range string `json:",omitempty"`
|
|
||||||
Gateway string `json:",omitempty"`
|
|
||||||
}
|
|
115
vendor/github.com/docker/docker/api/types/swarm/node.go
generated
vendored
115
vendor/github.com/docker/docker/api/types/swarm/node.go
generated
vendored
@ -1,115 +0,0 @@
|
|||||||
package swarm // import "github.com/docker/docker/api/types/swarm"
|
|
||||||
|
|
||||||
// Node represents a node.
|
|
||||||
type Node struct {
|
|
||||||
ID string
|
|
||||||
Meta
|
|
||||||
// Spec defines the desired state of the node as specified by the user.
|
|
||||||
// The system will honor this and will *never* modify it.
|
|
||||||
Spec NodeSpec `json:",omitempty"`
|
|
||||||
// Description encapsulates the properties of the Node as reported by the
|
|
||||||
// agent.
|
|
||||||
Description NodeDescription `json:",omitempty"`
|
|
||||||
// Status provides the current status of the node, as seen by the manager.
|
|
||||||
Status NodeStatus `json:",omitempty"`
|
|
||||||
// ManagerStatus provides the current status of the node's manager
|
|
||||||
// component, if the node is a manager.
|
|
||||||
ManagerStatus *ManagerStatus `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeSpec represents the spec of a node.
|
|
||||||
type NodeSpec struct {
|
|
||||||
Annotations
|
|
||||||
Role NodeRole `json:",omitempty"`
|
|
||||||
Availability NodeAvailability `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeRole represents the role of a node.
|
|
||||||
type NodeRole string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// NodeRoleWorker WORKER
|
|
||||||
NodeRoleWorker NodeRole = "worker"
|
|
||||||
// NodeRoleManager MANAGER
|
|
||||||
NodeRoleManager NodeRole = "manager"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NodeAvailability represents the availability of a node.
|
|
||||||
type NodeAvailability string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// NodeAvailabilityActive ACTIVE
|
|
||||||
NodeAvailabilityActive NodeAvailability = "active"
|
|
||||||
// NodeAvailabilityPause PAUSE
|
|
||||||
NodeAvailabilityPause NodeAvailability = "pause"
|
|
||||||
// NodeAvailabilityDrain DRAIN
|
|
||||||
NodeAvailabilityDrain NodeAvailability = "drain"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NodeDescription represents the description of a node.
|
|
||||||
type NodeDescription struct {
|
|
||||||
Hostname string `json:",omitempty"`
|
|
||||||
Platform Platform `json:",omitempty"`
|
|
||||||
Resources Resources `json:",omitempty"`
|
|
||||||
Engine EngineDescription `json:",omitempty"`
|
|
||||||
TLSInfo TLSInfo `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Platform represents the platform (Arch/OS).
|
|
||||||
type Platform struct {
|
|
||||||
Architecture string `json:",omitempty"`
|
|
||||||
OS string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// EngineDescription represents the description of an engine.
|
|
||||||
type EngineDescription struct {
|
|
||||||
EngineVersion string `json:",omitempty"`
|
|
||||||
Labels map[string]string `json:",omitempty"`
|
|
||||||
Plugins []PluginDescription `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginDescription represents the description of an engine plugin.
|
|
||||||
type PluginDescription struct {
|
|
||||||
Type string `json:",omitempty"`
|
|
||||||
Name string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeStatus represents the status of a node.
|
|
||||||
type NodeStatus struct {
|
|
||||||
State NodeState `json:",omitempty"`
|
|
||||||
Message string `json:",omitempty"`
|
|
||||||
Addr string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reachability represents the reachability of a node.
|
|
||||||
type Reachability string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// ReachabilityUnknown UNKNOWN
|
|
||||||
ReachabilityUnknown Reachability = "unknown"
|
|
||||||
// ReachabilityUnreachable UNREACHABLE
|
|
||||||
ReachabilityUnreachable Reachability = "unreachable"
|
|
||||||
// ReachabilityReachable REACHABLE
|
|
||||||
ReachabilityReachable Reachability = "reachable"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ManagerStatus represents the status of a manager.
|
|
||||||
type ManagerStatus struct {
|
|
||||||
Leader bool `json:",omitempty"`
|
|
||||||
Reachability Reachability `json:",omitempty"`
|
|
||||||
Addr string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeState represents the state of a node.
|
|
||||||
type NodeState string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// NodeStateUnknown UNKNOWN
|
|
||||||
NodeStateUnknown NodeState = "unknown"
|
|
||||||
// NodeStateDown DOWN
|
|
||||||
NodeStateDown NodeState = "down"
|
|
||||||
// NodeStateReady READY
|
|
||||||
NodeStateReady NodeState = "ready"
|
|
||||||
// NodeStateDisconnected DISCONNECTED
|
|
||||||
NodeStateDisconnected NodeState = "disconnected"
|
|
||||||
)
|
|
27
vendor/github.com/docker/docker/api/types/swarm/runtime.go
generated
vendored
27
vendor/github.com/docker/docker/api/types/swarm/runtime.go
generated
vendored
@ -1,27 +0,0 @@
|
|||||||
package swarm // import "github.com/docker/docker/api/types/swarm"
|
|
||||||
|
|
||||||
// RuntimeType is the type of runtime used for the TaskSpec
|
|
||||||
type RuntimeType string
|
|
||||||
|
|
||||||
// RuntimeURL is the proto type url
|
|
||||||
type RuntimeURL string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// RuntimeContainer is the container based runtime
|
|
||||||
RuntimeContainer RuntimeType = "container"
|
|
||||||
// RuntimePlugin is the plugin based runtime
|
|
||||||
RuntimePlugin RuntimeType = "plugin"
|
|
||||||
// RuntimeNetworkAttachment is the network attachment runtime
|
|
||||||
RuntimeNetworkAttachment RuntimeType = "attachment"
|
|
||||||
|
|
||||||
// RuntimeURLContainer is the proto url for the container type
|
|
||||||
RuntimeURLContainer RuntimeURL = "types.docker.com/RuntimeContainer"
|
|
||||||
// RuntimeURLPlugin is the proto url for the plugin type
|
|
||||||
RuntimeURLPlugin RuntimeURL = "types.docker.com/RuntimePlugin"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NetworkAttachmentSpec represents the runtime spec type for network
|
|
||||||
// attachment tasks
|
|
||||||
type NetworkAttachmentSpec struct {
|
|
||||||
ContainerID string
|
|
||||||
}
|
|
3
vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go
generated
vendored
3
vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
//go:generate protoc -I . --gogofast_out=import_path=github.com/docker/docker/api/types/swarm/runtime:. plugin.proto
|
|
||||||
|
|
||||||
package runtime // import "github.com/docker/docker/api/types/swarm/runtime"
|
|
712
vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go
generated
vendored
712
vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go
generated
vendored
@ -1,712 +0,0 @@
|
|||||||
// Code generated by protoc-gen-gogo.
|
|
||||||
// source: plugin.proto
|
|
||||||
// DO NOT EDIT!
|
|
||||||
|
|
||||||
/*
|
|
||||||
Package runtime is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
plugin.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
PluginSpec
|
|
||||||
PluginPrivilege
|
|
||||||
*/
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
import proto "github.com/gogo/protobuf/proto"
|
|
||||||
import fmt "fmt"
|
|
||||||
import math "math"
|
|
||||||
|
|
||||||
import io "io"
|
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
|
||||||
var _ = proto.Marshal
|
|
||||||
var _ = fmt.Errorf
|
|
||||||
var _ = math.Inf
|
|
||||||
|
|
||||||
// This is a compile-time assertion to ensure that this generated file
|
|
||||||
// is compatible with the proto package it is being compiled against.
|
|
||||||
// A compilation error at this line likely means your copy of the
|
|
||||||
// proto package needs to be updated.
|
|
||||||
const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
|
|
||||||
|
|
||||||
// PluginSpec defines the base payload which clients can specify for creating
|
|
||||||
// a service with the plugin runtime.
|
|
||||||
type PluginSpec struct {
|
|
||||||
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
|
||||||
Remote string `protobuf:"bytes,2,opt,name=remote,proto3" json:"remote,omitempty"`
|
|
||||||
Privileges []*PluginPrivilege `protobuf:"bytes,3,rep,name=privileges" json:"privileges,omitempty"`
|
|
||||||
Disabled bool `protobuf:"varint,4,opt,name=disabled,proto3" json:"disabled,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginSpec) Reset() { *m = PluginSpec{} }
|
|
||||||
func (m *PluginSpec) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*PluginSpec) ProtoMessage() {}
|
|
||||||
func (*PluginSpec) Descriptor() ([]byte, []int) { return fileDescriptorPlugin, []int{0} }
|
|
||||||
|
|
||||||
func (m *PluginSpec) GetName() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Name
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginSpec) GetRemote() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Remote
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginSpec) GetPrivileges() []*PluginPrivilege {
|
|
||||||
if m != nil {
|
|
||||||
return m.Privileges
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginSpec) GetDisabled() bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.Disabled
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginPrivilege describes a permission the user has to accept
|
|
||||||
// upon installing a plugin.
|
|
||||||
type PluginPrivilege struct {
|
|
||||||
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
|
||||||
Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
|
|
||||||
Value []string `protobuf:"bytes,3,rep,name=value" json:"value,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginPrivilege) Reset() { *m = PluginPrivilege{} }
|
|
||||||
func (m *PluginPrivilege) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*PluginPrivilege) ProtoMessage() {}
|
|
||||||
func (*PluginPrivilege) Descriptor() ([]byte, []int) { return fileDescriptorPlugin, []int{1} }
|
|
||||||
|
|
||||||
func (m *PluginPrivilege) GetName() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Name
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginPrivilege) GetDescription() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Description
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginPrivilege) GetValue() []string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Value
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterType((*PluginSpec)(nil), "PluginSpec")
|
|
||||||
proto.RegisterType((*PluginPrivilege)(nil), "PluginPrivilege")
|
|
||||||
}
|
|
||||||
func (m *PluginSpec) Marshal() (dAtA []byte, err error) {
|
|
||||||
size := m.Size()
|
|
||||||
dAtA = make([]byte, size)
|
|
||||||
n, err := m.MarshalTo(dAtA)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return dAtA[:n], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginSpec) MarshalTo(dAtA []byte) (int, error) {
|
|
||||||
var i int
|
|
||||||
_ = i
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
if len(m.Name) > 0 {
|
|
||||||
dAtA[i] = 0xa
|
|
||||||
i++
|
|
||||||
i = encodeVarintPlugin(dAtA, i, uint64(len(m.Name)))
|
|
||||||
i += copy(dAtA[i:], m.Name)
|
|
||||||
}
|
|
||||||
if len(m.Remote) > 0 {
|
|
||||||
dAtA[i] = 0x12
|
|
||||||
i++
|
|
||||||
i = encodeVarintPlugin(dAtA, i, uint64(len(m.Remote)))
|
|
||||||
i += copy(dAtA[i:], m.Remote)
|
|
||||||
}
|
|
||||||
if len(m.Privileges) > 0 {
|
|
||||||
for _, msg := range m.Privileges {
|
|
||||||
dAtA[i] = 0x1a
|
|
||||||
i++
|
|
||||||
i = encodeVarintPlugin(dAtA, i, uint64(msg.Size()))
|
|
||||||
n, err := msg.MarshalTo(dAtA[i:])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
i += n
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if m.Disabled {
|
|
||||||
dAtA[i] = 0x20
|
|
||||||
i++
|
|
||||||
if m.Disabled {
|
|
||||||
dAtA[i] = 1
|
|
||||||
} else {
|
|
||||||
dAtA[i] = 0
|
|
||||||
}
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
return i, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginPrivilege) Marshal() (dAtA []byte, err error) {
|
|
||||||
size := m.Size()
|
|
||||||
dAtA = make([]byte, size)
|
|
||||||
n, err := m.MarshalTo(dAtA)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return dAtA[:n], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginPrivilege) MarshalTo(dAtA []byte) (int, error) {
|
|
||||||
var i int
|
|
||||||
_ = i
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
if len(m.Name) > 0 {
|
|
||||||
dAtA[i] = 0xa
|
|
||||||
i++
|
|
||||||
i = encodeVarintPlugin(dAtA, i, uint64(len(m.Name)))
|
|
||||||
i += copy(dAtA[i:], m.Name)
|
|
||||||
}
|
|
||||||
if len(m.Description) > 0 {
|
|
||||||
dAtA[i] = 0x12
|
|
||||||
i++
|
|
||||||
i = encodeVarintPlugin(dAtA, i, uint64(len(m.Description)))
|
|
||||||
i += copy(dAtA[i:], m.Description)
|
|
||||||
}
|
|
||||||
if len(m.Value) > 0 {
|
|
||||||
for _, s := range m.Value {
|
|
||||||
dAtA[i] = 0x1a
|
|
||||||
i++
|
|
||||||
l = len(s)
|
|
||||||
for l >= 1<<7 {
|
|
||||||
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
|
|
||||||
l >>= 7
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
dAtA[i] = uint8(l)
|
|
||||||
i++
|
|
||||||
i += copy(dAtA[i:], s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return i, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func encodeFixed64Plugin(dAtA []byte, offset int, v uint64) int {
|
|
||||||
dAtA[offset] = uint8(v)
|
|
||||||
dAtA[offset+1] = uint8(v >> 8)
|
|
||||||
dAtA[offset+2] = uint8(v >> 16)
|
|
||||||
dAtA[offset+3] = uint8(v >> 24)
|
|
||||||
dAtA[offset+4] = uint8(v >> 32)
|
|
||||||
dAtA[offset+5] = uint8(v >> 40)
|
|
||||||
dAtA[offset+6] = uint8(v >> 48)
|
|
||||||
dAtA[offset+7] = uint8(v >> 56)
|
|
||||||
return offset + 8
|
|
||||||
}
|
|
||||||
func encodeFixed32Plugin(dAtA []byte, offset int, v uint32) int {
|
|
||||||
dAtA[offset] = uint8(v)
|
|
||||||
dAtA[offset+1] = uint8(v >> 8)
|
|
||||||
dAtA[offset+2] = uint8(v >> 16)
|
|
||||||
dAtA[offset+3] = uint8(v >> 24)
|
|
||||||
return offset + 4
|
|
||||||
}
|
|
||||||
func encodeVarintPlugin(dAtA []byte, offset int, v uint64) int {
|
|
||||||
for v >= 1<<7 {
|
|
||||||
dAtA[offset] = uint8(v&0x7f | 0x80)
|
|
||||||
v >>= 7
|
|
||||||
offset++
|
|
||||||
}
|
|
||||||
dAtA[offset] = uint8(v)
|
|
||||||
return offset + 1
|
|
||||||
}
|
|
||||||
func (m *PluginSpec) Size() (n int) {
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
l = len(m.Name)
|
|
||||||
if l > 0 {
|
|
||||||
n += 1 + l + sovPlugin(uint64(l))
|
|
||||||
}
|
|
||||||
l = len(m.Remote)
|
|
||||||
if l > 0 {
|
|
||||||
n += 1 + l + sovPlugin(uint64(l))
|
|
||||||
}
|
|
||||||
if len(m.Privileges) > 0 {
|
|
||||||
for _, e := range m.Privileges {
|
|
||||||
l = e.Size()
|
|
||||||
n += 1 + l + sovPlugin(uint64(l))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if m.Disabled {
|
|
||||||
n += 2
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PluginPrivilege) Size() (n int) {
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
l = len(m.Name)
|
|
||||||
if l > 0 {
|
|
||||||
n += 1 + l + sovPlugin(uint64(l))
|
|
||||||
}
|
|
||||||
l = len(m.Description)
|
|
||||||
if l > 0 {
|
|
||||||
n += 1 + l + sovPlugin(uint64(l))
|
|
||||||
}
|
|
||||||
if len(m.Value) > 0 {
|
|
||||||
for _, s := range m.Value {
|
|
||||||
l = len(s)
|
|
||||||
n += 1 + l + sovPlugin(uint64(l))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func sovPlugin(x uint64) (n int) {
|
|
||||||
for {
|
|
||||||
n++
|
|
||||||
x >>= 7
|
|
||||||
if x == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
func sozPlugin(x uint64) (n int) {
|
|
||||||
return sovPlugin(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
|
||||||
}
|
|
||||||
func (m *PluginSpec) Unmarshal(dAtA []byte) error {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
preIndex := iNdEx
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fieldNum := int32(wire >> 3)
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
if wireType == 4 {
|
|
||||||
return fmt.Errorf("proto: PluginSpec: wiretype end group for non-group")
|
|
||||||
}
|
|
||||||
if fieldNum <= 0 {
|
|
||||||
return fmt.Errorf("proto: PluginSpec: illegal tag %d (wire type %d)", fieldNum, wire)
|
|
||||||
}
|
|
||||||
switch fieldNum {
|
|
||||||
case 1:
|
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
|
|
||||||
}
|
|
||||||
var stringLen uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
stringLen |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
intStringLen := int(stringLen)
|
|
||||||
if intStringLen < 0 {
|
|
||||||
return ErrInvalidLengthPlugin
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + intStringLen
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.Name = string(dAtA[iNdEx:postIndex])
|
|
||||||
iNdEx = postIndex
|
|
||||||
case 2:
|
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Remote", wireType)
|
|
||||||
}
|
|
||||||
var stringLen uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
stringLen |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
intStringLen := int(stringLen)
|
|
||||||
if intStringLen < 0 {
|
|
||||||
return ErrInvalidLengthPlugin
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + intStringLen
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.Remote = string(dAtA[iNdEx:postIndex])
|
|
||||||
iNdEx = postIndex
|
|
||||||
case 3:
|
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Privileges", wireType)
|
|
||||||
}
|
|
||||||
var msglen int
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
msglen |= (int(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if msglen < 0 {
|
|
||||||
return ErrInvalidLengthPlugin
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + msglen
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.Privileges = append(m.Privileges, &PluginPrivilege{})
|
|
||||||
if err := m.Privileges[len(m.Privileges)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
iNdEx = postIndex
|
|
||||||
case 4:
|
|
||||||
if wireType != 0 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Disabled", wireType)
|
|
||||||
}
|
|
||||||
var v int
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
v |= (int(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m.Disabled = bool(v != 0)
|
|
||||||
default:
|
|
||||||
iNdEx = preIndex
|
|
||||||
skippy, err := skipPlugin(dAtA[iNdEx:])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if skippy < 0 {
|
|
||||||
return ErrInvalidLengthPlugin
|
|
||||||
}
|
|
||||||
if (iNdEx + skippy) > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx += skippy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if iNdEx > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func (m *PluginPrivilege) Unmarshal(dAtA []byte) error {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
preIndex := iNdEx
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fieldNum := int32(wire >> 3)
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
if wireType == 4 {
|
|
||||||
return fmt.Errorf("proto: PluginPrivilege: wiretype end group for non-group")
|
|
||||||
}
|
|
||||||
if fieldNum <= 0 {
|
|
||||||
return fmt.Errorf("proto: PluginPrivilege: illegal tag %d (wire type %d)", fieldNum, wire)
|
|
||||||
}
|
|
||||||
switch fieldNum {
|
|
||||||
case 1:
|
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
|
|
||||||
}
|
|
||||||
var stringLen uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
stringLen |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
intStringLen := int(stringLen)
|
|
||||||
if intStringLen < 0 {
|
|
||||||
return ErrInvalidLengthPlugin
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + intStringLen
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.Name = string(dAtA[iNdEx:postIndex])
|
|
||||||
iNdEx = postIndex
|
|
||||||
case 2:
|
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType)
|
|
||||||
}
|
|
||||||
var stringLen uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
stringLen |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
intStringLen := int(stringLen)
|
|
||||||
if intStringLen < 0 {
|
|
||||||
return ErrInvalidLengthPlugin
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + intStringLen
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.Description = string(dAtA[iNdEx:postIndex])
|
|
||||||
iNdEx = postIndex
|
|
||||||
case 3:
|
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
|
|
||||||
}
|
|
||||||
var stringLen uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
stringLen |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
intStringLen := int(stringLen)
|
|
||||||
if intStringLen < 0 {
|
|
||||||
return ErrInvalidLengthPlugin
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + intStringLen
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.Value = append(m.Value, string(dAtA[iNdEx:postIndex]))
|
|
||||||
iNdEx = postIndex
|
|
||||||
default:
|
|
||||||
iNdEx = preIndex
|
|
||||||
skippy, err := skipPlugin(dAtA[iNdEx:])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if skippy < 0 {
|
|
||||||
return ErrInvalidLengthPlugin
|
|
||||||
}
|
|
||||||
if (iNdEx + skippy) > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx += skippy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if iNdEx > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func skipPlugin(dAtA []byte) (n int, err error) {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
switch wireType {
|
|
||||||
case 0:
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx++
|
|
||||||
if dAtA[iNdEx-1] < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 1:
|
|
||||||
iNdEx += 8
|
|
||||||
return iNdEx, nil
|
|
||||||
case 2:
|
|
||||||
var length int
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
length |= (int(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iNdEx += length
|
|
||||||
if length < 0 {
|
|
||||||
return 0, ErrInvalidLengthPlugin
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 3:
|
|
||||||
for {
|
|
||||||
var innerWire uint64
|
|
||||||
var start int = iNdEx
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowPlugin
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
innerWire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
innerWireType := int(innerWire & 0x7)
|
|
||||||
if innerWireType == 4 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
next, err := skipPlugin(dAtA[start:])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
iNdEx = start + next
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 4:
|
|
||||||
return iNdEx, nil
|
|
||||||
case 5:
|
|
||||||
iNdEx += 4
|
|
||||||
return iNdEx, nil
|
|
||||||
default:
|
|
||||||
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
panic("unreachable")
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrInvalidLengthPlugin = fmt.Errorf("proto: negative length found during unmarshaling")
|
|
||||||
ErrIntOverflowPlugin = fmt.Errorf("proto: integer overflow")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("plugin.proto", fileDescriptorPlugin) }
|
|
||||||
|
|
||||||
var fileDescriptorPlugin = []byte{
|
|
||||||
// 196 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0xc8, 0x29, 0x4d,
|
|
||||||
0xcf, 0xcc, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x57, 0x6a, 0x63, 0xe4, 0xe2, 0x0a, 0x00, 0x0b,
|
|
||||||
0x04, 0x17, 0xa4, 0x26, 0x0b, 0x09, 0x71, 0xb1, 0xe4, 0x25, 0xe6, 0xa6, 0x4a, 0x30, 0x2a, 0x30,
|
|
||||||
0x6a, 0x70, 0x06, 0x81, 0xd9, 0x42, 0x62, 0x5c, 0x6c, 0x45, 0xa9, 0xb9, 0xf9, 0x25, 0xa9, 0x12,
|
|
||||||
0x4c, 0x60, 0x51, 0x28, 0x4f, 0xc8, 0x80, 0x8b, 0xab, 0xa0, 0x28, 0xb3, 0x2c, 0x33, 0x27, 0x35,
|
|
||||||
0x3d, 0xb5, 0x58, 0x82, 0x59, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x40, 0x0f, 0x62, 0x58, 0x00, 0x4c,
|
|
||||||
0x22, 0x08, 0x49, 0x8d, 0x90, 0x14, 0x17, 0x47, 0x4a, 0x66, 0x71, 0x62, 0x52, 0x4e, 0x6a, 0x8a,
|
|
||||||
0x04, 0x8b, 0x02, 0xa3, 0x06, 0x47, 0x10, 0x9c, 0xaf, 0x14, 0xcb, 0xc5, 0x8f, 0xa6, 0x15, 0xab,
|
|
||||||
0x63, 0x14, 0xb8, 0xb8, 0x53, 0x52, 0x8b, 0x93, 0x8b, 0x32, 0x0b, 0x4a, 0x32, 0xf3, 0xf3, 0xa0,
|
|
||||||
0x2e, 0x42, 0x16, 0x12, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29, 0x4d, 0x05, 0xbb, 0x88, 0x33,
|
|
||||||
0x08, 0xc2, 0x71, 0xe2, 0x39, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4,
|
|
||||||
0x18, 0x93, 0xd8, 0xc0, 0x9e, 0x37, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x84, 0xad, 0x79,
|
|
||||||
0x0c, 0x01, 0x00, 0x00,
|
|
||||||
}
|
|
20
vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto
generated
vendored
20
vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto
generated
vendored
@ -1,20 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
option go_package = "github.com/docker/docker/api/types/swarm/runtime;runtime";
|
|
||||||
|
|
||||||
// PluginSpec defines the base payload which clients can specify for creating
|
|
||||||
// a service with the plugin runtime.
|
|
||||||
message PluginSpec {
|
|
||||||
string name = 1;
|
|
||||||
string remote = 2;
|
|
||||||
repeated PluginPrivilege privileges = 3;
|
|
||||||
bool disabled = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginPrivilege describes a permission the user has to accept
|
|
||||||
// upon installing a plugin.
|
|
||||||
message PluginPrivilege {
|
|
||||||
string name = 1;
|
|
||||||
string description = 2;
|
|
||||||
repeated string value = 3;
|
|
||||||
}
|
|
36
vendor/github.com/docker/docker/api/types/swarm/secret.go
generated
vendored
36
vendor/github.com/docker/docker/api/types/swarm/secret.go
generated
vendored
@ -1,36 +0,0 @@
|
|||||||
package swarm // import "github.com/docker/docker/api/types/swarm"
|
|
||||||
|
|
||||||
import "os"
|
|
||||||
|
|
||||||
// Secret represents a secret.
|
|
||||||
type Secret struct {
|
|
||||||
ID string
|
|
||||||
Meta
|
|
||||||
Spec SecretSpec
|
|
||||||
}
|
|
||||||
|
|
||||||
// SecretSpec represents a secret specification from a secret in swarm
|
|
||||||
type SecretSpec struct {
|
|
||||||
Annotations
|
|
||||||
Data []byte `json:",omitempty"`
|
|
||||||
Driver *Driver `json:",omitempty"` // name of the secrets driver used to fetch the secret's value from an external secret store
|
|
||||||
|
|
||||||
// Templating controls whether and how to evaluate the secret payload as
|
|
||||||
// a template. If it is not set, no templating is used.
|
|
||||||
Templating *Driver `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// SecretReferenceFileTarget is a file target in a secret reference
|
|
||||||
type SecretReferenceFileTarget struct {
|
|
||||||
Name string
|
|
||||||
UID string
|
|
||||||
GID string
|
|
||||||
Mode os.FileMode
|
|
||||||
}
|
|
||||||
|
|
||||||
// SecretReference is a reference to a secret in swarm
|
|
||||||
type SecretReference struct {
|
|
||||||
File *SecretReferenceFileTarget
|
|
||||||
SecretID string
|
|
||||||
SecretName string
|
|
||||||
}
|
|
124
vendor/github.com/docker/docker/api/types/swarm/service.go
generated
vendored
124
vendor/github.com/docker/docker/api/types/swarm/service.go
generated
vendored
@ -1,124 +0,0 @@
|
|||||||
package swarm // import "github.com/docker/docker/api/types/swarm"
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
// Service represents a service.
|
|
||||||
type Service struct {
|
|
||||||
ID string
|
|
||||||
Meta
|
|
||||||
Spec ServiceSpec `json:",omitempty"`
|
|
||||||
PreviousSpec *ServiceSpec `json:",omitempty"`
|
|
||||||
Endpoint Endpoint `json:",omitempty"`
|
|
||||||
UpdateStatus *UpdateStatus `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServiceSpec represents the spec of a service.
|
|
||||||
type ServiceSpec struct {
|
|
||||||
Annotations
|
|
||||||
|
|
||||||
// TaskTemplate defines how the service should construct new tasks when
|
|
||||||
// orchestrating this service.
|
|
||||||
TaskTemplate TaskSpec `json:",omitempty"`
|
|
||||||
Mode ServiceMode `json:",omitempty"`
|
|
||||||
UpdateConfig *UpdateConfig `json:",omitempty"`
|
|
||||||
RollbackConfig *UpdateConfig `json:",omitempty"`
|
|
||||||
|
|
||||||
// Networks field in ServiceSpec is deprecated. The
|
|
||||||
// same field in TaskSpec should be used instead.
|
|
||||||
// This field will be removed in a future release.
|
|
||||||
Networks []NetworkAttachmentConfig `json:",omitempty"`
|
|
||||||
EndpointSpec *EndpointSpec `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServiceMode represents the mode of a service.
|
|
||||||
type ServiceMode struct {
|
|
||||||
Replicated *ReplicatedService `json:",omitempty"`
|
|
||||||
Global *GlobalService `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateState is the state of a service update.
|
|
||||||
type UpdateState string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// UpdateStateUpdating is the updating state.
|
|
||||||
UpdateStateUpdating UpdateState = "updating"
|
|
||||||
// UpdateStatePaused is the paused state.
|
|
||||||
UpdateStatePaused UpdateState = "paused"
|
|
||||||
// UpdateStateCompleted is the completed state.
|
|
||||||
UpdateStateCompleted UpdateState = "completed"
|
|
||||||
// UpdateStateRollbackStarted is the state with a rollback in progress.
|
|
||||||
UpdateStateRollbackStarted UpdateState = "rollback_started"
|
|
||||||
// UpdateStateRollbackPaused is the state with a rollback in progress.
|
|
||||||
UpdateStateRollbackPaused UpdateState = "rollback_paused"
|
|
||||||
// UpdateStateRollbackCompleted is the state with a rollback in progress.
|
|
||||||
UpdateStateRollbackCompleted UpdateState = "rollback_completed"
|
|
||||||
)
|
|
||||||
|
|
||||||
// UpdateStatus reports the status of a service update.
|
|
||||||
type UpdateStatus struct {
|
|
||||||
State UpdateState `json:",omitempty"`
|
|
||||||
StartedAt *time.Time `json:",omitempty"`
|
|
||||||
CompletedAt *time.Time `json:",omitempty"`
|
|
||||||
Message string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReplicatedService is a kind of ServiceMode.
|
|
||||||
type ReplicatedService struct {
|
|
||||||
Replicas *uint64 `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalService is a kind of ServiceMode.
|
|
||||||
type GlobalService struct{}
|
|
||||||
|
|
||||||
const (
|
|
||||||
// UpdateFailureActionPause PAUSE
|
|
||||||
UpdateFailureActionPause = "pause"
|
|
||||||
// UpdateFailureActionContinue CONTINUE
|
|
||||||
UpdateFailureActionContinue = "continue"
|
|
||||||
// UpdateFailureActionRollback ROLLBACK
|
|
||||||
UpdateFailureActionRollback = "rollback"
|
|
||||||
|
|
||||||
// UpdateOrderStopFirst STOP_FIRST
|
|
||||||
UpdateOrderStopFirst = "stop-first"
|
|
||||||
// UpdateOrderStartFirst START_FIRST
|
|
||||||
UpdateOrderStartFirst = "start-first"
|
|
||||||
)
|
|
||||||
|
|
||||||
// UpdateConfig represents the update configuration.
|
|
||||||
type UpdateConfig struct {
|
|
||||||
// Maximum number of tasks to be updated in one iteration.
|
|
||||||
// 0 means unlimited parallelism.
|
|
||||||
Parallelism uint64
|
|
||||||
|
|
||||||
// Amount of time between updates.
|
|
||||||
Delay time.Duration `json:",omitempty"`
|
|
||||||
|
|
||||||
// FailureAction is the action to take when an update failures.
|
|
||||||
FailureAction string `json:",omitempty"`
|
|
||||||
|
|
||||||
// Monitor indicates how long to monitor a task for failure after it is
|
|
||||||
// created. If the task fails by ending up in one of the states
|
|
||||||
// REJECTED, COMPLETED, or FAILED, within Monitor from its creation,
|
|
||||||
// this counts as a failure. If it fails after Monitor, it does not
|
|
||||||
// count as a failure. If Monitor is unspecified, a default value will
|
|
||||||
// be used.
|
|
||||||
Monitor time.Duration `json:",omitempty"`
|
|
||||||
|
|
||||||
// MaxFailureRatio is the fraction of tasks that may fail during
|
|
||||||
// an update before the failure action is invoked. Any task created by
|
|
||||||
// the current update which ends up in one of the states REJECTED,
|
|
||||||
// COMPLETED or FAILED within Monitor from its creation counts as a
|
|
||||||
// failure. The number of failures is divided by the number of tasks
|
|
||||||
// being updated, and if this fraction is greater than
|
|
||||||
// MaxFailureRatio, the failure action is invoked.
|
|
||||||
//
|
|
||||||
// If the failure action is CONTINUE, there is no effect.
|
|
||||||
// If the failure action is PAUSE, no more tasks will be updated until
|
|
||||||
// another update is started.
|
|
||||||
MaxFailureRatio float32
|
|
||||||
|
|
||||||
// Order indicates the order of operations when rolling out an updated
|
|
||||||
// task. Either the old task is shut down before the new task is
|
|
||||||
// started, or the new task is started before the old task is shut down.
|
|
||||||
Order string
|
|
||||||
}
|
|
217
vendor/github.com/docker/docker/api/types/swarm/swarm.go
generated
vendored
217
vendor/github.com/docker/docker/api/types/swarm/swarm.go
generated
vendored
@ -1,217 +0,0 @@
|
|||||||
package swarm // import "github.com/docker/docker/api/types/swarm"
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
// ClusterInfo represents info about the cluster for outputting in "info"
|
|
||||||
// it contains the same information as "Swarm", but without the JoinTokens
|
|
||||||
type ClusterInfo struct {
|
|
||||||
ID string
|
|
||||||
Meta
|
|
||||||
Spec Spec
|
|
||||||
TLSInfo TLSInfo
|
|
||||||
RootRotationInProgress bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swarm represents a swarm.
|
|
||||||
type Swarm struct {
|
|
||||||
ClusterInfo
|
|
||||||
JoinTokens JoinTokens
|
|
||||||
}
|
|
||||||
|
|
||||||
// JoinTokens contains the tokens workers and managers need to join the swarm.
|
|
||||||
type JoinTokens struct {
|
|
||||||
// Worker is the join token workers may use to join the swarm.
|
|
||||||
Worker string
|
|
||||||
// Manager is the join token managers may use to join the swarm.
|
|
||||||
Manager string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Spec represents the spec of a swarm.
|
|
||||||
type Spec struct {
|
|
||||||
Annotations
|
|
||||||
|
|
||||||
Orchestration OrchestrationConfig `json:",omitempty"`
|
|
||||||
Raft RaftConfig `json:",omitempty"`
|
|
||||||
Dispatcher DispatcherConfig `json:",omitempty"`
|
|
||||||
CAConfig CAConfig `json:",omitempty"`
|
|
||||||
TaskDefaults TaskDefaults `json:",omitempty"`
|
|
||||||
EncryptionConfig EncryptionConfig `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// OrchestrationConfig represents orchestration configuration.
|
|
||||||
type OrchestrationConfig struct {
|
|
||||||
// TaskHistoryRetentionLimit is the number of historic tasks to keep per instance or
|
|
||||||
// node. If negative, never remove completed or failed tasks.
|
|
||||||
TaskHistoryRetentionLimit *int64 `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskDefaults parameterizes cluster-level task creation with default values.
|
|
||||||
type TaskDefaults struct {
|
|
||||||
// LogDriver selects the log driver to use for tasks created in the
|
|
||||||
// orchestrator if unspecified by a service.
|
|
||||||
//
|
|
||||||
// Updating this value will only have an affect on new tasks. Old tasks
|
|
||||||
// will continue use their previously configured log driver until
|
|
||||||
// recreated.
|
|
||||||
LogDriver *Driver `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// EncryptionConfig controls at-rest encryption of data and keys.
|
|
||||||
type EncryptionConfig struct {
|
|
||||||
// AutoLockManagers specifies whether or not managers TLS keys and raft data
|
|
||||||
// should be encrypted at rest in such a way that they must be unlocked
|
|
||||||
// before the manager node starts up again.
|
|
||||||
AutoLockManagers bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// RaftConfig represents raft configuration.
|
|
||||||
type RaftConfig struct {
|
|
||||||
// SnapshotInterval is the number of log entries between snapshots.
|
|
||||||
SnapshotInterval uint64 `json:",omitempty"`
|
|
||||||
|
|
||||||
// KeepOldSnapshots is the number of snapshots to keep beyond the
|
|
||||||
// current snapshot.
|
|
||||||
KeepOldSnapshots *uint64 `json:",omitempty"`
|
|
||||||
|
|
||||||
// LogEntriesForSlowFollowers is the number of log entries to keep
|
|
||||||
// around to sync up slow followers after a snapshot is created.
|
|
||||||
LogEntriesForSlowFollowers uint64 `json:",omitempty"`
|
|
||||||
|
|
||||||
// ElectionTick is the number of ticks that a follower will wait for a message
|
|
||||||
// from the leader before becoming a candidate and starting an election.
|
|
||||||
// ElectionTick must be greater than HeartbeatTick.
|
|
||||||
//
|
|
||||||
// A tick currently defaults to one second, so these translate directly to
|
|
||||||
// seconds currently, but this is NOT guaranteed.
|
|
||||||
ElectionTick int
|
|
||||||
|
|
||||||
// HeartbeatTick is the number of ticks between heartbeats. Every
|
|
||||||
// HeartbeatTick ticks, the leader will send a heartbeat to the
|
|
||||||
// followers.
|
|
||||||
//
|
|
||||||
// A tick currently defaults to one second, so these translate directly to
|
|
||||||
// seconds currently, but this is NOT guaranteed.
|
|
||||||
HeartbeatTick int
|
|
||||||
}
|
|
||||||
|
|
||||||
// DispatcherConfig represents dispatcher configuration.
|
|
||||||
type DispatcherConfig struct {
|
|
||||||
// HeartbeatPeriod defines how often agent should send heartbeats to
|
|
||||||
// dispatcher.
|
|
||||||
HeartbeatPeriod time.Duration `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAConfig represents CA configuration.
|
|
||||||
type CAConfig struct {
|
|
||||||
// NodeCertExpiry is the duration certificates should be issued for
|
|
||||||
NodeCertExpiry time.Duration `json:",omitempty"`
|
|
||||||
|
|
||||||
// ExternalCAs is a list of CAs to which a manager node will make
|
|
||||||
// certificate signing requests for node certificates.
|
|
||||||
ExternalCAs []*ExternalCA `json:",omitempty"`
|
|
||||||
|
|
||||||
// SigningCACert and SigningCAKey specify the desired signing root CA and
|
|
||||||
// root CA key for the swarm. When inspecting the cluster, the key will
|
|
||||||
// be redacted.
|
|
||||||
SigningCACert string `json:",omitempty"`
|
|
||||||
SigningCAKey string `json:",omitempty"`
|
|
||||||
|
|
||||||
// If this value changes, and there is no specified signing cert and key,
|
|
||||||
// then the swarm is forced to generate a new root certificate ane key.
|
|
||||||
ForceRotate uint64 `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExternalCAProtocol represents type of external CA.
|
|
||||||
type ExternalCAProtocol string
|
|
||||||
|
|
||||||
// ExternalCAProtocolCFSSL CFSSL
|
|
||||||
const ExternalCAProtocolCFSSL ExternalCAProtocol = "cfssl"
|
|
||||||
|
|
||||||
// ExternalCA defines external CA to be used by the cluster.
|
|
||||||
type ExternalCA struct {
|
|
||||||
// Protocol is the protocol used by this external CA.
|
|
||||||
Protocol ExternalCAProtocol
|
|
||||||
|
|
||||||
// URL is the URL where the external CA can be reached.
|
|
||||||
URL string
|
|
||||||
|
|
||||||
// Options is a set of additional key/value pairs whose interpretation
|
|
||||||
// depends on the specified CA type.
|
|
||||||
Options map[string]string `json:",omitempty"`
|
|
||||||
|
|
||||||
// CACert specifies which root CA is used by this external CA. This certificate must
|
|
||||||
// be in PEM format.
|
|
||||||
CACert string
|
|
||||||
}
|
|
||||||
|
|
||||||
// InitRequest is the request used to init a swarm.
|
|
||||||
type InitRequest struct {
|
|
||||||
ListenAddr string
|
|
||||||
AdvertiseAddr string
|
|
||||||
DataPathAddr string
|
|
||||||
ForceNewCluster bool
|
|
||||||
Spec Spec
|
|
||||||
AutoLockManagers bool
|
|
||||||
Availability NodeAvailability
|
|
||||||
}
|
|
||||||
|
|
||||||
// JoinRequest is the request used to join a swarm.
|
|
||||||
type JoinRequest struct {
|
|
||||||
ListenAddr string
|
|
||||||
AdvertiseAddr string
|
|
||||||
DataPathAddr string
|
|
||||||
RemoteAddrs []string
|
|
||||||
JoinToken string // accept by secret
|
|
||||||
Availability NodeAvailability
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnlockRequest is the request used to unlock a swarm.
|
|
||||||
type UnlockRequest struct {
|
|
||||||
// UnlockKey is the unlock key in ASCII-armored format.
|
|
||||||
UnlockKey string
|
|
||||||
}
|
|
||||||
|
|
||||||
// LocalNodeState represents the state of the local node.
|
|
||||||
type LocalNodeState string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// LocalNodeStateInactive INACTIVE
|
|
||||||
LocalNodeStateInactive LocalNodeState = "inactive"
|
|
||||||
// LocalNodeStatePending PENDING
|
|
||||||
LocalNodeStatePending LocalNodeState = "pending"
|
|
||||||
// LocalNodeStateActive ACTIVE
|
|
||||||
LocalNodeStateActive LocalNodeState = "active"
|
|
||||||
// LocalNodeStateError ERROR
|
|
||||||
LocalNodeStateError LocalNodeState = "error"
|
|
||||||
// LocalNodeStateLocked LOCKED
|
|
||||||
LocalNodeStateLocked LocalNodeState = "locked"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Info represents generic information about swarm.
|
|
||||||
type Info struct {
|
|
||||||
NodeID string
|
|
||||||
NodeAddr string
|
|
||||||
|
|
||||||
LocalNodeState LocalNodeState
|
|
||||||
ControlAvailable bool
|
|
||||||
Error string
|
|
||||||
|
|
||||||
RemoteManagers []Peer
|
|
||||||
Nodes int `json:",omitempty"`
|
|
||||||
Managers int `json:",omitempty"`
|
|
||||||
|
|
||||||
Cluster *ClusterInfo `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Peer represents a peer.
|
|
||||||
type Peer struct {
|
|
||||||
NodeID string
|
|
||||||
Addr string
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateFlags contains flags for SwarmUpdate.
|
|
||||||
type UpdateFlags struct {
|
|
||||||
RotateWorkerToken bool
|
|
||||||
RotateManagerToken bool
|
|
||||||
RotateManagerUnlockKey bool
|
|
||||||
}
|
|
191
vendor/github.com/docker/docker/api/types/swarm/task.go
generated
vendored
191
vendor/github.com/docker/docker/api/types/swarm/task.go
generated
vendored
@ -1,191 +0,0 @@
|
|||||||
package swarm // import "github.com/docker/docker/api/types/swarm"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm/runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TaskState represents the state of a task.
|
|
||||||
type TaskState string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// TaskStateNew NEW
|
|
||||||
TaskStateNew TaskState = "new"
|
|
||||||
// TaskStateAllocated ALLOCATED
|
|
||||||
TaskStateAllocated TaskState = "allocated"
|
|
||||||
// TaskStatePending PENDING
|
|
||||||
TaskStatePending TaskState = "pending"
|
|
||||||
// TaskStateAssigned ASSIGNED
|
|
||||||
TaskStateAssigned TaskState = "assigned"
|
|
||||||
// TaskStateAccepted ACCEPTED
|
|
||||||
TaskStateAccepted TaskState = "accepted"
|
|
||||||
// TaskStatePreparing PREPARING
|
|
||||||
TaskStatePreparing TaskState = "preparing"
|
|
||||||
// TaskStateReady READY
|
|
||||||
TaskStateReady TaskState = "ready"
|
|
||||||
// TaskStateStarting STARTING
|
|
||||||
TaskStateStarting TaskState = "starting"
|
|
||||||
// TaskStateRunning RUNNING
|
|
||||||
TaskStateRunning TaskState = "running"
|
|
||||||
// TaskStateComplete COMPLETE
|
|
||||||
TaskStateComplete TaskState = "complete"
|
|
||||||
// TaskStateShutdown SHUTDOWN
|
|
||||||
TaskStateShutdown TaskState = "shutdown"
|
|
||||||
// TaskStateFailed FAILED
|
|
||||||
TaskStateFailed TaskState = "failed"
|
|
||||||
// TaskStateRejected REJECTED
|
|
||||||
TaskStateRejected TaskState = "rejected"
|
|
||||||
// TaskStateRemove REMOVE
|
|
||||||
TaskStateRemove TaskState = "remove"
|
|
||||||
// TaskStateOrphaned ORPHANED
|
|
||||||
TaskStateOrphaned TaskState = "orphaned"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Task represents a task.
|
|
||||||
type Task struct {
|
|
||||||
ID string
|
|
||||||
Meta
|
|
||||||
Annotations
|
|
||||||
|
|
||||||
Spec TaskSpec `json:",omitempty"`
|
|
||||||
ServiceID string `json:",omitempty"`
|
|
||||||
Slot int `json:",omitempty"`
|
|
||||||
NodeID string `json:",omitempty"`
|
|
||||||
Status TaskStatus `json:",omitempty"`
|
|
||||||
DesiredState TaskState `json:",omitempty"`
|
|
||||||
NetworksAttachments []NetworkAttachment `json:",omitempty"`
|
|
||||||
GenericResources []GenericResource `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskSpec represents the spec of a task.
|
|
||||||
type TaskSpec struct {
|
|
||||||
// ContainerSpec, NetworkAttachmentSpec, and PluginSpec are mutually exclusive.
|
|
||||||
// PluginSpec is only used when the `Runtime` field is set to `plugin`
|
|
||||||
// NetworkAttachmentSpec is used if the `Runtime` field is set to
|
|
||||||
// `attachment`.
|
|
||||||
ContainerSpec *ContainerSpec `json:",omitempty"`
|
|
||||||
PluginSpec *runtime.PluginSpec `json:",omitempty"`
|
|
||||||
NetworkAttachmentSpec *NetworkAttachmentSpec `json:",omitempty"`
|
|
||||||
|
|
||||||
Resources *ResourceRequirements `json:",omitempty"`
|
|
||||||
RestartPolicy *RestartPolicy `json:",omitempty"`
|
|
||||||
Placement *Placement `json:",omitempty"`
|
|
||||||
Networks []NetworkAttachmentConfig `json:",omitempty"`
|
|
||||||
|
|
||||||
// LogDriver specifies the LogDriver to use for tasks created from this
|
|
||||||
// spec. If not present, the one on cluster default on swarm.Spec will be
|
|
||||||
// used, finally falling back to the engine default if not specified.
|
|
||||||
LogDriver *Driver `json:",omitempty"`
|
|
||||||
|
|
||||||
// ForceUpdate is a counter that triggers an update even if no relevant
|
|
||||||
// parameters have been changed.
|
|
||||||
ForceUpdate uint64
|
|
||||||
|
|
||||||
Runtime RuntimeType `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resources represents resources (CPU/Memory).
|
|
||||||
type Resources struct {
|
|
||||||
NanoCPUs int64 `json:",omitempty"`
|
|
||||||
MemoryBytes int64 `json:",omitempty"`
|
|
||||||
GenericResources []GenericResource `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenericResource represents a "user defined" resource which can
|
|
||||||
// be either an integer (e.g: SSD=3) or a string (e.g: SSD=sda1)
|
|
||||||
type GenericResource struct {
|
|
||||||
NamedResourceSpec *NamedGenericResource `json:",omitempty"`
|
|
||||||
DiscreteResourceSpec *DiscreteGenericResource `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NamedGenericResource represents a "user defined" resource which is defined
|
|
||||||
// as a string.
|
|
||||||
// "Kind" is used to describe the Kind of a resource (e.g: "GPU", "FPGA", "SSD", ...)
|
|
||||||
// Value is used to identify the resource (GPU="UUID-1", FPGA="/dev/sdb5", ...)
|
|
||||||
type NamedGenericResource struct {
|
|
||||||
Kind string `json:",omitempty"`
|
|
||||||
Value string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// DiscreteGenericResource represents a "user defined" resource which is defined
|
|
||||||
// as an integer
|
|
||||||
// "Kind" is used to describe the Kind of a resource (e.g: "GPU", "FPGA", "SSD", ...)
|
|
||||||
// Value is used to count the resource (SSD=5, HDD=3, ...)
|
|
||||||
type DiscreteGenericResource struct {
|
|
||||||
Kind string `json:",omitempty"`
|
|
||||||
Value int64 `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResourceRequirements represents resources requirements.
|
|
||||||
type ResourceRequirements struct {
|
|
||||||
Limits *Resources `json:",omitempty"`
|
|
||||||
Reservations *Resources `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Placement represents orchestration parameters.
|
|
||||||
type Placement struct {
|
|
||||||
Constraints []string `json:",omitempty"`
|
|
||||||
Preferences []PlacementPreference `json:",omitempty"`
|
|
||||||
|
|
||||||
// Platforms stores all the platforms that the image can run on.
|
|
||||||
// This field is used in the platform filter for scheduling. If empty,
|
|
||||||
// then the platform filter is off, meaning there are no scheduling restrictions.
|
|
||||||
Platforms []Platform `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PlacementPreference provides a way to make the scheduler aware of factors
|
|
||||||
// such as topology.
|
|
||||||
type PlacementPreference struct {
|
|
||||||
Spread *SpreadOver
|
|
||||||
}
|
|
||||||
|
|
||||||
// SpreadOver is a scheduling preference that instructs the scheduler to spread
|
|
||||||
// tasks evenly over groups of nodes identified by labels.
|
|
||||||
type SpreadOver struct {
|
|
||||||
// label descriptor, such as engine.labels.az
|
|
||||||
SpreadDescriptor string
|
|
||||||
}
|
|
||||||
|
|
||||||
// RestartPolicy represents the restart policy.
|
|
||||||
type RestartPolicy struct {
|
|
||||||
Condition RestartPolicyCondition `json:",omitempty"`
|
|
||||||
Delay *time.Duration `json:",omitempty"`
|
|
||||||
MaxAttempts *uint64 `json:",omitempty"`
|
|
||||||
Window *time.Duration `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RestartPolicyCondition represents when to restart.
|
|
||||||
type RestartPolicyCondition string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// RestartPolicyConditionNone NONE
|
|
||||||
RestartPolicyConditionNone RestartPolicyCondition = "none"
|
|
||||||
// RestartPolicyConditionOnFailure ON_FAILURE
|
|
||||||
RestartPolicyConditionOnFailure RestartPolicyCondition = "on-failure"
|
|
||||||
// RestartPolicyConditionAny ANY
|
|
||||||
RestartPolicyConditionAny RestartPolicyCondition = "any"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TaskStatus represents the status of a task.
|
|
||||||
type TaskStatus struct {
|
|
||||||
Timestamp time.Time `json:",omitempty"`
|
|
||||||
State TaskState `json:",omitempty"`
|
|
||||||
Message string `json:",omitempty"`
|
|
||||||
Err string `json:",omitempty"`
|
|
||||||
ContainerStatus *ContainerStatus `json:",omitempty"`
|
|
||||||
PortStatus PortStatus `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerStatus represents the status of a container.
|
|
||||||
type ContainerStatus struct {
|
|
||||||
ContainerID string
|
|
||||||
PID int
|
|
||||||
ExitCode int
|
|
||||||
}
|
|
||||||
|
|
||||||
// PortStatus represents the port status of a task's host ports whose
|
|
||||||
// service has published host ports
|
|
||||||
type PortStatus struct {
|
|
||||||
Ports []PortConfig `json:",omitempty"`
|
|
||||||
}
|
|
12
vendor/github.com/docker/docker/api/types/time/duration_convert.go
generated
vendored
12
vendor/github.com/docker/docker/api/types/time/duration_convert.go
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
package time // import "github.com/docker/docker/api/types/time"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DurationToSecondsString converts the specified duration to the number
|
|
||||||
// seconds it represents, formatted as a string.
|
|
||||||
func DurationToSecondsString(duration time.Duration) string {
|
|
||||||
return strconv.FormatFloat(duration.Seconds(), 'f', 0, 64)
|
|
||||||
}
|
|
129
vendor/github.com/docker/docker/api/types/time/timestamp.go
generated
vendored
129
vendor/github.com/docker/docker/api/types/time/timestamp.go
generated
vendored
@ -1,129 +0,0 @@
|
|||||||
package time // import "github.com/docker/docker/api/types/time"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"math"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// These are additional predefined layouts for use in Time.Format and Time.Parse
|
|
||||||
// with --since and --until parameters for `docker logs` and `docker events`
|
|
||||||
const (
|
|
||||||
rFC3339Local = "2006-01-02T15:04:05" // RFC3339 with local timezone
|
|
||||||
rFC3339NanoLocal = "2006-01-02T15:04:05.999999999" // RFC3339Nano with local timezone
|
|
||||||
dateWithZone = "2006-01-02Z07:00" // RFC3339 with time at 00:00:00
|
|
||||||
dateLocal = "2006-01-02" // RFC3339 with local timezone and time at 00:00:00
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetTimestamp tries to parse given string as golang duration,
|
|
||||||
// then RFC3339 time and finally as a Unix timestamp. If
|
|
||||||
// any of these were successful, it returns a Unix timestamp
|
|
||||||
// as string otherwise returns the given value back.
|
|
||||||
// In case of duration input, the returned timestamp is computed
|
|
||||||
// as the given reference time minus the amount of the duration.
|
|
||||||
func GetTimestamp(value string, reference time.Time) (string, error) {
|
|
||||||
if d, err := time.ParseDuration(value); value != "0" && err == nil {
|
|
||||||
return strconv.FormatInt(reference.Add(-d).Unix(), 10), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var format string
|
|
||||||
// if the string has a Z or a + or three dashes use parse otherwise use parseinlocation
|
|
||||||
parseInLocation := !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3)
|
|
||||||
|
|
||||||
if strings.Contains(value, ".") {
|
|
||||||
if parseInLocation {
|
|
||||||
format = rFC3339NanoLocal
|
|
||||||
} else {
|
|
||||||
format = time.RFC3339Nano
|
|
||||||
}
|
|
||||||
} else if strings.Contains(value, "T") {
|
|
||||||
// we want the number of colons in the T portion of the timestamp
|
|
||||||
tcolons := strings.Count(value, ":")
|
|
||||||
// if parseInLocation is off and we have a +/- zone offset (not Z) then
|
|
||||||
// there will be an extra colon in the input for the tz offset subtract that
|
|
||||||
// colon from the tcolons count
|
|
||||||
if !parseInLocation && !strings.ContainsAny(value, "zZ") && tcolons > 0 {
|
|
||||||
tcolons--
|
|
||||||
}
|
|
||||||
if parseInLocation {
|
|
||||||
switch tcolons {
|
|
||||||
case 0:
|
|
||||||
format = "2006-01-02T15"
|
|
||||||
case 1:
|
|
||||||
format = "2006-01-02T15:04"
|
|
||||||
default:
|
|
||||||
format = rFC3339Local
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch tcolons {
|
|
||||||
case 0:
|
|
||||||
format = "2006-01-02T15Z07:00"
|
|
||||||
case 1:
|
|
||||||
format = "2006-01-02T15:04Z07:00"
|
|
||||||
default:
|
|
||||||
format = time.RFC3339
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if parseInLocation {
|
|
||||||
format = dateLocal
|
|
||||||
} else {
|
|
||||||
format = dateWithZone
|
|
||||||
}
|
|
||||||
|
|
||||||
var t time.Time
|
|
||||||
var err error
|
|
||||||
|
|
||||||
if parseInLocation {
|
|
||||||
t, err = time.ParseInLocation(format, value, time.FixedZone(reference.Zone()))
|
|
||||||
} else {
|
|
||||||
t, err = time.Parse(format, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
// if there is a `-` then it's an RFC3339 like timestamp
|
|
||||||
if strings.Contains(value, "-") {
|
|
||||||
return "", err // was probably an RFC3339 like timestamp but the parser failed with an error
|
|
||||||
}
|
|
||||||
if _, _, err := parseTimestamp(value); err != nil {
|
|
||||||
return "", fmt.Errorf("failed to parse value as time or duration: %q", value)
|
|
||||||
}
|
|
||||||
return value, nil // unix timestamp in and out case (meaning: the value passed at the command line is already in the right format for passing to the server)
|
|
||||||
}
|
|
||||||
|
|
||||||
return fmt.Sprintf("%d.%09d", t.Unix(), int64(t.Nanosecond())), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseTimestamps returns seconds and nanoseconds from a timestamp that has the
|
|
||||||
// format "%d.%09d", time.Unix(), int64(time.Nanosecond()))
|
|
||||||
// if the incoming nanosecond portion is longer or shorter than 9 digits it is
|
|
||||||
// converted to nanoseconds. The expectation is that the seconds and
|
|
||||||
// seconds will be used to create a time variable. For example:
|
|
||||||
// seconds, nanoseconds, err := ParseTimestamp("1136073600.000000001",0)
|
|
||||||
// if err == nil since := time.Unix(seconds, nanoseconds)
|
|
||||||
// returns seconds as def(aultSeconds) if value == ""
|
|
||||||
func ParseTimestamps(value string, def int64) (int64, int64, error) {
|
|
||||||
if value == "" {
|
|
||||||
return def, 0, nil
|
|
||||||
}
|
|
||||||
return parseTimestamp(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseTimestamp(value string) (int64, int64, error) {
|
|
||||||
sa := strings.SplitN(value, ".", 2)
|
|
||||||
s, err := strconv.ParseInt(sa[0], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return s, 0, err
|
|
||||||
}
|
|
||||||
if len(sa) != 2 {
|
|
||||||
return s, 0, nil
|
|
||||||
}
|
|
||||||
n, err := strconv.ParseInt(sa[1], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return s, n, err
|
|
||||||
}
|
|
||||||
// should already be in nanoseconds but just in case convert n to nanoseconds
|
|
||||||
n = int64(float64(n) * math.Pow(float64(10), float64(9-len(sa[1]))))
|
|
||||||
return s, n, nil
|
|
||||||
}
|
|
587
vendor/github.com/docker/docker/api/types/types.go
generated
vendored
587
vendor/github.com/docker/docker/api/types/types.go
generated
vendored
@ -1,587 +0,0 @@
|
|||||||
package types // import "github.com/docker/docker/api/types"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/container"
|
|
||||||
"github.com/docker/docker/api/types/filters"
|
|
||||||
"github.com/docker/docker/api/types/mount"
|
|
||||||
"github.com/docker/docker/api/types/network"
|
|
||||||
"github.com/docker/docker/api/types/registry"
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
|
||||||
"github.com/docker/go-connections/nat"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RootFS returns Image's RootFS description including the layer IDs.
|
|
||||||
type RootFS struct {
|
|
||||||
Type string
|
|
||||||
Layers []string `json:",omitempty"`
|
|
||||||
BaseLayer string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageInspect contains response of Engine API:
|
|
||||||
// GET "/images/{name:.*}/json"
|
|
||||||
type ImageInspect struct {
|
|
||||||
ID string `json:"Id"`
|
|
||||||
RepoTags []string
|
|
||||||
RepoDigests []string
|
|
||||||
Parent string
|
|
||||||
Comment string
|
|
||||||
Created string
|
|
||||||
Container string
|
|
||||||
ContainerConfig *container.Config
|
|
||||||
DockerVersion string
|
|
||||||
Author string
|
|
||||||
Config *container.Config
|
|
||||||
Architecture string
|
|
||||||
Os string
|
|
||||||
OsVersion string `json:",omitempty"`
|
|
||||||
Size int64
|
|
||||||
VirtualSize int64
|
|
||||||
GraphDriver GraphDriverData
|
|
||||||
RootFS RootFS
|
|
||||||
Metadata ImageMetadata
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageMetadata contains engine-local data about the image
|
|
||||||
type ImageMetadata struct {
|
|
||||||
LastTagTime time.Time `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Container contains response of Engine API:
|
|
||||||
// GET "/containers/json"
|
|
||||||
type Container struct {
|
|
||||||
ID string `json:"Id"`
|
|
||||||
Names []string
|
|
||||||
Image string
|
|
||||||
ImageID string
|
|
||||||
Command string
|
|
||||||
Created int64
|
|
||||||
Ports []Port
|
|
||||||
SizeRw int64 `json:",omitempty"`
|
|
||||||
SizeRootFs int64 `json:",omitempty"`
|
|
||||||
Labels map[string]string
|
|
||||||
State string
|
|
||||||
Status string
|
|
||||||
HostConfig struct {
|
|
||||||
NetworkMode string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
NetworkSettings *SummaryNetworkSettings
|
|
||||||
Mounts []MountPoint
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyConfig contains request body of Engine API:
|
|
||||||
// POST "/containers/"+containerID+"/copy"
|
|
||||||
type CopyConfig struct {
|
|
||||||
Resource string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerPathStat is used to encode the header from
|
|
||||||
// GET "/containers/{name:.*}/archive"
|
|
||||||
// "Name" is the file or directory name.
|
|
||||||
type ContainerPathStat struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Size int64 `json:"size"`
|
|
||||||
Mode os.FileMode `json:"mode"`
|
|
||||||
Mtime time.Time `json:"mtime"`
|
|
||||||
LinkTarget string `json:"linkTarget"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerStats contains response of Engine API:
|
|
||||||
// GET "/stats"
|
|
||||||
type ContainerStats struct {
|
|
||||||
Body io.ReadCloser `json:"body"`
|
|
||||||
OSType string `json:"ostype"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ping contains response of Engine API:
|
|
||||||
// GET "/_ping"
|
|
||||||
type Ping struct {
|
|
||||||
APIVersion string
|
|
||||||
OSType string
|
|
||||||
Experimental bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// ComponentVersion describes the version information for a specific component.
|
|
||||||
type ComponentVersion struct {
|
|
||||||
Name string
|
|
||||||
Version string
|
|
||||||
Details map[string]string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Version contains response of Engine API:
|
|
||||||
// GET "/version"
|
|
||||||
type Version struct {
|
|
||||||
Platform struct{ Name string } `json:",omitempty"`
|
|
||||||
Components []ComponentVersion `json:",omitempty"`
|
|
||||||
|
|
||||||
// The following fields are deprecated, they relate to the Engine component and are kept for backwards compatibility
|
|
||||||
|
|
||||||
Version string
|
|
||||||
APIVersion string `json:"ApiVersion"`
|
|
||||||
MinAPIVersion string `json:"MinAPIVersion,omitempty"`
|
|
||||||
GitCommit string
|
|
||||||
GoVersion string
|
|
||||||
Os string
|
|
||||||
Arch string
|
|
||||||
KernelVersion string `json:",omitempty"`
|
|
||||||
Experimental bool `json:",omitempty"`
|
|
||||||
BuildTime string `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Commit holds the Git-commit (SHA1) that a binary was built from, as reported
|
|
||||||
// in the version-string of external tools, such as containerd, or runC.
|
|
||||||
type Commit struct {
|
|
||||||
ID string // ID is the actual commit ID of external tool.
|
|
||||||
Expected string // Expected is the commit ID of external tool expected by dockerd as set at build time.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Info contains response of Engine API:
|
|
||||||
// GET "/info"
|
|
||||||
type Info struct {
|
|
||||||
ID string
|
|
||||||
Containers int
|
|
||||||
ContainersRunning int
|
|
||||||
ContainersPaused int
|
|
||||||
ContainersStopped int
|
|
||||||
Images int
|
|
||||||
Driver string
|
|
||||||
DriverStatus [][2]string
|
|
||||||
SystemStatus [][2]string
|
|
||||||
Plugins PluginsInfo
|
|
||||||
MemoryLimit bool
|
|
||||||
SwapLimit bool
|
|
||||||
KernelMemory bool
|
|
||||||
CPUCfsPeriod bool `json:"CpuCfsPeriod"`
|
|
||||||
CPUCfsQuota bool `json:"CpuCfsQuota"`
|
|
||||||
CPUShares bool
|
|
||||||
CPUSet bool
|
|
||||||
IPv4Forwarding bool
|
|
||||||
BridgeNfIptables bool
|
|
||||||
BridgeNfIP6tables bool `json:"BridgeNfIp6tables"`
|
|
||||||
Debug bool
|
|
||||||
NFd int
|
|
||||||
OomKillDisable bool
|
|
||||||
NGoroutines int
|
|
||||||
SystemTime string
|
|
||||||
LoggingDriver string
|
|
||||||
CgroupDriver string
|
|
||||||
NEventsListener int
|
|
||||||
KernelVersion string
|
|
||||||
OperatingSystem string
|
|
||||||
OSType string
|
|
||||||
Architecture string
|
|
||||||
IndexServerAddress string
|
|
||||||
RegistryConfig *registry.ServiceConfig
|
|
||||||
NCPU int
|
|
||||||
MemTotal int64
|
|
||||||
GenericResources []swarm.GenericResource
|
|
||||||
DockerRootDir string
|
|
||||||
HTTPProxy string `json:"HttpProxy"`
|
|
||||||
HTTPSProxy string `json:"HttpsProxy"`
|
|
||||||
NoProxy string
|
|
||||||
Name string
|
|
||||||
Labels []string
|
|
||||||
ExperimentalBuild bool
|
|
||||||
ServerVersion string
|
|
||||||
ClusterStore string
|
|
||||||
ClusterAdvertise string
|
|
||||||
Runtimes map[string]Runtime
|
|
||||||
DefaultRuntime string
|
|
||||||
Swarm swarm.Info
|
|
||||||
// LiveRestoreEnabled determines whether containers should be kept
|
|
||||||
// running when the daemon is shutdown or upon daemon start if
|
|
||||||
// running containers are detected
|
|
||||||
LiveRestoreEnabled bool
|
|
||||||
Isolation container.Isolation
|
|
||||||
InitBinary string
|
|
||||||
ContainerdCommit Commit
|
|
||||||
RuncCommit Commit
|
|
||||||
InitCommit Commit
|
|
||||||
SecurityOptions []string
|
|
||||||
}
|
|
||||||
|
|
||||||
// KeyValue holds a key/value pair
|
|
||||||
type KeyValue struct {
|
|
||||||
Key, Value string
|
|
||||||
}
|
|
||||||
|
|
||||||
// SecurityOpt contains the name and options of a security option
|
|
||||||
type SecurityOpt struct {
|
|
||||||
Name string
|
|
||||||
Options []KeyValue
|
|
||||||
}
|
|
||||||
|
|
||||||
// DecodeSecurityOptions decodes a security options string slice to a type safe
|
|
||||||
// SecurityOpt
|
|
||||||
func DecodeSecurityOptions(opts []string) ([]SecurityOpt, error) {
|
|
||||||
so := []SecurityOpt{}
|
|
||||||
for _, opt := range opts {
|
|
||||||
// support output from a < 1.13 docker daemon
|
|
||||||
if !strings.Contains(opt, "=") {
|
|
||||||
so = append(so, SecurityOpt{Name: opt})
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
secopt := SecurityOpt{}
|
|
||||||
split := strings.Split(opt, ",")
|
|
||||||
for _, s := range split {
|
|
||||||
kv := strings.SplitN(s, "=", 2)
|
|
||||||
if len(kv) != 2 {
|
|
||||||
return nil, fmt.Errorf("invalid security option %q", s)
|
|
||||||
}
|
|
||||||
if kv[0] == "" || kv[1] == "" {
|
|
||||||
return nil, errors.New("invalid empty security option")
|
|
||||||
}
|
|
||||||
if kv[0] == "name" {
|
|
||||||
secopt.Name = kv[1]
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
secopt.Options = append(secopt.Options, KeyValue{Key: kv[0], Value: kv[1]})
|
|
||||||
}
|
|
||||||
so = append(so, secopt)
|
|
||||||
}
|
|
||||||
return so, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginsInfo is a temp struct holding Plugins name
|
|
||||||
// registered with docker daemon. It is used by Info struct
|
|
||||||
type PluginsInfo struct {
|
|
||||||
// List of Volume plugins registered
|
|
||||||
Volume []string
|
|
||||||
// List of Network plugins registered
|
|
||||||
Network []string
|
|
||||||
// List of Authorization plugins registered
|
|
||||||
Authorization []string
|
|
||||||
// List of Log plugins registered
|
|
||||||
Log []string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExecStartCheck is a temp struct used by execStart
|
|
||||||
// Config fields is part of ExecConfig in runconfig package
|
|
||||||
type ExecStartCheck struct {
|
|
||||||
// ExecStart will first check if it's detached
|
|
||||||
Detach bool
|
|
||||||
// Check if there's a tty
|
|
||||||
Tty bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// HealthcheckResult stores information about a single run of a healthcheck probe
|
|
||||||
type HealthcheckResult struct {
|
|
||||||
Start time.Time // Start is the time this check started
|
|
||||||
End time.Time // End is the time this check ended
|
|
||||||
ExitCode int // ExitCode meanings: 0=healthy, 1=unhealthy, 2=reserved (considered unhealthy), else=error running probe
|
|
||||||
Output string // Output from last check
|
|
||||||
}
|
|
||||||
|
|
||||||
// Health states
|
|
||||||
const (
|
|
||||||
NoHealthcheck = "none" // Indicates there is no healthcheck
|
|
||||||
Starting = "starting" // Starting indicates that the container is not yet ready
|
|
||||||
Healthy = "healthy" // Healthy indicates that the container is running correctly
|
|
||||||
Unhealthy = "unhealthy" // Unhealthy indicates that the container has a problem
|
|
||||||
)
|
|
||||||
|
|
||||||
// Health stores information about the container's healthcheck results
|
|
||||||
type Health struct {
|
|
||||||
Status string // Status is one of Starting, Healthy or Unhealthy
|
|
||||||
FailingStreak int // FailingStreak is the number of consecutive failures
|
|
||||||
Log []*HealthcheckResult // Log contains the last few results (oldest first)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerState stores container's running state
|
|
||||||
// it's part of ContainerJSONBase and will return by "inspect" command
|
|
||||||
type ContainerState struct {
|
|
||||||
Status string // String representation of the container state. Can be one of "created", "running", "paused", "restarting", "removing", "exited", or "dead"
|
|
||||||
Running bool
|
|
||||||
Paused bool
|
|
||||||
Restarting bool
|
|
||||||
OOMKilled bool
|
|
||||||
Dead bool
|
|
||||||
Pid int
|
|
||||||
ExitCode int
|
|
||||||
Error string
|
|
||||||
StartedAt string
|
|
||||||
FinishedAt string
|
|
||||||
Health *Health `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerNode stores information about the node that a container
|
|
||||||
// is running on. It's only available in Docker Swarm
|
|
||||||
type ContainerNode struct {
|
|
||||||
ID string
|
|
||||||
IPAddress string `json:"IP"`
|
|
||||||
Addr string
|
|
||||||
Name string
|
|
||||||
Cpus int
|
|
||||||
Memory int64
|
|
||||||
Labels map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerJSONBase contains response of Engine API:
|
|
||||||
// GET "/containers/{name:.*}/json"
|
|
||||||
type ContainerJSONBase struct {
|
|
||||||
ID string `json:"Id"`
|
|
||||||
Created string
|
|
||||||
Path string
|
|
||||||
Args []string
|
|
||||||
State *ContainerState
|
|
||||||
Image string
|
|
||||||
ResolvConfPath string
|
|
||||||
HostnamePath string
|
|
||||||
HostsPath string
|
|
||||||
LogPath string
|
|
||||||
Node *ContainerNode `json:",omitempty"`
|
|
||||||
Name string
|
|
||||||
RestartCount int
|
|
||||||
Driver string
|
|
||||||
Platform string
|
|
||||||
MountLabel string
|
|
||||||
ProcessLabel string
|
|
||||||
AppArmorProfile string
|
|
||||||
ExecIDs []string
|
|
||||||
HostConfig *container.HostConfig
|
|
||||||
GraphDriver GraphDriverData
|
|
||||||
SizeRw *int64 `json:",omitempty"`
|
|
||||||
SizeRootFs *int64 `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerJSON is newly used struct along with MountPoint
|
|
||||||
type ContainerJSON struct {
|
|
||||||
*ContainerJSONBase
|
|
||||||
Mounts []MountPoint
|
|
||||||
Config *container.Config
|
|
||||||
NetworkSettings *NetworkSettings
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkSettings exposes the network settings in the api
|
|
||||||
type NetworkSettings struct {
|
|
||||||
NetworkSettingsBase
|
|
||||||
DefaultNetworkSettings
|
|
||||||
Networks map[string]*network.EndpointSettings
|
|
||||||
}
|
|
||||||
|
|
||||||
// SummaryNetworkSettings provides a summary of container's networks
|
|
||||||
// in /containers/json
|
|
||||||
type SummaryNetworkSettings struct {
|
|
||||||
Networks map[string]*network.EndpointSettings
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkSettingsBase holds basic information about networks
|
|
||||||
type NetworkSettingsBase struct {
|
|
||||||
Bridge string // Bridge is the Bridge name the network uses(e.g. `docker0`)
|
|
||||||
SandboxID string // SandboxID uniquely represents a container's network stack
|
|
||||||
HairpinMode bool // HairpinMode specifies if hairpin NAT should be enabled on the virtual interface
|
|
||||||
LinkLocalIPv6Address string // LinkLocalIPv6Address is an IPv6 unicast address using the link-local prefix
|
|
||||||
LinkLocalIPv6PrefixLen int // LinkLocalIPv6PrefixLen is the prefix length of an IPv6 unicast address
|
|
||||||
Ports nat.PortMap // Ports is a collection of PortBinding indexed by Port
|
|
||||||
SandboxKey string // SandboxKey identifies the sandbox
|
|
||||||
SecondaryIPAddresses []network.Address
|
|
||||||
SecondaryIPv6Addresses []network.Address
|
|
||||||
}
|
|
||||||
|
|
||||||
// DefaultNetworkSettings holds network information
|
|
||||||
// during the 2 release deprecation period.
|
|
||||||
// It will be removed in Docker 1.11.
|
|
||||||
type DefaultNetworkSettings struct {
|
|
||||||
EndpointID string // EndpointID uniquely represents a service endpoint in a Sandbox
|
|
||||||
Gateway string // Gateway holds the gateway address for the network
|
|
||||||
GlobalIPv6Address string // GlobalIPv6Address holds network's global IPv6 address
|
|
||||||
GlobalIPv6PrefixLen int // GlobalIPv6PrefixLen represents mask length of network's global IPv6 address
|
|
||||||
IPAddress string // IPAddress holds the IPv4 address for the network
|
|
||||||
IPPrefixLen int // IPPrefixLen represents mask length of network's IPv4 address
|
|
||||||
IPv6Gateway string // IPv6Gateway holds gateway address specific for IPv6
|
|
||||||
MacAddress string // MacAddress holds the MAC address for the network
|
|
||||||
}
|
|
||||||
|
|
||||||
// MountPoint represents a mount point configuration inside the container.
|
|
||||||
// This is used for reporting the mountpoints in use by a container.
|
|
||||||
type MountPoint struct {
|
|
||||||
Type mount.Type `json:",omitempty"`
|
|
||||||
Name string `json:",omitempty"`
|
|
||||||
Source string
|
|
||||||
Destination string
|
|
||||||
Driver string `json:",omitempty"`
|
|
||||||
Mode string
|
|
||||||
RW bool
|
|
||||||
Propagation mount.Propagation
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkResource is the body of the "get network" http response message
|
|
||||||
type NetworkResource struct {
|
|
||||||
Name string // Name is the requested name of the network
|
|
||||||
ID string `json:"Id"` // ID uniquely identifies a network on a single machine
|
|
||||||
Created time.Time // Created is the time the network created
|
|
||||||
Scope string // Scope describes the level at which the network exists (e.g. `swarm` for cluster-wide or `local` for machine level)
|
|
||||||
Driver string // Driver is the Driver name used to create the network (e.g. `bridge`, `overlay`)
|
|
||||||
EnableIPv6 bool // EnableIPv6 represents whether to enable IPv6
|
|
||||||
IPAM network.IPAM // IPAM is the network's IP Address Management
|
|
||||||
Internal bool // Internal represents if the network is used internal only
|
|
||||||
Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode.
|
|
||||||
Ingress bool // Ingress indicates the network is providing the routing-mesh for the swarm cluster.
|
|
||||||
ConfigFrom network.ConfigReference // ConfigFrom specifies the source which will provide the configuration for this network.
|
|
||||||
ConfigOnly bool // ConfigOnly networks are place-holder networks for network configurations to be used by other networks. ConfigOnly networks cannot be used directly to run containers or services.
|
|
||||||
Containers map[string]EndpointResource // Containers contains endpoints belonging to the network
|
|
||||||
Options map[string]string // Options holds the network specific options to use for when creating the network
|
|
||||||
Labels map[string]string // Labels holds metadata specific to the network being created
|
|
||||||
Peers []network.PeerInfo `json:",omitempty"` // List of peer nodes for an overlay network
|
|
||||||
Services map[string]network.ServiceInfo `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// EndpointResource contains network resources allocated and used for a container in a network
|
|
||||||
type EndpointResource struct {
|
|
||||||
Name string
|
|
||||||
EndpointID string
|
|
||||||
MacAddress string
|
|
||||||
IPv4Address string
|
|
||||||
IPv6Address string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkCreate is the expected body of the "create network" http request message
|
|
||||||
type NetworkCreate struct {
|
|
||||||
// Check for networks with duplicate names.
|
|
||||||
// Network is primarily keyed based on a random ID and not on the name.
|
|
||||||
// Network name is strictly a user-friendly alias to the network
|
|
||||||
// which is uniquely identified using ID.
|
|
||||||
// And there is no guaranteed way to check for duplicates.
|
|
||||||
// Option CheckDuplicate is there to provide a best effort checking of any networks
|
|
||||||
// which has the same name but it is not guaranteed to catch all name collisions.
|
|
||||||
CheckDuplicate bool
|
|
||||||
Driver string
|
|
||||||
Scope string
|
|
||||||
EnableIPv6 bool
|
|
||||||
IPAM *network.IPAM
|
|
||||||
Internal bool
|
|
||||||
Attachable bool
|
|
||||||
Ingress bool
|
|
||||||
ConfigOnly bool
|
|
||||||
ConfigFrom *network.ConfigReference
|
|
||||||
Options map[string]string
|
|
||||||
Labels map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkCreateRequest is the request message sent to the server for network create call.
|
|
||||||
type NetworkCreateRequest struct {
|
|
||||||
NetworkCreate
|
|
||||||
Name string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkCreateResponse is the response message sent by the server for network create call
|
|
||||||
type NetworkCreateResponse struct {
|
|
||||||
ID string `json:"Id"`
|
|
||||||
Warning string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkConnect represents the data to be used to connect a container to the network
|
|
||||||
type NetworkConnect struct {
|
|
||||||
Container string
|
|
||||||
EndpointConfig *network.EndpointSettings `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkDisconnect represents the data to be used to disconnect a container from the network
|
|
||||||
type NetworkDisconnect struct {
|
|
||||||
Container string
|
|
||||||
Force bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkInspectOptions holds parameters to inspect network
|
|
||||||
type NetworkInspectOptions struct {
|
|
||||||
Scope string
|
|
||||||
Verbose bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// Checkpoint represents the details of a checkpoint
|
|
||||||
type Checkpoint struct {
|
|
||||||
Name string // Name is the name of the checkpoint
|
|
||||||
}
|
|
||||||
|
|
||||||
// Runtime describes an OCI runtime
|
|
||||||
type Runtime struct {
|
|
||||||
Path string `json:"path"`
|
|
||||||
Args []string `json:"runtimeArgs,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// DiskUsage contains response of Engine API:
|
|
||||||
// GET "/system/df"
|
|
||||||
type DiskUsage struct {
|
|
||||||
LayersSize int64
|
|
||||||
Images []*ImageSummary
|
|
||||||
Containers []*Container
|
|
||||||
Volumes []*Volume
|
|
||||||
BuilderSize int64
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainersPruneReport contains the response for Engine API:
|
|
||||||
// POST "/containers/prune"
|
|
||||||
type ContainersPruneReport struct {
|
|
||||||
ContainersDeleted []string
|
|
||||||
SpaceReclaimed uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// VolumesPruneReport contains the response for Engine API:
|
|
||||||
// POST "/volumes/prune"
|
|
||||||
type VolumesPruneReport struct {
|
|
||||||
VolumesDeleted []string
|
|
||||||
SpaceReclaimed uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImagesPruneReport contains the response for Engine API:
|
|
||||||
// POST "/images/prune"
|
|
||||||
type ImagesPruneReport struct {
|
|
||||||
ImagesDeleted []ImageDeleteResponseItem
|
|
||||||
SpaceReclaimed uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// BuildCachePruneReport contains the response for Engine API:
|
|
||||||
// POST "/build/prune"
|
|
||||||
type BuildCachePruneReport struct {
|
|
||||||
SpaceReclaimed uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworksPruneReport contains the response for Engine API:
|
|
||||||
// POST "/networks/prune"
|
|
||||||
type NetworksPruneReport struct {
|
|
||||||
NetworksDeleted []string
|
|
||||||
}
|
|
||||||
|
|
||||||
// SecretCreateResponse contains the information returned to a client
|
|
||||||
// on the creation of a new secret.
|
|
||||||
type SecretCreateResponse struct {
|
|
||||||
// ID is the id of the created secret.
|
|
||||||
ID string
|
|
||||||
}
|
|
||||||
|
|
||||||
// SecretListOptions holds parameters to list secrets
|
|
||||||
type SecretListOptions struct {
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// ConfigCreateResponse contains the information returned to a client
|
|
||||||
// on the creation of a new config.
|
|
||||||
type ConfigCreateResponse struct {
|
|
||||||
// ID is the id of the created config.
|
|
||||||
ID string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ConfigListOptions holds parameters to list configs
|
|
||||||
type ConfigListOptions struct {
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// PushResult contains the tag, manifest digest, and manifest size from the
|
|
||||||
// push. It's used to signal this information to the trust code in the client
|
|
||||||
// so it can sign the manifest if necessary.
|
|
||||||
type PushResult struct {
|
|
||||||
Tag string
|
|
||||||
Digest string
|
|
||||||
Size int
|
|
||||||
}
|
|
||||||
|
|
||||||
// BuildResult contains the image id of a successful build
|
|
||||||
type BuildResult struct {
|
|
||||||
ID string
|
|
||||||
}
|
|
14
vendor/github.com/docker/docker/api/types/versions/README.md
generated
vendored
14
vendor/github.com/docker/docker/api/types/versions/README.md
generated
vendored
@ -1,14 +0,0 @@
|
|||||||
# Legacy API type versions
|
|
||||||
|
|
||||||
This package includes types for legacy API versions. The stable version of the API types live in `api/types/*.go`.
|
|
||||||
|
|
||||||
Consider moving a type here when you need to keep backwards compatibility in the API. This legacy types are organized by the latest API version they appear in. For instance, types in the `v1p19` package are valid for API versions below or equal `1.19`. Types in the `v1p20` package are valid for the API version `1.20`, since the versions below that will use the legacy types in `v1p19`.
|
|
||||||
|
|
||||||
## Package name conventions
|
|
||||||
|
|
||||||
The package name convention is to use `v` as a prefix for the version number and `p`(patch) as a separator. We use this nomenclature due to a few restrictions in the Go package name convention:
|
|
||||||
|
|
||||||
1. We cannot use `.` because it's interpreted by the language, think of `v1.20.CallFunction`.
|
|
||||||
2. We cannot use `_` because golint complains about it. The code is actually valid, but it looks probably more weird: `v1_20.CallFunction`.
|
|
||||||
|
|
||||||
For instance, if you want to modify a type that was available in the version `1.21` of the API but it will have different fields in the version `1.22`, you want to create a new package under `api/types/versions/v1p21`.
|
|
62
vendor/github.com/docker/docker/api/types/versions/compare.go
generated
vendored
62
vendor/github.com/docker/docker/api/types/versions/compare.go
generated
vendored
@ -1,62 +0,0 @@
|
|||||||
package versions // import "github.com/docker/docker/api/types/versions"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// compare compares two version strings
|
|
||||||
// returns -1 if v1 < v2, 1 if v1 > v2, 0 otherwise.
|
|
||||||
func compare(v1, v2 string) int {
|
|
||||||
var (
|
|
||||||
currTab = strings.Split(v1, ".")
|
|
||||||
otherTab = strings.Split(v2, ".")
|
|
||||||
)
|
|
||||||
|
|
||||||
max := len(currTab)
|
|
||||||
if len(otherTab) > max {
|
|
||||||
max = len(otherTab)
|
|
||||||
}
|
|
||||||
for i := 0; i < max; i++ {
|
|
||||||
var currInt, otherInt int
|
|
||||||
|
|
||||||
if len(currTab) > i {
|
|
||||||
currInt, _ = strconv.Atoi(currTab[i])
|
|
||||||
}
|
|
||||||
if len(otherTab) > i {
|
|
||||||
otherInt, _ = strconv.Atoi(otherTab[i])
|
|
||||||
}
|
|
||||||
if currInt > otherInt {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
if otherInt > currInt {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// LessThan checks if a version is less than another
|
|
||||||
func LessThan(v, other string) bool {
|
|
||||||
return compare(v, other) == -1
|
|
||||||
}
|
|
||||||
|
|
||||||
// LessThanOrEqualTo checks if a version is less than or equal to another
|
|
||||||
func LessThanOrEqualTo(v, other string) bool {
|
|
||||||
return compare(v, other) <= 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// GreaterThan checks if a version is greater than another
|
|
||||||
func GreaterThan(v, other string) bool {
|
|
||||||
return compare(v, other) == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
// GreaterThanOrEqualTo checks if a version is greater than or equal to another
|
|
||||||
func GreaterThanOrEqualTo(v, other string) bool {
|
|
||||||
return compare(v, other) >= 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equal checks if a version is equal to another
|
|
||||||
func Equal(v, other string) bool {
|
|
||||||
return compare(v, other) == 0
|
|
||||||
}
|
|
69
vendor/github.com/docker/docker/api/types/volume.go
generated
vendored
69
vendor/github.com/docker/docker/api/types/volume.go
generated
vendored
@ -1,69 +0,0 @@
|
|||||||
package types
|
|
||||||
|
|
||||||
// This file was generated by the swagger tool.
|
|
||||||
// Editing this file might prove futile when you re-run the swagger generate command
|
|
||||||
|
|
||||||
// Volume volume
|
|
||||||
// swagger:model Volume
|
|
||||||
type Volume struct {
|
|
||||||
|
|
||||||
// Date/Time the volume was created.
|
|
||||||
CreatedAt string `json:"CreatedAt,omitempty"`
|
|
||||||
|
|
||||||
// Name of the volume driver used by the volume.
|
|
||||||
// Required: true
|
|
||||||
Driver string `json:"Driver"`
|
|
||||||
|
|
||||||
// User-defined key/value metadata.
|
|
||||||
// Required: true
|
|
||||||
Labels map[string]string `json:"Labels"`
|
|
||||||
|
|
||||||
// Mount path of the volume on the host.
|
|
||||||
// Required: true
|
|
||||||
Mountpoint string `json:"Mountpoint"`
|
|
||||||
|
|
||||||
// Name of the volume.
|
|
||||||
// Required: true
|
|
||||||
Name string `json:"Name"`
|
|
||||||
|
|
||||||
// The driver specific options used when creating the volume.
|
|
||||||
// Required: true
|
|
||||||
Options map[string]string `json:"Options"`
|
|
||||||
|
|
||||||
// The level at which the volume exists. Either `global` for cluster-wide, or `local` for machine level.
|
|
||||||
// Required: true
|
|
||||||
Scope string `json:"Scope"`
|
|
||||||
|
|
||||||
// Low-level details about the volume, provided by the volume driver.
|
|
||||||
// Details are returned as a map with key/value pairs:
|
|
||||||
// `{"key":"value","key2":"value2"}`.
|
|
||||||
//
|
|
||||||
// The `Status` field is optional, and is omitted if the volume driver
|
|
||||||
// does not support this feature.
|
|
||||||
//
|
|
||||||
Status map[string]interface{} `json:"Status,omitempty"`
|
|
||||||
|
|
||||||
// usage data
|
|
||||||
UsageData *VolumeUsageData `json:"UsageData,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// VolumeUsageData Usage details about the volume. This information is used by the
|
|
||||||
// `GET /system/df` endpoint, and omitted in other endpoints.
|
|
||||||
//
|
|
||||||
// swagger:model VolumeUsageData
|
|
||||||
type VolumeUsageData struct {
|
|
||||||
|
|
||||||
// The number of containers referencing this volume. This field
|
|
||||||
// is set to `-1` if the reference-count is not available.
|
|
||||||
//
|
|
||||||
// Required: true
|
|
||||||
RefCount int64 `json:"RefCount"`
|
|
||||||
|
|
||||||
// Amount of disk space used by the volume (in bytes). This information
|
|
||||||
// is only available for volumes created with the `"local"` volume
|
|
||||||
// driver. For volumes created with other volume drivers, this field
|
|
||||||
// is set to `-1` ("not available")
|
|
||||||
//
|
|
||||||
// Required: true
|
|
||||||
Size int64 `json:"Size"`
|
|
||||||
}
|
|
29
vendor/github.com/docker/docker/api/types/volume/volume_create.go
generated
vendored
29
vendor/github.com/docker/docker/api/types/volume/volume_create.go
generated
vendored
@ -1,29 +0,0 @@
|
|||||||
package volume
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// DO NOT EDIT THIS FILE
|
|
||||||
// This file was generated by `swagger generate operation`
|
|
||||||
//
|
|
||||||
// See hack/generate-swagger-api.sh
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// VolumeCreateBody
|
|
||||||
// swagger:model VolumeCreateBody
|
|
||||||
type VolumeCreateBody struct {
|
|
||||||
|
|
||||||
// Name of the volume driver to use.
|
|
||||||
// Required: true
|
|
||||||
Driver string `json:"Driver"`
|
|
||||||
|
|
||||||
// A mapping of driver options and values. These options are passed directly to the driver and are driver specific.
|
|
||||||
// Required: true
|
|
||||||
DriverOpts map[string]string `json:"DriverOpts"`
|
|
||||||
|
|
||||||
// User-defined key/value metadata.
|
|
||||||
// Required: true
|
|
||||||
Labels map[string]string `json:"Labels"`
|
|
||||||
|
|
||||||
// The new volume's name. If not specified, Docker generates a name.
|
|
||||||
// Required: true
|
|
||||||
Name string `json:"Name"`
|
|
||||||
}
|
|
23
vendor/github.com/docker/docker/api/types/volume/volume_list.go
generated
vendored
23
vendor/github.com/docker/docker/api/types/volume/volume_list.go
generated
vendored
@ -1,23 +0,0 @@
|
|||||||
package volume
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// DO NOT EDIT THIS FILE
|
|
||||||
// This file was generated by `swagger generate operation`
|
|
||||||
//
|
|
||||||
// See hack/generate-swagger-api.sh
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
import "github.com/docker/docker/api/types"
|
|
||||||
|
|
||||||
// VolumeListOKBody
|
|
||||||
// swagger:model VolumeListOKBody
|
|
||||||
type VolumeListOKBody struct {
|
|
||||||
|
|
||||||
// List of volumes
|
|
||||||
// Required: true
|
|
||||||
Volumes []*types.Volume `json:"Volumes"`
|
|
||||||
|
|
||||||
// Warnings that occurred when fetching the list of volumes
|
|
||||||
// Required: true
|
|
||||||
Warnings []string `json:"Warnings"`
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user