Merge pull request #1597 from stevvooe/introspection-service
api/services: define the introspection API
This commit is contained in:
commit
60960e1c17
4
Makefile
4
Makefile
@ -87,7 +87,7 @@ check-protos: protos ## check if protobufs needs to be generated again
|
|||||||
@echo "$(WHALE) $@"
|
@echo "$(WHALE) $@"
|
||||||
@test -z "$$(git status --short | grep ".pb.go" | tee /dev/stderr)" || \
|
@test -z "$$(git status --short | grep ".pb.go" | tee /dev/stderr)" || \
|
||||||
((git diff | cat) && \
|
((git diff | cat) && \
|
||||||
(echo "$(ONI) please run 'make generate' when making changes to proto files" && false))
|
(echo "$(ONI) please run 'make protos' when making changes to proto files" && false))
|
||||||
|
|
||||||
check-api-descriptors: protos ## check that protobuf changes aren't present.
|
check-api-descriptors: protos ## check that protobuf changes aren't present.
|
||||||
@echo "$(WHALE) $@"
|
@echo "$(WHALE) $@"
|
||||||
@ -105,7 +105,7 @@ fmt: ## run go fmt
|
|||||||
@echo "$(WHALE) $@"
|
@echo "$(WHALE) $@"
|
||||||
@test -z "$$(gofmt -s -l . | grep -Fv $(call FIX_PATH,'vendor/') | grep -v ".pb.go$$" | tee /dev/stderr)" || \
|
@test -z "$$(gofmt -s -l . | grep -Fv $(call FIX_PATH,'vendor/') | grep -v ".pb.go$$" | tee /dev/stderr)" || \
|
||||||
(echo "$(ONI) please format Go code with 'gofmt -s -w'" && false)
|
(echo "$(ONI) please format Go code with 'gofmt -s -w'" && false)
|
||||||
@test -z "$$(find . -path ./vendor -prune -o ! -name timestamp.proto ! -name duration.proto -name '*.proto' -type f -exec grep -Hn -e "^ " {} \; | tee /dev/stderr)" || \
|
@test -z "$$(find . -path ./vendor -prune -o -path ./protobuf/google/rpc -prune -o -name '*.proto' -type f -exec grep -Hn -e "^ " {} \; | tee /dev/stderr)" || \
|
||||||
(echo "$(ONI) please indent proto files with tabs only" && false)
|
(echo "$(ONI) please indent proto files with tabs only" && false)
|
||||||
@test -z "$$(find . -path ./vendor -prune -o -name '*.proto' -type f -exec grep -Hn "Meta meta = " {} \; | grep -v '(gogoproto.nullable) = false' | tee /dev/stderr)" || \
|
@test -z "$$(find . -path ./vendor -prune -o -name '*.proto' -type f -exec grep -Hn "Meta meta = " {} \; | grep -v '(gogoproto.nullable) = false' | tee /dev/stderr)" || \
|
||||||
(echo "$(ONI) meta fields in proto files must have option (gogoproto.nullable) = false" && false)
|
(echo "$(ONI) meta fields in proto files must have option (gogoproto.nullable) = false" && false)
|
||||||
|
@ -7,12 +7,12 @@ plugins = ["grpc", "fieldpath"]
|
|||||||
[includes]
|
[includes]
|
||||||
# Include paths that will be added before all others. Typically, you want to
|
# Include paths that will be added before all others. Typically, you want to
|
||||||
# treat the root of the project as an include, but this may not be necessary.
|
# treat the root of the project as an include, but this may not be necessary.
|
||||||
# before = ["."]
|
before = ["./protobuf"]
|
||||||
|
|
||||||
# Paths that should be treated as include roots in relation to the vendor
|
# Paths that should be treated as include roots in relation to the vendor
|
||||||
# directory. These will be calculated with the vendor directory nearest the
|
# directory. These will be calculated with the vendor directory nearest the
|
||||||
# target package.
|
# target package.
|
||||||
vendored = ["github.com/gogo/protobuf"]
|
packages = ["github.com/gogo/protobuf"]
|
||||||
|
|
||||||
# Paths that will be added untouched to the end of the includes. We use
|
# Paths that will be added untouched to the end of the includes. We use
|
||||||
# `/usr/local/include` to pickup the common install location of protobuf.
|
# `/usr/local/include` to pickup the common install location of protobuf.
|
||||||
@ -27,6 +27,8 @@ plugins = ["grpc", "fieldpath"]
|
|||||||
"google/protobuf/descriptor.proto" = "github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
|
"google/protobuf/descriptor.proto" = "github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
|
||||||
"google/protobuf/field_mask.proto" = "github.com/gogo/protobuf/types"
|
"google/protobuf/field_mask.proto" = "github.com/gogo/protobuf/types"
|
||||||
"google/protobuf/timestamp.proto" = "github.com/gogo/protobuf/types"
|
"google/protobuf/timestamp.proto" = "github.com/gogo/protobuf/types"
|
||||||
|
"google/protobuf/duration.proto" = "github.com/gogo/protobuf/types"
|
||||||
|
"google/rpc/status.proto" = "github.com/containerd/containerd/protobuf/google/rpc"
|
||||||
|
|
||||||
# Aggregrate the API descriptors to lock down API changes.
|
# Aggregrate the API descriptors to lock down API changes.
|
||||||
[[descriptors]]
|
[[descriptors]]
|
||||||
|
195
api/next.pb.txt
195
api/next.pb.txt
@ -2182,6 +2182,201 @@ file {
|
|||||||
}
|
}
|
||||||
syntax: "proto3"
|
syntax: "proto3"
|
||||||
}
|
}
|
||||||
|
file {
|
||||||
|
name: "github.com/containerd/containerd/api/types/platform.proto"
|
||||||
|
package: "containerd.types"
|
||||||
|
dependency: "gogoproto/gogo.proto"
|
||||||
|
message_type {
|
||||||
|
name: "Platform"
|
||||||
|
field {
|
||||||
|
name: "os"
|
||||||
|
number: 1
|
||||||
|
label: LABEL_OPTIONAL
|
||||||
|
type: TYPE_STRING
|
||||||
|
options {
|
||||||
|
65004: "OS"
|
||||||
|
}
|
||||||
|
json_name: "os"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "architecture"
|
||||||
|
number: 2
|
||||||
|
label: LABEL_OPTIONAL
|
||||||
|
type: TYPE_STRING
|
||||||
|
json_name: "architecture"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "variant"
|
||||||
|
number: 3
|
||||||
|
label: LABEL_OPTIONAL
|
||||||
|
type: TYPE_STRING
|
||||||
|
json_name: "variant"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
go_package: "github.com/containerd/containerd/api/types;types"
|
||||||
|
}
|
||||||
|
syntax: "proto3"
|
||||||
|
}
|
||||||
|
file {
|
||||||
|
name: "google/rpc/status.proto"
|
||||||
|
package: "google.rpc"
|
||||||
|
dependency: "google/protobuf/any.proto"
|
||||||
|
message_type {
|
||||||
|
name: "Status"
|
||||||
|
field {
|
||||||
|
name: "code"
|
||||||
|
number: 1
|
||||||
|
label: LABEL_OPTIONAL
|
||||||
|
type: TYPE_INT32
|
||||||
|
json_name: "code"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "message"
|
||||||
|
number: 2
|
||||||
|
label: LABEL_OPTIONAL
|
||||||
|
type: TYPE_STRING
|
||||||
|
json_name: "message"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "details"
|
||||||
|
number: 3
|
||||||
|
label: LABEL_REPEATED
|
||||||
|
type: TYPE_MESSAGE
|
||||||
|
type_name: ".google.protobuf.Any"
|
||||||
|
json_name: "details"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
java_package: "com.google.rpc"
|
||||||
|
java_outer_classname: "StatusProto"
|
||||||
|
java_multiple_files: true
|
||||||
|
go_package: "github.com/containerd/containerd/protobuf/google/rpc;rpc"
|
||||||
|
objc_class_prefix: "RPC"
|
||||||
|
}
|
||||||
|
syntax: "proto3"
|
||||||
|
}
|
||||||
|
file {
|
||||||
|
name: "github.com/containerd/containerd/api/services/introspection/v1/introspection.proto"
|
||||||
|
package: "containerd.services.introspection.v1"
|
||||||
|
dependency: "github.com/containerd/containerd/api/types/platform.proto"
|
||||||
|
dependency: "google/rpc/status.proto"
|
||||||
|
dependency: "gogoproto/gogo.proto"
|
||||||
|
message_type {
|
||||||
|
name: "Plugin"
|
||||||
|
field {
|
||||||
|
name: "type"
|
||||||
|
number: 1
|
||||||
|
label: LABEL_OPTIONAL
|
||||||
|
type: TYPE_STRING
|
||||||
|
json_name: "type"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "id"
|
||||||
|
number: 2
|
||||||
|
label: LABEL_OPTIONAL
|
||||||
|
type: TYPE_STRING
|
||||||
|
json_name: "id"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "requires"
|
||||||
|
number: 3
|
||||||
|
label: LABEL_REPEATED
|
||||||
|
type: TYPE_STRING
|
||||||
|
json_name: "requires"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "platforms"
|
||||||
|
number: 4
|
||||||
|
label: LABEL_REPEATED
|
||||||
|
type: TYPE_MESSAGE
|
||||||
|
type_name: ".containerd.types.Platform"
|
||||||
|
options {
|
||||||
|
65001: 0
|
||||||
|
}
|
||||||
|
json_name: "platforms"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "exports"
|
||||||
|
number: 5
|
||||||
|
label: LABEL_REPEATED
|
||||||
|
type: TYPE_MESSAGE
|
||||||
|
type_name: ".containerd.services.introspection.v1.Plugin.ExportsEntry"
|
||||||
|
json_name: "exports"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "capabilities"
|
||||||
|
number: 6
|
||||||
|
label: LABEL_REPEATED
|
||||||
|
type: TYPE_STRING
|
||||||
|
json_name: "capabilities"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "init_err"
|
||||||
|
number: 7
|
||||||
|
label: LABEL_OPTIONAL
|
||||||
|
type: TYPE_MESSAGE
|
||||||
|
type_name: ".google.rpc.Status"
|
||||||
|
json_name: "initErr"
|
||||||
|
}
|
||||||
|
nested_type {
|
||||||
|
name: "ExportsEntry"
|
||||||
|
field {
|
||||||
|
name: "key"
|
||||||
|
number: 1
|
||||||
|
label: LABEL_OPTIONAL
|
||||||
|
type: TYPE_STRING
|
||||||
|
json_name: "key"
|
||||||
|
}
|
||||||
|
field {
|
||||||
|
name: "value"
|
||||||
|
number: 2
|
||||||
|
label: LABEL_OPTIONAL
|
||||||
|
type: TYPE_STRING
|
||||||
|
json_name: "value"
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
map_entry: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
message_type {
|
||||||
|
name: "PluginsRequest"
|
||||||
|
field {
|
||||||
|
name: "filters"
|
||||||
|
number: 1
|
||||||
|
label: LABEL_REPEATED
|
||||||
|
type: TYPE_STRING
|
||||||
|
json_name: "filters"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
message_type {
|
||||||
|
name: "PluginsResponse"
|
||||||
|
field {
|
||||||
|
name: "plugins"
|
||||||
|
number: 1
|
||||||
|
label: LABEL_REPEATED
|
||||||
|
type: TYPE_MESSAGE
|
||||||
|
type_name: ".containerd.services.introspection.v1.Plugin"
|
||||||
|
options {
|
||||||
|
65001: 0
|
||||||
|
}
|
||||||
|
json_name: "plugins"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
service {
|
||||||
|
name: "Introspection"
|
||||||
|
method {
|
||||||
|
name: "Plugins"
|
||||||
|
input_type: ".containerd.services.introspection.v1.PluginsRequest"
|
||||||
|
output_type: ".containerd.services.introspection.v1.PluginsResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
go_package: "github.com/containerd/containerd/api/services/introspection/v1;introspection"
|
||||||
|
}
|
||||||
|
syntax: "proto3"
|
||||||
|
}
|
||||||
file {
|
file {
|
||||||
name: "github.com/containerd/containerd/api/services/namespaces/v1/namespace.proto"
|
name: "github.com/containerd/containerd/api/services/namespaces/v1/namespace.proto"
|
||||||
package: "containerd.services.namespaces.v1"
|
package: "containerd.services.namespaces.v1"
|
||||||
|
1
api/services/introspection/v1/doc.go
Normal file
1
api/services/introspection/v1/doc.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
package introspection
|
1175
api/services/introspection/v1/introspection.pb.go
Normal file
1175
api/services/introspection/v1/introspection.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
81
api/services/introspection/v1/introspection.proto
Normal file
81
api/services/introspection/v1/introspection.proto
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package containerd.services.introspection.v1;
|
||||||
|
|
||||||
|
import "github.com/containerd/containerd/api/types/platform.proto";
|
||||||
|
import "google/rpc/status.proto";
|
||||||
|
import "gogoproto/gogo.proto";
|
||||||
|
|
||||||
|
option go_package = "github.com/containerd/containerd/api/services/introspection/v1;introspection";
|
||||||
|
|
||||||
|
service Introspection {
|
||||||
|
// Plugins returns a list of plugins in containerd.
|
||||||
|
//
|
||||||
|
// Clients can use this to detect features and capabilities when using
|
||||||
|
// containerd.
|
||||||
|
rpc Plugins(PluginsRequest) returns (PluginsResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
message Plugin {
|
||||||
|
// Type defines the type of plugin.
|
||||||
|
//
|
||||||
|
// See package plugin for a list of possible values. Non core plugins may
|
||||||
|
// define their own values during registration.
|
||||||
|
string type = 1;
|
||||||
|
|
||||||
|
// ID identifies the plugin uniquely in the system.
|
||||||
|
string id = 2;
|
||||||
|
|
||||||
|
// Requires lists the plugin types required by this plugin.
|
||||||
|
repeated string requires = 3;
|
||||||
|
|
||||||
|
// Platforms enumerates the platforms this plugin will support.
|
||||||
|
//
|
||||||
|
// If values are provided here, the plugin will only be operable under the
|
||||||
|
// provided platforms.
|
||||||
|
//
|
||||||
|
// If this is empty, the plugin will work across all platforms.
|
||||||
|
//
|
||||||
|
// If the plugin prefers certain platforms over others, they should be
|
||||||
|
// listed from most to least preferred.
|
||||||
|
repeated types.Platform platforms = 4 [(gogoproto.nullable) = false];
|
||||||
|
|
||||||
|
// Exports allows plugins to provide values about state or configuration to
|
||||||
|
// interested parties.
|
||||||
|
//
|
||||||
|
// One example is exposing the configured path of a snapshotter plugin.
|
||||||
|
map<string, string> exports = 5;
|
||||||
|
|
||||||
|
// Capabilities allows plugins to communicate feature switches to allow
|
||||||
|
// clients to detect features that may not be on be default or may be
|
||||||
|
// different from version to version.
|
||||||
|
//
|
||||||
|
// Use this sparingly.
|
||||||
|
repeated string capabilities = 6;
|
||||||
|
|
||||||
|
// InitErr will be set if the plugin fails initialization.
|
||||||
|
//
|
||||||
|
// This means the plugin may have been registered but a non-terminal error
|
||||||
|
// was encountered during initialization.
|
||||||
|
//
|
||||||
|
// Plugins that have this value set cannot be used.
|
||||||
|
google.rpc.Status init_err = 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
message PluginsRequest {
|
||||||
|
// Filters contains one or more filters using the syntax defined in the
|
||||||
|
// containerd filter package.
|
||||||
|
//
|
||||||
|
// The returned result will be those that match any of the provided
|
||||||
|
// filters. Expanded, plugins that match the following will be
|
||||||
|
// returned:
|
||||||
|
//
|
||||||
|
// filters[0] or filters[1] or ... or filters[n-1] or filters[n]
|
||||||
|
//
|
||||||
|
// If filters is zero-length or nil, all items will be returned.
|
||||||
|
repeated string filters = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message PluginsResponse {
|
||||||
|
repeated Plugin plugins = 1 [(gogoproto.nullable) = false];
|
||||||
|
}
|
@ -9,11 +9,13 @@
|
|||||||
github.com/containerd/containerd/api/types/descriptor.proto
|
github.com/containerd/containerd/api/types/descriptor.proto
|
||||||
github.com/containerd/containerd/api/types/metrics.proto
|
github.com/containerd/containerd/api/types/metrics.proto
|
||||||
github.com/containerd/containerd/api/types/mount.proto
|
github.com/containerd/containerd/api/types/mount.proto
|
||||||
|
github.com/containerd/containerd/api/types/platform.proto
|
||||||
|
|
||||||
It has these top-level messages:
|
It has these top-level messages:
|
||||||
Descriptor
|
Descriptor
|
||||||
Metric
|
Metric
|
||||||
Mount
|
Mount
|
||||||
|
Platform
|
||||||
*/
|
*/
|
||||||
package types
|
package types
|
||||||
|
|
||||||
|
412
api/types/platform.pb.go
Normal file
412
api/types/platform.pb.go
Normal file
@ -0,0 +1,412 @@
|
|||||||
|
// Code generated by protoc-gen-gogo.
|
||||||
|
// source: github.com/containerd/containerd/api/types/platform.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
package types
|
||||||
|
|
||||||
|
import proto "github.com/gogo/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
import _ "github.com/gogo/protobuf/gogoproto"
|
||||||
|
|
||||||
|
import strings "strings"
|
||||||
|
import reflect "reflect"
|
||||||
|
|
||||||
|
import io "io"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// Platform follows the structure of the OCI platform specification, from
|
||||||
|
// descriptors.
|
||||||
|
type Platform struct {
|
||||||
|
OS string `protobuf:"bytes,1,opt,name=os,proto3" json:"os,omitempty"`
|
||||||
|
Architecture string `protobuf:"bytes,2,opt,name=architecture,proto3" json:"architecture,omitempty"`
|
||||||
|
Variant string `protobuf:"bytes,3,opt,name=variant,proto3" json:"variant,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Platform) Reset() { *m = Platform{} }
|
||||||
|
func (*Platform) ProtoMessage() {}
|
||||||
|
func (*Platform) Descriptor() ([]byte, []int) { return fileDescriptorPlatform, []int{0} }
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*Platform)(nil), "containerd.types.Platform")
|
||||||
|
}
|
||||||
|
func (m *Platform) 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 *Platform) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
var i int
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.OS) > 0 {
|
||||||
|
dAtA[i] = 0xa
|
||||||
|
i++
|
||||||
|
i = encodeVarintPlatform(dAtA, i, uint64(len(m.OS)))
|
||||||
|
i += copy(dAtA[i:], m.OS)
|
||||||
|
}
|
||||||
|
if len(m.Architecture) > 0 {
|
||||||
|
dAtA[i] = 0x12
|
||||||
|
i++
|
||||||
|
i = encodeVarintPlatform(dAtA, i, uint64(len(m.Architecture)))
|
||||||
|
i += copy(dAtA[i:], m.Architecture)
|
||||||
|
}
|
||||||
|
if len(m.Variant) > 0 {
|
||||||
|
dAtA[i] = 0x1a
|
||||||
|
i++
|
||||||
|
i = encodeVarintPlatform(dAtA, i, uint64(len(m.Variant)))
|
||||||
|
i += copy(dAtA[i:], m.Variant)
|
||||||
|
}
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeFixed64Platform(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 encodeFixed32Platform(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 encodeVarintPlatform(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 *Platform) Size() (n int) {
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
l = len(m.OS)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovPlatform(uint64(l))
|
||||||
|
}
|
||||||
|
l = len(m.Architecture)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovPlatform(uint64(l))
|
||||||
|
}
|
||||||
|
l = len(m.Variant)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovPlatform(uint64(l))
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func sovPlatform(x uint64) (n int) {
|
||||||
|
for {
|
||||||
|
n++
|
||||||
|
x >>= 7
|
||||||
|
if x == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
func sozPlatform(x uint64) (n int) {
|
||||||
|
return sovPlatform(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
||||||
|
}
|
||||||
|
func (this *Platform) String() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := strings.Join([]string{`&Platform{`,
|
||||||
|
`OS:` + fmt.Sprintf("%v", this.OS) + `,`,
|
||||||
|
`Architecture:` + fmt.Sprintf("%v", this.Architecture) + `,`,
|
||||||
|
`Variant:` + fmt.Sprintf("%v", this.Variant) + `,`,
|
||||||
|
`}`,
|
||||||
|
}, "")
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func valueToStringPlatform(v interface{}) string {
|
||||||
|
rv := reflect.ValueOf(v)
|
||||||
|
if rv.IsNil() {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
pv := reflect.Indirect(rv).Interface()
|
||||||
|
return fmt.Sprintf("*%v", pv)
|
||||||
|
}
|
||||||
|
func (m *Platform) 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 ErrIntOverflowPlatform
|
||||||
|
}
|
||||||
|
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: Platform: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: Platform: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field OS", wireType)
|
||||||
|
}
|
||||||
|
var stringLen uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowPlatform
|
||||||
|
}
|
||||||
|
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 ErrInvalidLengthPlatform
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + intStringLen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.OS = string(dAtA[iNdEx:postIndex])
|
||||||
|
iNdEx = postIndex
|
||||||
|
case 2:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Architecture", wireType)
|
||||||
|
}
|
||||||
|
var stringLen uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowPlatform
|
||||||
|
}
|
||||||
|
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 ErrInvalidLengthPlatform
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + intStringLen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Architecture = string(dAtA[iNdEx:postIndex])
|
||||||
|
iNdEx = postIndex
|
||||||
|
case 3:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Variant", wireType)
|
||||||
|
}
|
||||||
|
var stringLen uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowPlatform
|
||||||
|
}
|
||||||
|
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 ErrInvalidLengthPlatform
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + intStringLen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Variant = string(dAtA[iNdEx:postIndex])
|
||||||
|
iNdEx = postIndex
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipPlatform(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if skippy < 0 {
|
||||||
|
return ErrInvalidLengthPlatform
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func skipPlatform(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, ErrIntOverflowPlatform
|
||||||
|
}
|
||||||
|
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, ErrIntOverflowPlatform
|
||||||
|
}
|
||||||
|
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, ErrIntOverflowPlatform
|
||||||
|
}
|
||||||
|
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, ErrInvalidLengthPlatform
|
||||||
|
}
|
||||||
|
return iNdEx, nil
|
||||||
|
case 3:
|
||||||
|
for {
|
||||||
|
var innerWire uint64
|
||||||
|
var start int = iNdEx
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowPlatform
|
||||||
|
}
|
||||||
|
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 := skipPlatform(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 (
|
||||||
|
ErrInvalidLengthPlatform = fmt.Errorf("proto: negative length found during unmarshaling")
|
||||||
|
ErrIntOverflowPlatform = fmt.Errorf("proto: integer overflow")
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterFile("github.com/containerd/containerd/api/types/platform.proto", fileDescriptorPlatform)
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileDescriptorPlatform = []byte{
|
||||||
|
// 203 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x4c, 0xcf, 0x2c, 0xc9,
|
||||||
|
0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xcc, 0xcc, 0x4b, 0x2d,
|
||||||
|
0x4a, 0x41, 0x66, 0x26, 0x16, 0x64, 0xea, 0x97, 0x54, 0x16, 0xa4, 0x16, 0xeb, 0x17, 0xe4, 0x24,
|
||||||
|
0x96, 0xa4, 0xe5, 0x17, 0xe5, 0xea, 0x15, 0x14, 0xe5, 0x97, 0xe4, 0x0b, 0x09, 0x20, 0x14, 0xe9,
|
||||||
|
0x81, 0x15, 0x48, 0x89, 0xa4, 0xe7, 0xa7, 0xe7, 0x83, 0x25, 0xf5, 0x41, 0x2c, 0x88, 0x3a, 0xa5,
|
||||||
|
0x04, 0x2e, 0x8e, 0x00, 0xa8, 0x4e, 0x21, 0x31, 0x2e, 0xa6, 0xfc, 0x62, 0x09, 0x46, 0x05, 0x46,
|
||||||
|
0x0d, 0x4e, 0x27, 0xb6, 0x47, 0xf7, 0xe4, 0x99, 0xfc, 0x83, 0x83, 0x98, 0xf2, 0x8b, 0x85, 0x94,
|
||||||
|
0xb8, 0x78, 0x12, 0x8b, 0x92, 0x33, 0x32, 0x4b, 0x52, 0x93, 0x4b, 0x4a, 0x8b, 0x52, 0x25, 0x98,
|
||||||
|
0x40, 0x2a, 0x82, 0x50, 0xc4, 0x84, 0x24, 0xb8, 0xd8, 0xcb, 0x12, 0x8b, 0x32, 0x13, 0xf3, 0x4a,
|
||||||
|
0x24, 0x98, 0xc1, 0xd2, 0x30, 0xae, 0x93, 0xd7, 0x89, 0x87, 0x72, 0x0c, 0x37, 0x1e, 0xca, 0x31,
|
||||||
|
0x34, 0x3c, 0x92, 0x63, 0x3c, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4,
|
||||||
|
0x18, 0xa3, 0x0c, 0x88, 0xf7, 0x9e, 0x35, 0x98, 0x4c, 0x62, 0x03, 0x3b, 0xda, 0x18, 0x10, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x97, 0xa1, 0x99, 0x56, 0x19, 0x01, 0x00, 0x00,
|
||||||
|
}
|
15
api/types/platform.proto
Normal file
15
api/types/platform.proto
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package containerd.types;
|
||||||
|
|
||||||
|
import "gogoproto/gogo.proto";
|
||||||
|
|
||||||
|
option go_package = "github.com/containerd/containerd/api/types;types";
|
||||||
|
|
||||||
|
// Platform follows the structure of the OCI platform specification, from
|
||||||
|
// descriptors.
|
||||||
|
message Platform {
|
||||||
|
string os = 1 [(gogoproto.customname) = "OS"];
|
||||||
|
string architecture = 2;
|
||||||
|
string variant = 3;
|
||||||
|
}
|
@ -15,6 +15,7 @@ import (
|
|||||||
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
diffapi "github.com/containerd/containerd/api/services/diff/v1"
|
||||||
eventsapi "github.com/containerd/containerd/api/services/events/v1"
|
eventsapi "github.com/containerd/containerd/api/services/events/v1"
|
||||||
imagesapi "github.com/containerd/containerd/api/services/images/v1"
|
imagesapi "github.com/containerd/containerd/api/services/images/v1"
|
||||||
|
introspectionapi "github.com/containerd/containerd/api/services/introspection/v1"
|
||||||
namespacesapi "github.com/containerd/containerd/api/services/namespaces/v1"
|
namespacesapi "github.com/containerd/containerd/api/services/namespaces/v1"
|
||||||
snapshotapi "github.com/containerd/containerd/api/services/snapshot/v1"
|
snapshotapi "github.com/containerd/containerd/api/services/snapshot/v1"
|
||||||
"github.com/containerd/containerd/api/services/tasks/v1"
|
"github.com/containerd/containerd/api/services/tasks/v1"
|
||||||
@ -443,6 +444,10 @@ func (c *Client) DiffService() diff.DiffService {
|
|||||||
return diffservice.NewDiffServiceFromClient(diffapi.NewDiffClient(c.conn))
|
return diffservice.NewDiffServiceFromClient(diffapi.NewDiffClient(c.conn))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) IntrospectionService() introspectionapi.IntrospectionClient {
|
||||||
|
return introspectionapi.NewIntrospectionClient(c.conn)
|
||||||
|
}
|
||||||
|
|
||||||
// HealthService returns the underlying GRPC HealthClient
|
// HealthService returns the underlying GRPC HealthClient
|
||||||
func (c *Client) HealthService() grpc_health_v1.HealthClient {
|
func (c *Client) HealthService() grpc_health_v1.HealthClient {
|
||||||
return grpc_health_v1.NewHealthClient(c.conn)
|
return grpc_health_v1.NewHealthClient(c.conn)
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
_ "github.com/containerd/containerd/services/events"
|
_ "github.com/containerd/containerd/services/events"
|
||||||
_ "github.com/containerd/containerd/services/healthcheck"
|
_ "github.com/containerd/containerd/services/healthcheck"
|
||||||
_ "github.com/containerd/containerd/services/images"
|
_ "github.com/containerd/containerd/services/images"
|
||||||
|
_ "github.com/containerd/containerd/services/introspection"
|
||||||
_ "github.com/containerd/containerd/services/namespaces"
|
_ "github.com/containerd/containerd/services/namespaces"
|
||||||
_ "github.com/containerd/containerd/services/snapshot"
|
_ "github.com/containerd/containerd/services/snapshot"
|
||||||
_ "github.com/containerd/containerd/services/tasks"
|
_ "github.com/containerd/containerd/services/tasks"
|
||||||
|
@ -82,6 +82,7 @@ func main() {
|
|||||||
ctx = log.WithModule(gocontext.Background(), "containerd")
|
ctx = log.WithModule(gocontext.Background(), "containerd")
|
||||||
config = defaultConfig()
|
config = defaultConfig()
|
||||||
)
|
)
|
||||||
|
|
||||||
done := handleSignals(ctx, signals, serverC)
|
done := handleSignals(ctx, signals, serverC)
|
||||||
// start the signal handler as soon as we can to make sure that
|
// start the signal handler as soon as we can to make sure that
|
||||||
// we don't miss any signals during boot
|
// we don't miss any signals during boot
|
||||||
|
@ -80,6 +80,7 @@ containerd CLI
|
|||||||
runCommand,
|
runCommand,
|
||||||
snapshotCommand,
|
snapshotCommand,
|
||||||
tasksCommand,
|
tasksCommand,
|
||||||
|
pluginsCommand,
|
||||||
versionCommand,
|
versionCommand,
|
||||||
}, extraCmds...)
|
}, extraCmds...)
|
||||||
app.Before = func(context *cli.Context) error {
|
app.Before = func(context *cli.Context) error {
|
||||||
|
139
cmd/ctr/plugins.go
Normal file
139
cmd/ctr/plugins.go
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
"text/tabwriter"
|
||||||
|
|
||||||
|
introspection "github.com/containerd/containerd/api/services/introspection/v1"
|
||||||
|
"github.com/containerd/containerd/api/types"
|
||||||
|
"github.com/containerd/containerd/platforms"
|
||||||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
"github.com/urfave/cli"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
)
|
||||||
|
|
||||||
|
var pluginsCommand = cli.Command{
|
||||||
|
Name: "plugins",
|
||||||
|
Usage: "Provides information about containerd plugins",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
cli.BoolFlag{
|
||||||
|
Name: "quiet, q",
|
||||||
|
Usage: "print only the plugin ids",
|
||||||
|
},
|
||||||
|
cli.BoolFlag{
|
||||||
|
Name: "detailed, d",
|
||||||
|
Usage: "print detailed information about each plugin",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Action: func(context *cli.Context) error {
|
||||||
|
var (
|
||||||
|
quiet = context.Bool("quiet")
|
||||||
|
detailed = context.Bool("detailed")
|
||||||
|
ctx, cancel = appContext(context)
|
||||||
|
)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
client, err := newClient(context)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ps := client.IntrospectionService()
|
||||||
|
response, err := ps.Plugins(ctx, &introspection.PluginsRequest{
|
||||||
|
Filters: context.Args(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if quiet {
|
||||||
|
for _, plugin := range response.Plugins {
|
||||||
|
fmt.Println(plugin.ID)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
w := tabwriter.NewWriter(os.Stdout, 4, 8, 4, ' ', 0)
|
||||||
|
if detailed {
|
||||||
|
first := true
|
||||||
|
for _, plugin := range response.Plugins {
|
||||||
|
if !first {
|
||||||
|
fmt.Fprintln(w, "\t\t\t")
|
||||||
|
}
|
||||||
|
first = false
|
||||||
|
fmt.Fprintln(w, "Type:\t", plugin.Type)
|
||||||
|
fmt.Fprintln(w, "ID:\t", plugin.ID)
|
||||||
|
if len(plugin.Requires) > 0 {
|
||||||
|
fmt.Fprintln(w, "Requires:\t")
|
||||||
|
for _, r := range plugin.Requires {
|
||||||
|
fmt.Fprintln(w, "\t", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(plugin.Platforms) > 0 {
|
||||||
|
fmt.Fprintln(w, "Platforms:\t", prettyPlatforms(plugin.Platforms))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(plugin.Exports) > 0 {
|
||||||
|
fmt.Fprintln(w, "Exports:\t")
|
||||||
|
for k, v := range plugin.Exports {
|
||||||
|
fmt.Fprintln(w, "\t", k, "\t", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(plugin.Capabilities) > 0 {
|
||||||
|
fmt.Fprintln(w, "Capabilities:\t", strings.Join(plugin.Capabilities, ","))
|
||||||
|
}
|
||||||
|
|
||||||
|
if plugin.InitErr != nil {
|
||||||
|
fmt.Fprintln(w, "Error:\t")
|
||||||
|
fmt.Fprintln(w, "\t Code:\t", codes.Code(plugin.InitErr.Code))
|
||||||
|
fmt.Fprintln(w, "\t Message:\t", plugin.InitErr.Message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return w.Flush()
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintln(w, "TYPE\tID\tPLATFORM\tSTATUS\t")
|
||||||
|
for _, plugin := range response.Plugins {
|
||||||
|
status := "ok"
|
||||||
|
|
||||||
|
if plugin.InitErr != nil {
|
||||||
|
status = "error"
|
||||||
|
}
|
||||||
|
|
||||||
|
var platformColumn = "-"
|
||||||
|
if len(plugin.Platforms) > 0 {
|
||||||
|
platformColumn = prettyPlatforms(plugin.Platforms)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t\n",
|
||||||
|
plugin.Type,
|
||||||
|
plugin.ID,
|
||||||
|
platformColumn,
|
||||||
|
status,
|
||||||
|
); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return w.Flush()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func prettyPlatforms(pspb []types.Platform) string {
|
||||||
|
psm := map[string]struct{}{}
|
||||||
|
for _, p := range pspb {
|
||||||
|
psm[platforms.Format(ocispec.Platform{
|
||||||
|
OS: p.OS,
|
||||||
|
Architecture: p.Architecture,
|
||||||
|
Variant: p.Variant,
|
||||||
|
})] = struct{}{}
|
||||||
|
}
|
||||||
|
var ps []string
|
||||||
|
for p := range psm {
|
||||||
|
ps = append(ps, p)
|
||||||
|
}
|
||||||
|
sort.Stable(sort.StringSlice(ps))
|
||||||
|
|
||||||
|
return strings.Join(ps, ",")
|
||||||
|
}
|
@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/containerd/containerd/images"
|
"github.com/containerd/containerd/images"
|
||||||
"github.com/containerd/containerd/metadata"
|
"github.com/containerd/containerd/metadata"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
|
"github.com/containerd/containerd/platforms"
|
||||||
"github.com/containerd/containerd/plugin"
|
"github.com/containerd/containerd/plugin"
|
||||||
digest "github.com/opencontainers/go-digest"
|
digest "github.com/opencontainers/go-digest"
|
||||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
@ -27,11 +28,13 @@ func init() {
|
|||||||
Requires: []plugin.Type{
|
Requires: []plugin.Type{
|
||||||
plugin.MetadataPlugin,
|
plugin.MetadataPlugin,
|
||||||
},
|
},
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
md, err := ic.Get(plugin.MetadataPlugin)
|
md, err := ic.Get(plugin.MetadataPlugin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ic.Meta.Platforms = append(ic.Meta.Platforms, platforms.DefaultSpec())
|
||||||
return NewWalkingDiff(md.(*metadata.DB).ContentStore())
|
return NewWalkingDiff(md.(*metadata.DB).ContentStore())
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -29,17 +29,17 @@ func ToGRPC(err error) error {
|
|||||||
|
|
||||||
switch {
|
switch {
|
||||||
case IsInvalidArgument(err):
|
case IsInvalidArgument(err):
|
||||||
return grpc.Errorf(codes.InvalidArgument, err.Error())
|
return status.Errorf(codes.InvalidArgument, err.Error())
|
||||||
case IsNotFound(err):
|
case IsNotFound(err):
|
||||||
return grpc.Errorf(codes.NotFound, err.Error())
|
return status.Errorf(codes.NotFound, err.Error())
|
||||||
case IsAlreadyExists(err):
|
case IsAlreadyExists(err):
|
||||||
return grpc.Errorf(codes.AlreadyExists, err.Error())
|
return status.Errorf(codes.AlreadyExists, err.Error())
|
||||||
case IsFailedPrecondition(err):
|
case IsFailedPrecondition(err):
|
||||||
return grpc.Errorf(codes.FailedPrecondition, err.Error())
|
return status.Errorf(codes.FailedPrecondition, err.Error())
|
||||||
case IsUnavailable(err):
|
case IsUnavailable(err):
|
||||||
return grpc.Errorf(codes.Unavailable, err.Error())
|
return status.Errorf(codes.Unavailable, err.Error())
|
||||||
case IsNotImplemented(err):
|
case IsNotImplemented(err):
|
||||||
return grpc.Errorf(codes.Unimplemented, err.Error())
|
return status.Errorf(codes.Unimplemented, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return err
|
||||||
|
@ -23,6 +23,7 @@ import (
|
|||||||
"github.com/containerd/containerd/log"
|
"github.com/containerd/containerd/log"
|
||||||
"github.com/containerd/containerd/metadata"
|
"github.com/containerd/containerd/metadata"
|
||||||
"github.com/containerd/containerd/namespaces"
|
"github.com/containerd/containerd/namespaces"
|
||||||
|
"github.com/containerd/containerd/platforms"
|
||||||
"github.com/containerd/containerd/plugin"
|
"github.com/containerd/containerd/plugin"
|
||||||
"github.com/containerd/containerd/reaper"
|
"github.com/containerd/containerd/reaper"
|
||||||
"github.com/containerd/containerd/runtime"
|
"github.com/containerd/containerd/runtime"
|
||||||
@ -30,9 +31,9 @@ import (
|
|||||||
runc "github.com/containerd/go-runc"
|
runc "github.com/containerd/go-runc"
|
||||||
"github.com/containerd/typeurl"
|
"github.com/containerd/typeurl"
|
||||||
google_protobuf "github.com/golang/protobuf/ptypes/empty"
|
google_protobuf "github.com/golang/protobuf/ptypes/empty"
|
||||||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -49,9 +50,9 @@ const (
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
Type: plugin.RuntimePlugin,
|
Type: plugin.RuntimePlugin,
|
||||||
ID: "linux",
|
ID: "linux",
|
||||||
Init: New,
|
InitFn: New,
|
||||||
Requires: []plugin.Type{
|
Requires: []plugin.Type{
|
||||||
plugin.TaskMonitorPlugin,
|
plugin.TaskMonitorPlugin,
|
||||||
plugin.MetadataPlugin,
|
plugin.MetadataPlugin,
|
||||||
@ -92,6 +93,8 @@ type Config struct {
|
|||||||
|
|
||||||
// New returns a configured runtime
|
// New returns a configured runtime
|
||||||
func New(ic *plugin.InitContext) (interface{}, error) {
|
func New(ic *plugin.InitContext) (interface{}, error) {
|
||||||
|
ic.Meta.Platforms = []ocispec.Platform{platforms.DefaultSpec()}
|
||||||
|
|
||||||
if err := os.MkdirAll(ic.Root, 0711); err != nil {
|
if err := os.MkdirAll(ic.Root, 0711); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -121,6 +124,7 @@ func New(ic *plugin.InitContext) (interface{}, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: need to add the tasks to the monitor
|
// TODO: need to add the tasks to the monitor
|
||||||
for _, t := range tasks {
|
for _, t := range tasks {
|
||||||
if err := r.tasks.AddWithNamespace(t.namespace, t); err != nil {
|
if err := r.tasks.AddWithNamespace(t.namespace, t); err != nil {
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/containerd/containerd/linux"
|
"github.com/containerd/containerd/linux"
|
||||||
"github.com/containerd/containerd/log"
|
"github.com/containerd/containerd/log"
|
||||||
"github.com/containerd/containerd/namespaces"
|
"github.com/containerd/containerd/namespaces"
|
||||||
|
"github.com/containerd/containerd/platforms"
|
||||||
"github.com/containerd/containerd/plugin"
|
"github.com/containerd/containerd/plugin"
|
||||||
"github.com/containerd/containerd/runtime"
|
"github.com/containerd/containerd/runtime"
|
||||||
metrics "github.com/docker/go-metrics"
|
metrics "github.com/docker/go-metrics"
|
||||||
@ -24,7 +25,7 @@ func init() {
|
|||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
Type: plugin.TaskMonitorPlugin,
|
Type: plugin.TaskMonitorPlugin,
|
||||||
ID: "cgroups",
|
ID: "cgroups",
|
||||||
Init: New,
|
InitFn: New,
|
||||||
Config: &Config{},
|
Config: &Config{},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -44,6 +45,7 @@ func New(ic *plugin.InitContext) (interface{}, error) {
|
|||||||
if ns != nil {
|
if ns != nil {
|
||||||
metrics.Register(ns)
|
metrics.Register(ns)
|
||||||
}
|
}
|
||||||
|
ic.Meta.Platforms = append(ic.Meta.Platforms, platforms.DefaultSpec())
|
||||||
return &cgroupsMonitor{
|
return &cgroupsMonitor{
|
||||||
collector: collector,
|
collector: collector,
|
||||||
oom: oom,
|
oom: oom,
|
||||||
|
@ -2,48 +2,123 @@ package plugin
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/events"
|
"github.com/containerd/containerd/events"
|
||||||
"github.com/containerd/containerd/log"
|
"github.com/containerd/containerd/log"
|
||||||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewContext returns a new plugin InitContext
|
|
||||||
func NewContext(ctx context.Context, plugins map[Type]map[string]interface{}, root, state, id string) *InitContext {
|
|
||||||
return &InitContext{
|
|
||||||
plugins: plugins,
|
|
||||||
Root: filepath.Join(root, id),
|
|
||||||
State: filepath.Join(state, id),
|
|
||||||
Context: log.WithModule(ctx, id),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// InitContext is used for plugin inititalization
|
// InitContext is used for plugin inititalization
|
||||||
type InitContext struct {
|
type InitContext struct {
|
||||||
|
Context context.Context
|
||||||
Root string
|
Root string
|
||||||
State string
|
State string
|
||||||
Address string
|
|
||||||
Context context.Context
|
|
||||||
Config interface{}
|
Config interface{}
|
||||||
|
Address string
|
||||||
Events *events.Exchange
|
Events *events.Exchange
|
||||||
|
|
||||||
plugins map[Type]map[string]interface{}
|
Meta *Meta // plugins can fill in metadata at init.
|
||||||
|
|
||||||
|
plugins *PluginSet
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewContext returns a new plugin InitContext
|
||||||
|
func NewContext(ctx context.Context, r *Registration, plugins *PluginSet, root, state string) *InitContext {
|
||||||
|
return &InitContext{
|
||||||
|
Context: log.WithModule(ctx, r.URI()),
|
||||||
|
Root: filepath.Join(root, r.URI()),
|
||||||
|
State: filepath.Join(state, r.URI()),
|
||||||
|
Meta: &Meta{
|
||||||
|
Exports: map[string]string{},
|
||||||
|
},
|
||||||
|
plugins: plugins,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get returns the first plugin by its type
|
// Get returns the first plugin by its type
|
||||||
func (i *InitContext) Get(t Type) (interface{}, error) {
|
func (i *InitContext) Get(t Type) (interface{}, error) {
|
||||||
for _, v := range i.plugins[t] {
|
return i.plugins.Get(t)
|
||||||
return v, nil
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("no plugins registered for %s", t)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAll returns all plugins with the specific type
|
// Meta contains information gathered from the registration and initialization
|
||||||
func (i *InitContext) GetAll(t Type) (map[string]interface{}, error) {
|
// process.
|
||||||
p, ok := i.plugins[t]
|
type Meta struct {
|
||||||
if !ok {
|
Platforms []ocispec.Platform // platforms supported by plugin
|
||||||
return nil, fmt.Errorf("no plugins registered for %s", t)
|
Exports map[string]string // values exported by plugin
|
||||||
|
Capabilities []string // feature switches for plugin
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plugin represents an initialized plugin, used with an init context.
|
||||||
|
type Plugin struct {
|
||||||
|
Registration *Registration // registration, as initialized
|
||||||
|
Config interface{} // config, as initialized
|
||||||
|
Meta *Meta
|
||||||
|
|
||||||
|
instance interface{}
|
||||||
|
err error // will be set if there was an error initializing the plugin
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Plugin) Err() error {
|
||||||
|
return p.err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Plugin) Instance() (interface{}, error) {
|
||||||
|
return p.instance, p.err
|
||||||
|
}
|
||||||
|
|
||||||
|
// PluginSet defines a plugin collection, used with InitContext.
|
||||||
|
//
|
||||||
|
// This maintains ordering and unique indexing over the set.
|
||||||
|
//
|
||||||
|
// After iteratively instantiating plugins, this set should represent, the
|
||||||
|
// ordered, initialization set of plugins for a containerd instance.
|
||||||
|
type PluginSet struct {
|
||||||
|
ordered []*Plugin // order of initialization
|
||||||
|
byTypeAndID map[Type]map[string]*Plugin
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPluginSet() *PluginSet {
|
||||||
|
return &PluginSet{
|
||||||
|
byTypeAndID: make(map[Type]map[string]*Plugin),
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ps *PluginSet) Add(p *Plugin) error {
|
||||||
|
if byID, typeok := ps.byTypeAndID[p.Registration.Type]; !typeok {
|
||||||
|
ps.byTypeAndID[p.Registration.Type] = map[string]*Plugin{
|
||||||
|
p.Registration.ID: p,
|
||||||
|
}
|
||||||
|
} else if _, idok := byID[p.Registration.ID]; !idok {
|
||||||
|
byID[p.Registration.ID] = p
|
||||||
|
} else {
|
||||||
|
return errors.Wrapf(errdefs.ErrAlreadyExists, "plugin %v already initialized", p.Registration.URI())
|
||||||
|
}
|
||||||
|
|
||||||
|
ps.ordered = append(ps.ordered, p)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns the first plugin by its type
|
||||||
|
func (ps *PluginSet) Get(t Type) (interface{}, error) {
|
||||||
|
for _, v := range ps.byTypeAndID[t] {
|
||||||
|
return v.Instance()
|
||||||
|
}
|
||||||
|
return nil, errors.Wrapf(errdefs.ErrNotFound, "no plugins registered for %s", t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *InitContext) GetAll() []*Plugin {
|
||||||
|
return i.plugins.ordered
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetByType returns all plugins with the specific type.
|
||||||
|
func (i *InitContext) GetByType(t Type) (map[string]*Plugin, error) {
|
||||||
|
p, ok := i.plugins.byTypeAndID[t]
|
||||||
|
if !ok {
|
||||||
|
return nil, errors.Wrapf(errdefs.ErrNotFound, "no plugins registered for %s", t)
|
||||||
|
}
|
||||||
|
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,10 @@ var (
|
|||||||
// this allows the plugin loader differentiate between a plugin which is configured
|
// this allows the plugin loader differentiate between a plugin which is configured
|
||||||
// not to load and one that fails to load.
|
// not to load and one that fails to load.
|
||||||
ErrSkipPlugin = errors.New("skip plugin")
|
ErrSkipPlugin = errors.New("skip plugin")
|
||||||
|
|
||||||
|
// ErrInvalidRequires will be thrown if the requirements for a plugin are
|
||||||
|
// defined in an invalid manner.
|
||||||
|
ErrInvalidRequires = errors.New("invalid requires")
|
||||||
)
|
)
|
||||||
|
|
||||||
// IsSkipPlugin returns true if the error is skipping the plugin
|
// IsSkipPlugin returns true if the error is skipping the plugin
|
||||||
@ -31,7 +35,11 @@ func IsSkipPlugin(err error) bool {
|
|||||||
// Type is the type of the plugin
|
// Type is the type of the plugin
|
||||||
type Type string
|
type Type string
|
||||||
|
|
||||||
|
func (t Type) String() string { return string(t) }
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
// AllPlugins declares that the plugin should be initialized after all others.
|
||||||
|
AllPlugins Type = "*"
|
||||||
// RuntimePlugin implements a runtime
|
// RuntimePlugin implements a runtime
|
||||||
RuntimePlugin Type = "io.containerd.runtime.v1"
|
RuntimePlugin Type = "io.containerd.runtime.v1"
|
||||||
// GRPCPlugin implements a grpc service
|
// GRPCPlugin implements a grpc service
|
||||||
@ -54,9 +62,22 @@ type Registration struct {
|
|||||||
ID string
|
ID string
|
||||||
Config interface{}
|
Config interface{}
|
||||||
Requires []Type
|
Requires []Type
|
||||||
Init func(*InitContext) (interface{}, error)
|
|
||||||
|
|
||||||
added bool
|
// InitFn is called when initializing a plugin. The registration and
|
||||||
|
// context are passed in. The init function may modify the registration to
|
||||||
|
// add exports, capabilites and platform support declarations.
|
||||||
|
InitFn func(*InitContext) (interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Registration) Init(ic *InitContext) *Plugin {
|
||||||
|
p, err := r.InitFn(ic)
|
||||||
|
return &Plugin{
|
||||||
|
Registration: r,
|
||||||
|
Config: ic.Config,
|
||||||
|
Meta: ic.Meta,
|
||||||
|
instance: p,
|
||||||
|
err: err,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// URI returns the full plugin URI
|
// URI returns the full plugin URI
|
||||||
@ -70,7 +91,7 @@ type Service interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var register = struct {
|
var register = struct {
|
||||||
sync.Mutex
|
sync.RWMutex
|
||||||
r []*Registration
|
r []*Registration
|
||||||
}{}
|
}{}
|
||||||
|
|
||||||
@ -98,29 +119,45 @@ func Register(r *Registration) {
|
|||||||
if r.ID == "" {
|
if r.ID == "" {
|
||||||
panic(ErrNoPluginID)
|
panic(ErrNoPluginID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var last bool
|
||||||
|
for _, requires := range r.Requires {
|
||||||
|
if requires == "*" {
|
||||||
|
last = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if last && len(r.Requires) != 1 {
|
||||||
|
panic(ErrInvalidRequires)
|
||||||
|
}
|
||||||
|
|
||||||
register.r = append(register.r, r)
|
register.r = append(register.r, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Graph returns an ordered list of registered plugins for initialization
|
// Graph returns an ordered list of registered plugins for initialization
|
||||||
func Graph() (ordered []*Registration) {
|
func Graph() (ordered []*Registration) {
|
||||||
|
register.RLock()
|
||||||
|
defer register.RUnlock()
|
||||||
|
|
||||||
|
added := map[*Registration]bool{}
|
||||||
for _, r := range register.r {
|
for _, r := range register.r {
|
||||||
children(r.Requires, &ordered)
|
|
||||||
if !r.added {
|
children(r.ID, r.Requires, added, &ordered)
|
||||||
|
if !added[r] {
|
||||||
ordered = append(ordered, r)
|
ordered = append(ordered, r)
|
||||||
r.added = true
|
added[r] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ordered
|
return ordered
|
||||||
}
|
}
|
||||||
|
|
||||||
func children(types []Type, ordered *[]*Registration) {
|
func children(id string, types []Type, added map[*Registration]bool, ordered *[]*Registration) {
|
||||||
for _, t := range types {
|
for _, t := range types {
|
||||||
for _, r := range register.r {
|
for _, r := range register.r {
|
||||||
if r.Type == t {
|
if r.ID != id && (t == "*" || r.Type == t) {
|
||||||
children(r.Requires, ordered)
|
children(r.ID, r.Requires, added, ordered)
|
||||||
if !r.added {
|
if !added[r] {
|
||||||
*ordered = append(*ordered, r)
|
*ordered = append(*ordered, r)
|
||||||
r.added = true
|
added[r] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
18
protobuf/google/rpc/README.md
Normal file
18
protobuf/google/rpc/README.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
This package copies definitions used with GRPC to represent error conditions
|
||||||
|
within GRPC data types. These files are licensed under the provisions outlined
|
||||||
|
at the top of each file.
|
||||||
|
|
||||||
|
## `containerd`
|
||||||
|
|
||||||
|
This is moved from the [googleapis
|
||||||
|
project](https://github.com/googleapis/googleapis/tree/master/google/rpc) to
|
||||||
|
allow us to regenerate these types for use with gogoprotobuf. We can move this
|
||||||
|
away if google can generate these sensibly.
|
||||||
|
|
||||||
|
These files were imported from changes after
|
||||||
|
7f47d894837ac1701ee555fd5c3d70e5d4a796b1. Updates should not be required.
|
||||||
|
|
||||||
|
The other option is to get these into an upstream project, like gogoprotobuf.
|
||||||
|
|
||||||
|
Note that the `go_package` option has been changed so that they generate
|
||||||
|
correctly in a common package in the containerd project.
|
270
protobuf/google/rpc/code.pb.go
Normal file
270
protobuf/google/rpc/code.pb.go
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
// Code generated by protoc-gen-gogo.
|
||||||
|
// source: github.com/containerd/containerd/protobuf/google/rpc/code.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package rpc is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
github.com/containerd/containerd/protobuf/google/rpc/code.proto
|
||||||
|
github.com/containerd/containerd/protobuf/google/rpc/error_details.proto
|
||||||
|
github.com/containerd/containerd/protobuf/google/rpc/status.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
RetryInfo
|
||||||
|
DebugInfo
|
||||||
|
QuotaFailure
|
||||||
|
PreconditionFailure
|
||||||
|
BadRequest
|
||||||
|
RequestInfo
|
||||||
|
ResourceInfo
|
||||||
|
Help
|
||||||
|
LocalizedMessage
|
||||||
|
Status
|
||||||
|
*/
|
||||||
|
package rpc
|
||||||
|
|
||||||
|
import proto "github.com/gogo/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
|
// The canonical error codes for Google APIs.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Sometimes multiple error codes may apply. Services should return
|
||||||
|
// the most specific error code that applies. For example, prefer
|
||||||
|
// `OUT_OF_RANGE` over `FAILED_PRECONDITION` if both codes apply.
|
||||||
|
// Similarly prefer `NOT_FOUND` or `ALREADY_EXISTS` over `FAILED_PRECONDITION`.
|
||||||
|
type Code int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Not an error; returned on success
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 200 OK
|
||||||
|
Code_OK Code = 0
|
||||||
|
// The operation was cancelled, typically by the caller.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 499 Client Closed Request
|
||||||
|
Code_CANCELLED Code = 1
|
||||||
|
// Unknown error. For example, this error may be returned when
|
||||||
|
// a `Status` value received from another address space belongs to
|
||||||
|
// an error space that is not known in this address space. Also
|
||||||
|
// errors raised by APIs that do not return enough error information
|
||||||
|
// may be converted to this error.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 500 Internal Server Error
|
||||||
|
Code_UNKNOWN Code = 2
|
||||||
|
// The client specified an invalid argument. Note that this differs
|
||||||
|
// from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments
|
||||||
|
// that are problematic regardless of the state of the system
|
||||||
|
// (e.g., a malformed file name).
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 400 Bad Request
|
||||||
|
Code_INVALID_ARGUMENT Code = 3
|
||||||
|
// The deadline expired before the operation could complete. For operations
|
||||||
|
// that change the state of the system, this error may be returned
|
||||||
|
// even if the operation has completed successfully. For example, a
|
||||||
|
// successful response from a server could have been delayed long
|
||||||
|
// enough for the deadline to expire.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 504 Gateway Timeout
|
||||||
|
Code_DEADLINE_EXCEEDED Code = 4
|
||||||
|
// Some requested entity (e.g., file or directory) was not found.
|
||||||
|
//
|
||||||
|
// Note to server developers: if a request is denied for an entire class
|
||||||
|
// of users, such as gradual feature rollout or undocumented whitelist,
|
||||||
|
// `NOT_FOUND` may be used. If a request is denied for some users within
|
||||||
|
// a class of users, such as user-based access control, `PERMISSION_DENIED`
|
||||||
|
// must be used.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 404 Not Found
|
||||||
|
Code_NOT_FOUND Code = 5
|
||||||
|
// The entity that a client attempted to create (e.g., file or directory)
|
||||||
|
// already exists.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 409 Conflict
|
||||||
|
Code_ALREADY_EXISTS Code = 6
|
||||||
|
// The caller does not have permission to execute the specified
|
||||||
|
// operation. `PERMISSION_DENIED` must not be used for rejections
|
||||||
|
// caused by exhausting some resource (use `RESOURCE_EXHAUSTED`
|
||||||
|
// instead for those errors). `PERMISSION_DENIED` must not be
|
||||||
|
// used if the caller can not be identified (use `UNAUTHENTICATED`
|
||||||
|
// instead for those errors). This error code does not imply the
|
||||||
|
// request is valid or the requested entity exists or satisfies
|
||||||
|
// other pre-conditions.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 403 Forbidden
|
||||||
|
Code_PERMISSION_DENIED Code = 7
|
||||||
|
// The request does not have valid authentication credentials for the
|
||||||
|
// operation.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 401 Unauthorized
|
||||||
|
Code_UNAUTHENTICATED Code = 16
|
||||||
|
// Some resource has been exhausted, perhaps a per-user quota, or
|
||||||
|
// perhaps the entire file system is out of space.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 429 Too Many Requests
|
||||||
|
Code_RESOURCE_EXHAUSTED Code = 8
|
||||||
|
// The operation was rejected because the system is not in a state
|
||||||
|
// required for the operation's execution. For example, the directory
|
||||||
|
// to be deleted is non-empty, an rmdir operation is applied to
|
||||||
|
// a non-directory, etc.
|
||||||
|
//
|
||||||
|
// Service implementors can use the following guidelines to decide
|
||||||
|
// between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`:
|
||||||
|
// (a) Use `UNAVAILABLE` if the client can retry just the failing call.
|
||||||
|
// (b) Use `ABORTED` if the client should retry at a higher level
|
||||||
|
// (e.g., when a client-specified test-and-set fails, indicating the
|
||||||
|
// client should restart a read-modify-write sequence).
|
||||||
|
// (c) Use `FAILED_PRECONDITION` if the client should not retry until
|
||||||
|
// the system state has been explicitly fixed. E.g., if an "rmdir"
|
||||||
|
// fails because the directory is non-empty, `FAILED_PRECONDITION`
|
||||||
|
// should be returned since the client should not retry unless
|
||||||
|
// the files are deleted from the directory.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 400 Bad Request
|
||||||
|
Code_FAILED_PRECONDITION Code = 9
|
||||||
|
// The operation was aborted, typically due to a concurrency issue such as
|
||||||
|
// a sequencer check failure or transaction abort.
|
||||||
|
//
|
||||||
|
// See the guidelines above for deciding between `FAILED_PRECONDITION`,
|
||||||
|
// `ABORTED`, and `UNAVAILABLE`.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 409 Conflict
|
||||||
|
Code_ABORTED Code = 10
|
||||||
|
// The operation was attempted past the valid range. E.g., seeking or
|
||||||
|
// reading past end-of-file.
|
||||||
|
//
|
||||||
|
// Unlike `INVALID_ARGUMENT`, this error indicates a problem that may
|
||||||
|
// be fixed if the system state changes. For example, a 32-bit file
|
||||||
|
// system will generate `INVALID_ARGUMENT` if asked to read at an
|
||||||
|
// offset that is not in the range [0,2^32-1], but it will generate
|
||||||
|
// `OUT_OF_RANGE` if asked to read from an offset past the current
|
||||||
|
// file size.
|
||||||
|
//
|
||||||
|
// There is a fair bit of overlap between `FAILED_PRECONDITION` and
|
||||||
|
// `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific
|
||||||
|
// error) when it applies so that callers who are iterating through
|
||||||
|
// a space can easily look for an `OUT_OF_RANGE` error to detect when
|
||||||
|
// they are done.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 400 Bad Request
|
||||||
|
Code_OUT_OF_RANGE Code = 11
|
||||||
|
// The operation is not implemented or is not supported/enabled in this
|
||||||
|
// service.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 501 Not Implemented
|
||||||
|
Code_UNIMPLEMENTED Code = 12
|
||||||
|
// Internal errors. This means that some invariants expected by the
|
||||||
|
// underlying system have been broken. This error code is reserved
|
||||||
|
// for serious errors.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 500 Internal Server Error
|
||||||
|
Code_INTERNAL Code = 13
|
||||||
|
// The service is currently unavailable. This is most likely a
|
||||||
|
// transient condition, which can be corrected by retrying with
|
||||||
|
// a backoff.
|
||||||
|
//
|
||||||
|
// See the guidelines above for deciding between `FAILED_PRECONDITION`,
|
||||||
|
// `ABORTED`, and `UNAVAILABLE`.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 503 Service Unavailable
|
||||||
|
Code_UNAVAILABLE Code = 14
|
||||||
|
// Unrecoverable data loss or corruption.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 500 Internal Server Error
|
||||||
|
Code_DATA_LOSS Code = 15
|
||||||
|
)
|
||||||
|
|
||||||
|
var Code_name = map[int32]string{
|
||||||
|
0: "OK",
|
||||||
|
1: "CANCELLED",
|
||||||
|
2: "UNKNOWN",
|
||||||
|
3: "INVALID_ARGUMENT",
|
||||||
|
4: "DEADLINE_EXCEEDED",
|
||||||
|
5: "NOT_FOUND",
|
||||||
|
6: "ALREADY_EXISTS",
|
||||||
|
7: "PERMISSION_DENIED",
|
||||||
|
16: "UNAUTHENTICATED",
|
||||||
|
8: "RESOURCE_EXHAUSTED",
|
||||||
|
9: "FAILED_PRECONDITION",
|
||||||
|
10: "ABORTED",
|
||||||
|
11: "OUT_OF_RANGE",
|
||||||
|
12: "UNIMPLEMENTED",
|
||||||
|
13: "INTERNAL",
|
||||||
|
14: "UNAVAILABLE",
|
||||||
|
15: "DATA_LOSS",
|
||||||
|
}
|
||||||
|
var Code_value = map[string]int32{
|
||||||
|
"OK": 0,
|
||||||
|
"CANCELLED": 1,
|
||||||
|
"UNKNOWN": 2,
|
||||||
|
"INVALID_ARGUMENT": 3,
|
||||||
|
"DEADLINE_EXCEEDED": 4,
|
||||||
|
"NOT_FOUND": 5,
|
||||||
|
"ALREADY_EXISTS": 6,
|
||||||
|
"PERMISSION_DENIED": 7,
|
||||||
|
"UNAUTHENTICATED": 16,
|
||||||
|
"RESOURCE_EXHAUSTED": 8,
|
||||||
|
"FAILED_PRECONDITION": 9,
|
||||||
|
"ABORTED": 10,
|
||||||
|
"OUT_OF_RANGE": 11,
|
||||||
|
"UNIMPLEMENTED": 12,
|
||||||
|
"INTERNAL": 13,
|
||||||
|
"UNAVAILABLE": 14,
|
||||||
|
"DATA_LOSS": 15,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x Code) String() string {
|
||||||
|
return proto.EnumName(Code_name, int32(x))
|
||||||
|
}
|
||||||
|
func (Code) EnumDescriptor() ([]byte, []int) { return fileDescriptorCode, []int{0} }
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterEnum("google.rpc.Code", Code_name, Code_value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterFile("github.com/containerd/containerd/protobuf/google/rpc/code.proto", fileDescriptorCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileDescriptorCode = []byte{
|
||||||
|
// 405 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x91, 0xbb, 0x72, 0x13, 0x31,
|
||||||
|
0x14, 0x86, 0xbd, 0x4e, 0x70, 0x62, 0xf9, 0x76, 0xa2, 0x70, 0xe9, 0xf6, 0x01, 0x28, 0xec, 0x82,
|
||||||
|
0x86, 0x19, 0x0a, 0xe6, 0x78, 0x75, 0x9c, 0x68, 0x22, 0x1f, 0xed, 0x68, 0xa5, 0x10, 0x68, 0x76,
|
||||||
|
0xf0, 0xda, 0x98, 0xcc, 0x90, 0xac, 0x67, 0xc7, 0xee, 0x79, 0x16, 0x5e, 0x82, 0x57, 0x48, 0x49,
|
||||||
|
0x49, 0x49, 0xfc, 0x24, 0x8c, 0x4c, 0x01, 0x35, 0x9d, 0xe6, 0xff, 0x75, 0x2e, 0xff, 0x77, 0xc4,
|
||||||
|
0xdb, 0xf5, 0xed, 0xf6, 0xf3, 0x6e, 0x31, 0xae, 0xea, 0xbb, 0x49, 0x55, 0xdf, 0x6f, 0x3f, 0xde,
|
||||||
|
0xde, 0xaf, 0x9a, 0xe5, 0xbf, 0xcf, 0x4d, 0x53, 0x6f, 0xeb, 0xc5, 0xee, 0xd3, 0x64, 0x5d, 0xd7,
|
||||||
|
0xeb, 0x2f, 0xab, 0x49, 0xb3, 0xa9, 0x26, 0x55, 0xbd, 0x5c, 0x8d, 0x0f, 0x86, 0x14, 0x7f, 0xe4,
|
||||||
|
0x71, 0xb3, 0xa9, 0x5e, 0x7e, 0x6f, 0x8b, 0xe3, 0xac, 0x5e, 0xae, 0x64, 0x47, 0xb4, 0xed, 0x15,
|
||||||
|
0xb4, 0xe4, 0x40, 0x74, 0x33, 0xe4, 0x8c, 0x8c, 0x21, 0x05, 0x89, 0xec, 0x89, 0x93, 0xc0, 0x57,
|
||||||
|
0x6c, 0xdf, 0x31, 0xb4, 0xe5, 0x53, 0x01, 0x9a, 0xaf, 0xd1, 0x68, 0x55, 0xa2, 0xbb, 0x08, 0x73,
|
||||||
|
0x62, 0x0f, 0x47, 0xf2, 0x99, 0x38, 0x53, 0x84, 0xca, 0x68, 0xa6, 0x92, 0x6e, 0x32, 0x22, 0x45,
|
||||||
|
0x0a, 0x8e, 0x63, 0x23, 0xb6, 0xbe, 0x9c, 0xd9, 0xc0, 0x0a, 0x9e, 0x48, 0x29, 0x86, 0x68, 0x1c,
|
||||||
|
0xa1, 0x7a, 0x5f, 0xd2, 0x8d, 0x2e, 0x7c, 0x01, 0x9d, 0x58, 0x99, 0x93, 0x9b, 0xeb, 0xa2, 0xd0,
|
||||||
|
0x96, 0x4b, 0x45, 0xac, 0x49, 0xc1, 0x89, 0x3c, 0x17, 0xa3, 0xc0, 0x18, 0xfc, 0x25, 0xb1, 0xd7,
|
||||||
|
0x19, 0x7a, 0x52, 0x00, 0xf2, 0xb9, 0x90, 0x8e, 0x0a, 0x1b, 0x5c, 0x16, 0xa7, 0x5c, 0x62, 0x28,
|
||||||
|
0xa2, 0x7e, 0x2a, 0x5f, 0x88, 0xf3, 0x19, 0x6a, 0x43, 0xaa, 0xcc, 0x1d, 0x65, 0x96, 0x95, 0xf6,
|
||||||
|
0xda, 0x32, 0x74, 0xe3, 0xe6, 0x38, 0xb5, 0x2e, 0xfe, 0x12, 0x12, 0x44, 0xdf, 0x06, 0x5f, 0xda,
|
||||||
|
0x59, 0xe9, 0x90, 0x2f, 0x08, 0x7a, 0xf2, 0x4c, 0x0c, 0x02, 0xeb, 0x79, 0x6e, 0x28, 0xc6, 0x20,
|
||||||
|
0x05, 0x7d, 0xd9, 0x17, 0xa7, 0x9a, 0x3d, 0x39, 0x46, 0x03, 0x03, 0x39, 0x12, 0xbd, 0xc0, 0x78,
|
||||||
|
0x8d, 0xda, 0xe0, 0xd4, 0x10, 0x0c, 0x63, 0x20, 0x85, 0x1e, 0x4b, 0x63, 0x8b, 0x02, 0x46, 0xd3,
|
||||||
|
0xdd, 0xc3, 0x63, 0xda, 0xfa, 0xf9, 0x98, 0xb6, 0xbe, 0xee, 0xd3, 0xe4, 0x61, 0x9f, 0x26, 0x3f,
|
||||||
|
0xf6, 0x69, 0xf2, 0x6b, 0x9f, 0x26, 0x62, 0x58, 0xd5, 0x77, 0xe3, 0xbf, 0x8c, 0xa7, 0xdd, 0x08,
|
||||||
|
0x38, 0x8f, 0xe8, 0xf3, 0xe4, 0xc3, 0xeb, 0xff, 0xb9, 0xde, 0x9b, 0x66, 0x53, 0x7d, 0x6b, 0x1f,
|
||||||
|
0xb9, 0x3c, 0x5b, 0x74, 0x0e, 0xf6, 0xab, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf2, 0x0a, 0x2d,
|
||||||
|
0x67, 0x06, 0x02, 0x00, 0x00,
|
||||||
|
}
|
186
protobuf/google/rpc/code.proto
Normal file
186
protobuf/google/rpc/code.proto
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
// Copyright 2017 Google 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
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package google.rpc;
|
||||||
|
|
||||||
|
option go_package = "github.com/containerd/containerd/protobuf/google/rpc;rpc";
|
||||||
|
option java_multiple_files = true;
|
||||||
|
option java_outer_classname = "CodeProto";
|
||||||
|
option java_package = "com.google.rpc";
|
||||||
|
option objc_class_prefix = "RPC";
|
||||||
|
|
||||||
|
|
||||||
|
// The canonical error codes for Google APIs.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Sometimes multiple error codes may apply. Services should return
|
||||||
|
// the most specific error code that applies. For example, prefer
|
||||||
|
// `OUT_OF_RANGE` over `FAILED_PRECONDITION` if both codes apply.
|
||||||
|
// Similarly prefer `NOT_FOUND` or `ALREADY_EXISTS` over `FAILED_PRECONDITION`.
|
||||||
|
enum Code {
|
||||||
|
// Not an error; returned on success
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 200 OK
|
||||||
|
OK = 0;
|
||||||
|
|
||||||
|
// The operation was cancelled, typically by the caller.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 499 Client Closed Request
|
||||||
|
CANCELLED = 1;
|
||||||
|
|
||||||
|
// Unknown error. For example, this error may be returned when
|
||||||
|
// a `Status` value received from another address space belongs to
|
||||||
|
// an error space that is not known in this address space. Also
|
||||||
|
// errors raised by APIs that do not return enough error information
|
||||||
|
// may be converted to this error.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 500 Internal Server Error
|
||||||
|
UNKNOWN = 2;
|
||||||
|
|
||||||
|
// The client specified an invalid argument. Note that this differs
|
||||||
|
// from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments
|
||||||
|
// that are problematic regardless of the state of the system
|
||||||
|
// (e.g., a malformed file name).
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 400 Bad Request
|
||||||
|
INVALID_ARGUMENT = 3;
|
||||||
|
|
||||||
|
// The deadline expired before the operation could complete. For operations
|
||||||
|
// that change the state of the system, this error may be returned
|
||||||
|
// even if the operation has completed successfully. For example, a
|
||||||
|
// successful response from a server could have been delayed long
|
||||||
|
// enough for the deadline to expire.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 504 Gateway Timeout
|
||||||
|
DEADLINE_EXCEEDED = 4;
|
||||||
|
|
||||||
|
// Some requested entity (e.g., file or directory) was not found.
|
||||||
|
//
|
||||||
|
// Note to server developers: if a request is denied for an entire class
|
||||||
|
// of users, such as gradual feature rollout or undocumented whitelist,
|
||||||
|
// `NOT_FOUND` may be used. If a request is denied for some users within
|
||||||
|
// a class of users, such as user-based access control, `PERMISSION_DENIED`
|
||||||
|
// must be used.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 404 Not Found
|
||||||
|
NOT_FOUND = 5;
|
||||||
|
|
||||||
|
// The entity that a client attempted to create (e.g., file or directory)
|
||||||
|
// already exists.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 409 Conflict
|
||||||
|
ALREADY_EXISTS = 6;
|
||||||
|
|
||||||
|
// The caller does not have permission to execute the specified
|
||||||
|
// operation. `PERMISSION_DENIED` must not be used for rejections
|
||||||
|
// caused by exhausting some resource (use `RESOURCE_EXHAUSTED`
|
||||||
|
// instead for those errors). `PERMISSION_DENIED` must not be
|
||||||
|
// used if the caller can not be identified (use `UNAUTHENTICATED`
|
||||||
|
// instead for those errors). This error code does not imply the
|
||||||
|
// request is valid or the requested entity exists or satisfies
|
||||||
|
// other pre-conditions.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 403 Forbidden
|
||||||
|
PERMISSION_DENIED = 7;
|
||||||
|
|
||||||
|
// The request does not have valid authentication credentials for the
|
||||||
|
// operation.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 401 Unauthorized
|
||||||
|
UNAUTHENTICATED = 16;
|
||||||
|
|
||||||
|
// Some resource has been exhausted, perhaps a per-user quota, or
|
||||||
|
// perhaps the entire file system is out of space.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 429 Too Many Requests
|
||||||
|
RESOURCE_EXHAUSTED = 8;
|
||||||
|
|
||||||
|
// The operation was rejected because the system is not in a state
|
||||||
|
// required for the operation's execution. For example, the directory
|
||||||
|
// to be deleted is non-empty, an rmdir operation is applied to
|
||||||
|
// a non-directory, etc.
|
||||||
|
//
|
||||||
|
// Service implementors can use the following guidelines to decide
|
||||||
|
// between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`:
|
||||||
|
// (a) Use `UNAVAILABLE` if the client can retry just the failing call.
|
||||||
|
// (b) Use `ABORTED` if the client should retry at a higher level
|
||||||
|
// (e.g., when a client-specified test-and-set fails, indicating the
|
||||||
|
// client should restart a read-modify-write sequence).
|
||||||
|
// (c) Use `FAILED_PRECONDITION` if the client should not retry until
|
||||||
|
// the system state has been explicitly fixed. E.g., if an "rmdir"
|
||||||
|
// fails because the directory is non-empty, `FAILED_PRECONDITION`
|
||||||
|
// should be returned since the client should not retry unless
|
||||||
|
// the files are deleted from the directory.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 400 Bad Request
|
||||||
|
FAILED_PRECONDITION = 9;
|
||||||
|
|
||||||
|
// The operation was aborted, typically due to a concurrency issue such as
|
||||||
|
// a sequencer check failure or transaction abort.
|
||||||
|
//
|
||||||
|
// See the guidelines above for deciding between `FAILED_PRECONDITION`,
|
||||||
|
// `ABORTED`, and `UNAVAILABLE`.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 409 Conflict
|
||||||
|
ABORTED = 10;
|
||||||
|
|
||||||
|
// The operation was attempted past the valid range. E.g., seeking or
|
||||||
|
// reading past end-of-file.
|
||||||
|
//
|
||||||
|
// Unlike `INVALID_ARGUMENT`, this error indicates a problem that may
|
||||||
|
// be fixed if the system state changes. For example, a 32-bit file
|
||||||
|
// system will generate `INVALID_ARGUMENT` if asked to read at an
|
||||||
|
// offset that is not in the range [0,2^32-1], but it will generate
|
||||||
|
// `OUT_OF_RANGE` if asked to read from an offset past the current
|
||||||
|
// file size.
|
||||||
|
//
|
||||||
|
// There is a fair bit of overlap between `FAILED_PRECONDITION` and
|
||||||
|
// `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific
|
||||||
|
// error) when it applies so that callers who are iterating through
|
||||||
|
// a space can easily look for an `OUT_OF_RANGE` error to detect when
|
||||||
|
// they are done.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 400 Bad Request
|
||||||
|
OUT_OF_RANGE = 11;
|
||||||
|
|
||||||
|
// The operation is not implemented or is not supported/enabled in this
|
||||||
|
// service.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 501 Not Implemented
|
||||||
|
UNIMPLEMENTED = 12;
|
||||||
|
|
||||||
|
// Internal errors. This means that some invariants expected by the
|
||||||
|
// underlying system have been broken. This error code is reserved
|
||||||
|
// for serious errors.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 500 Internal Server Error
|
||||||
|
INTERNAL = 13;
|
||||||
|
|
||||||
|
// The service is currently unavailable. This is most likely a
|
||||||
|
// transient condition, which can be corrected by retrying with
|
||||||
|
// a backoff.
|
||||||
|
//
|
||||||
|
// See the guidelines above for deciding between `FAILED_PRECONDITION`,
|
||||||
|
// `ABORTED`, and `UNAVAILABLE`.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 503 Service Unavailable
|
||||||
|
UNAVAILABLE = 14;
|
||||||
|
|
||||||
|
// Unrecoverable data loss or corruption.
|
||||||
|
//
|
||||||
|
// HTTP Mapping: 500 Internal Server Error
|
||||||
|
DATA_LOSS = 15;
|
||||||
|
}
|
1
protobuf/google/rpc/doc.go
Normal file
1
protobuf/google/rpc/doc.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
package rpc
|
2555
protobuf/google/rpc/error_details.pb.go
Normal file
2555
protobuf/google/rpc/error_details.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
200
protobuf/google/rpc/error_details.proto
Normal file
200
protobuf/google/rpc/error_details.proto
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
// Copyright 2017 Google 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
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package google.rpc;
|
||||||
|
|
||||||
|
import "google/protobuf/duration.proto";
|
||||||
|
|
||||||
|
option go_package = "github.com/containerd/containerd/protobuf/google/rpc;rpc";
|
||||||
|
option java_multiple_files = true;
|
||||||
|
option java_outer_classname = "ErrorDetailsProto";
|
||||||
|
option java_package = "com.google.rpc";
|
||||||
|
option objc_class_prefix = "RPC";
|
||||||
|
|
||||||
|
|
||||||
|
// Describes when the clients can retry a failed request. Clients could ignore
|
||||||
|
// the recommendation here or retry when this information is missing from error
|
||||||
|
// responses.
|
||||||
|
//
|
||||||
|
// It's always recommended that clients should use exponential backoff when
|
||||||
|
// retrying.
|
||||||
|
//
|
||||||
|
// Clients should wait until `retry_delay` amount of time has passed since
|
||||||
|
// receiving the error response before retrying. If retrying requests also
|
||||||
|
// fail, clients should use an exponential backoff scheme to gradually increase
|
||||||
|
// the delay between retries based on `retry_delay`, until either a maximum
|
||||||
|
// number of retires have been reached or a maximum retry delay cap has been
|
||||||
|
// reached.
|
||||||
|
message RetryInfo {
|
||||||
|
// Clients should wait at least this long between retrying the same request.
|
||||||
|
google.protobuf.Duration retry_delay = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes additional debugging info.
|
||||||
|
message DebugInfo {
|
||||||
|
// The stack trace entries indicating where the error occurred.
|
||||||
|
repeated string stack_entries = 1;
|
||||||
|
|
||||||
|
// Additional debugging information provided by the server.
|
||||||
|
string detail = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes how a quota check failed.
|
||||||
|
//
|
||||||
|
// For example if a daily limit was exceeded for the calling project,
|
||||||
|
// a service could respond with a QuotaFailure detail containing the project
|
||||||
|
// id and the description of the quota limit that was exceeded. If the
|
||||||
|
// calling project hasn't enabled the service in the developer console, then
|
||||||
|
// a service could respond with the project id and set `service_disabled`
|
||||||
|
// to true.
|
||||||
|
//
|
||||||
|
// Also see RetryDetail and Help types for other details about handling a
|
||||||
|
// quota failure.
|
||||||
|
message QuotaFailure {
|
||||||
|
// A message type used to describe a single quota violation. For example, a
|
||||||
|
// daily quota or a custom quota that was exceeded.
|
||||||
|
message Violation {
|
||||||
|
// The subject on which the quota check failed.
|
||||||
|
// For example, "clientip:<ip address of client>" or "project:<Google
|
||||||
|
// developer project id>".
|
||||||
|
string subject = 1;
|
||||||
|
|
||||||
|
// A description of how the quota check failed. Clients can use this
|
||||||
|
// description to find more about the quota configuration in the service's
|
||||||
|
// public documentation, or find the relevant quota limit to adjust through
|
||||||
|
// developer console.
|
||||||
|
//
|
||||||
|
// For example: "Service disabled" or "Daily Limit for read operations
|
||||||
|
// exceeded".
|
||||||
|
string description = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes all quota violations.
|
||||||
|
repeated Violation violations = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes what preconditions have failed.
|
||||||
|
//
|
||||||
|
// For example, if an RPC failed because it required the Terms of Service to be
|
||||||
|
// acknowledged, it could list the terms of service violation in the
|
||||||
|
// PreconditionFailure message.
|
||||||
|
message PreconditionFailure {
|
||||||
|
// A message type used to describe a single precondition failure.
|
||||||
|
message Violation {
|
||||||
|
// The type of PreconditionFailure. We recommend using a service-specific
|
||||||
|
// enum type to define the supported precondition violation types. For
|
||||||
|
// example, "TOS" for "Terms of Service violation".
|
||||||
|
string type = 1;
|
||||||
|
|
||||||
|
// The subject, relative to the type, that failed.
|
||||||
|
// For example, "google.com/cloud" relative to the "TOS" type would
|
||||||
|
// indicate which terms of service is being referenced.
|
||||||
|
string subject = 2;
|
||||||
|
|
||||||
|
// A description of how the precondition failed. Developers can use this
|
||||||
|
// description to understand how to fix the failure.
|
||||||
|
//
|
||||||
|
// For example: "Terms of service not accepted".
|
||||||
|
string description = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes all precondition violations.
|
||||||
|
repeated Violation violations = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes violations in a client request. This error type focuses on the
|
||||||
|
// syntactic aspects of the request.
|
||||||
|
message BadRequest {
|
||||||
|
// A message type used to describe a single bad request field.
|
||||||
|
message FieldViolation {
|
||||||
|
// A path leading to a field in the request body. The value will be a
|
||||||
|
// sequence of dot-separated identifiers that identify a protocol buffer
|
||||||
|
// field. E.g., "field_violations.field" would identify this field.
|
||||||
|
string field = 1;
|
||||||
|
|
||||||
|
// A description of why the request element is bad.
|
||||||
|
string description = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes all violations in a client request.
|
||||||
|
repeated FieldViolation field_violations = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Contains metadata about the request that clients can attach when filing a bug
|
||||||
|
// or providing other forms of feedback.
|
||||||
|
message RequestInfo {
|
||||||
|
// An opaque string that should only be interpreted by the service generating
|
||||||
|
// it. For example, it can be used to identify requests in the service's logs.
|
||||||
|
string request_id = 1;
|
||||||
|
|
||||||
|
// Any data that was used to serve this request. For example, an encrypted
|
||||||
|
// stack trace that can be sent back to the service provider for debugging.
|
||||||
|
string serving_data = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes the resource that is being accessed.
|
||||||
|
message ResourceInfo {
|
||||||
|
// A name for the type of resource being accessed, e.g. "sql table",
|
||||||
|
// "cloud storage bucket", "file", "Google calendar"; or the type URL
|
||||||
|
// of the resource: e.g. "type.googleapis.com/google.pubsub.v1.Topic".
|
||||||
|
string resource_type = 1;
|
||||||
|
|
||||||
|
// The name of the resource being accessed. For example, a shared calendar
|
||||||
|
// name: "example.com_4fghdhgsrgh@group.calendar.google.com", if the current
|
||||||
|
// error is [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED].
|
||||||
|
string resource_name = 2;
|
||||||
|
|
||||||
|
// The owner of the resource (optional).
|
||||||
|
// For example, "user:<owner email>" or "project:<Google developer project
|
||||||
|
// id>".
|
||||||
|
string owner = 3;
|
||||||
|
|
||||||
|
// Describes what error is encountered when accessing this resource.
|
||||||
|
// For example, updating a cloud project may require the `writer` permission
|
||||||
|
// on the developer console project.
|
||||||
|
string description = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Provides links to documentation or for performing an out of band action.
|
||||||
|
//
|
||||||
|
// For example, if a quota check failed with an error indicating the calling
|
||||||
|
// project hasn't enabled the accessed service, this can contain a URL pointing
|
||||||
|
// directly to the right place in the developer console to flip the bit.
|
||||||
|
message Help {
|
||||||
|
// Describes a URL link.
|
||||||
|
message Link {
|
||||||
|
// Describes what the link offers.
|
||||||
|
string description = 1;
|
||||||
|
|
||||||
|
// The URL of the link.
|
||||||
|
string url = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// URL(s) pointing to additional information on handling the current error.
|
||||||
|
repeated Link links = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Provides a localized error message that is safe to return to the user
|
||||||
|
// which can be attached to an RPC error.
|
||||||
|
message LocalizedMessage {
|
||||||
|
// The locale used following the specification defined at
|
||||||
|
// http://www.rfc-editor.org/rfc/bcp/bcp47.txt.
|
||||||
|
// Examples are: "en-US", "fr-CH", "es-MX"
|
||||||
|
string locale = 1;
|
||||||
|
|
||||||
|
// The localized error message in the above locale.
|
||||||
|
string message = 2;
|
||||||
|
}
|
468
protobuf/google/rpc/status.pb.go
Normal file
468
protobuf/google/rpc/status.pb.go
Normal file
@ -0,0 +1,468 @@
|
|||||||
|
// Code generated by protoc-gen-gogo.
|
||||||
|
// source: github.com/containerd/containerd/protobuf/google/rpc/status.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
package rpc
|
||||||
|
|
||||||
|
import proto "github.com/gogo/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
import google_protobuf1 "github.com/gogo/protobuf/types"
|
||||||
|
|
||||||
|
import strings "strings"
|
||||||
|
import reflect "reflect"
|
||||||
|
|
||||||
|
import io "io"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// The `Status` type defines a logical error model that is suitable for different
|
||||||
|
// programming environments, including REST APIs and RPC APIs. It is used by
|
||||||
|
// [gRPC](https://github.com/grpc). The error model is designed to be:
|
||||||
|
//
|
||||||
|
// - Simple to use and understand for most users
|
||||||
|
// - Flexible enough to meet unexpected needs
|
||||||
|
//
|
||||||
|
// # Overview
|
||||||
|
//
|
||||||
|
// The `Status` message contains three pieces of data: error code, error message,
|
||||||
|
// and error details. The error code should be an enum value of
|
||||||
|
// [google.rpc.Code][google.rpc.Code], but it may accept additional error codes if needed. The
|
||||||
|
// error message should be a developer-facing English message that helps
|
||||||
|
// developers *understand* and *resolve* the error. If a localized user-facing
|
||||||
|
// error message is needed, put the localized message in the error details or
|
||||||
|
// localize it in the client. The optional error details may contain arbitrary
|
||||||
|
// information about the error. There is a predefined set of error detail types
|
||||||
|
// in the package `google.rpc` that can be used for common error conditions.
|
||||||
|
//
|
||||||
|
// # Language mapping
|
||||||
|
//
|
||||||
|
// The `Status` message is the logical representation of the error model, but it
|
||||||
|
// is not necessarily the actual wire format. When the `Status` message is
|
||||||
|
// exposed in different client libraries and different wire protocols, it can be
|
||||||
|
// mapped differently. For example, it will likely be mapped to some exceptions
|
||||||
|
// in Java, but more likely mapped to some error codes in C.
|
||||||
|
//
|
||||||
|
// # Other uses
|
||||||
|
//
|
||||||
|
// The error model and the `Status` message can be used in a variety of
|
||||||
|
// environments, either with or without APIs, to provide a
|
||||||
|
// consistent developer experience across different environments.
|
||||||
|
//
|
||||||
|
// Example uses of this error model include:
|
||||||
|
//
|
||||||
|
// - Partial errors. If a service needs to return partial errors to the client,
|
||||||
|
// it may embed the `Status` in the normal response to indicate the partial
|
||||||
|
// errors.
|
||||||
|
//
|
||||||
|
// - Workflow errors. A typical workflow has multiple steps. Each step may
|
||||||
|
// have a `Status` message for error reporting.
|
||||||
|
//
|
||||||
|
// - Batch operations. If a client uses batch request and batch response, the
|
||||||
|
// `Status` message should be used directly inside batch response, one for
|
||||||
|
// each error sub-response.
|
||||||
|
//
|
||||||
|
// - Asynchronous operations. If an API call embeds asynchronous operation
|
||||||
|
// results in its response, the status of those operations should be
|
||||||
|
// represented directly using the `Status` message.
|
||||||
|
//
|
||||||
|
// - Logging. If some API errors are stored in logs, the message `Status` could
|
||||||
|
// be used directly after any stripping needed for security/privacy reasons.
|
||||||
|
type Status struct {
|
||||||
|
// The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].
|
||||||
|
Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
|
||||||
|
// A developer-facing error message, which should be in English. Any
|
||||||
|
// user-facing error message should be localized and sent in the
|
||||||
|
// [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.
|
||||||
|
Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
|
||||||
|
// A list of messages that carry the error details. There is a common set of
|
||||||
|
// message types for APIs to use.
|
||||||
|
Details []*google_protobuf1.Any `protobuf:"bytes,3,rep,name=details" json:"details,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Status) Reset() { *m = Status{} }
|
||||||
|
func (*Status) ProtoMessage() {}
|
||||||
|
func (*Status) Descriptor() ([]byte, []int) { return fileDescriptorStatus, []int{0} }
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*Status)(nil), "google.rpc.Status")
|
||||||
|
}
|
||||||
|
func (m *Status) 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 *Status) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
var i int
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if m.Code != 0 {
|
||||||
|
dAtA[i] = 0x8
|
||||||
|
i++
|
||||||
|
i = encodeVarintStatus(dAtA, i, uint64(m.Code))
|
||||||
|
}
|
||||||
|
if len(m.Message) > 0 {
|
||||||
|
dAtA[i] = 0x12
|
||||||
|
i++
|
||||||
|
i = encodeVarintStatus(dAtA, i, uint64(len(m.Message)))
|
||||||
|
i += copy(dAtA[i:], m.Message)
|
||||||
|
}
|
||||||
|
if len(m.Details) > 0 {
|
||||||
|
for _, msg := range m.Details {
|
||||||
|
dAtA[i] = 0x1a
|
||||||
|
i++
|
||||||
|
i = encodeVarintStatus(dAtA, i, uint64(msg.Size()))
|
||||||
|
n, err := msg.MarshalTo(dAtA[i:])
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
i += n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeFixed64Status(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 encodeFixed32Status(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 encodeVarintStatus(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 *Status) Size() (n int) {
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if m.Code != 0 {
|
||||||
|
n += 1 + sovStatus(uint64(m.Code))
|
||||||
|
}
|
||||||
|
l = len(m.Message)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovStatus(uint64(l))
|
||||||
|
}
|
||||||
|
if len(m.Details) > 0 {
|
||||||
|
for _, e := range m.Details {
|
||||||
|
l = e.Size()
|
||||||
|
n += 1 + l + sovStatus(uint64(l))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func sovStatus(x uint64) (n int) {
|
||||||
|
for {
|
||||||
|
n++
|
||||||
|
x >>= 7
|
||||||
|
if x == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
func sozStatus(x uint64) (n int) {
|
||||||
|
return sovStatus(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
||||||
|
}
|
||||||
|
func (this *Status) String() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := strings.Join([]string{`&Status{`,
|
||||||
|
`Code:` + fmt.Sprintf("%v", this.Code) + `,`,
|
||||||
|
`Message:` + fmt.Sprintf("%v", this.Message) + `,`,
|
||||||
|
`Details:` + strings.Replace(fmt.Sprintf("%v", this.Details), "Any", "google_protobuf1.Any", 1) + `,`,
|
||||||
|
`}`,
|
||||||
|
}, "")
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func valueToStringStatus(v interface{}) string {
|
||||||
|
rv := reflect.ValueOf(v)
|
||||||
|
if rv.IsNil() {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
pv := reflect.Indirect(rv).Interface()
|
||||||
|
return fmt.Sprintf("*%v", pv)
|
||||||
|
}
|
||||||
|
func (m *Status) 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 ErrIntOverflowStatus
|
||||||
|
}
|
||||||
|
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: Status: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: Status: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 0 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType)
|
||||||
|
}
|
||||||
|
m.Code = 0
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowStatus
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
m.Code |= (int32(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType)
|
||||||
|
}
|
||||||
|
var stringLen uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowStatus
|
||||||
|
}
|
||||||
|
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 ErrInvalidLengthStatus
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + intStringLen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Message = string(dAtA[iNdEx:postIndex])
|
||||||
|
iNdEx = postIndex
|
||||||
|
case 3:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType)
|
||||||
|
}
|
||||||
|
var msglen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowStatus
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
msglen |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if msglen < 0 {
|
||||||
|
return ErrInvalidLengthStatus
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + msglen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Details = append(m.Details, &google_protobuf1.Any{})
|
||||||
|
if err := m.Details[len(m.Details)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipStatus(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if skippy < 0 {
|
||||||
|
return ErrInvalidLengthStatus
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func skipStatus(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, ErrIntOverflowStatus
|
||||||
|
}
|
||||||
|
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, ErrIntOverflowStatus
|
||||||
|
}
|
||||||
|
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, ErrIntOverflowStatus
|
||||||
|
}
|
||||||
|
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, ErrInvalidLengthStatus
|
||||||
|
}
|
||||||
|
return iNdEx, nil
|
||||||
|
case 3:
|
||||||
|
for {
|
||||||
|
var innerWire uint64
|
||||||
|
var start int = iNdEx
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowStatus
|
||||||
|
}
|
||||||
|
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 := skipStatus(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 (
|
||||||
|
ErrInvalidLengthStatus = fmt.Errorf("proto: negative length found during unmarshaling")
|
||||||
|
ErrIntOverflowStatus = fmt.Errorf("proto: integer overflow")
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterFile("github.com/containerd/containerd/protobuf/google/rpc/status.proto", fileDescriptorStatus)
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileDescriptorStatus = []byte{
|
||||||
|
// 236 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x72, 0x4c, 0xcf, 0x2c, 0xc9,
|
||||||
|
0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xcc, 0xcc, 0x4b, 0x2d,
|
||||||
|
0x4a, 0x41, 0x66, 0x16, 0x14, 0xe5, 0x97, 0xe4, 0x27, 0x95, 0xa6, 0xe9, 0xa7, 0xe7, 0xe7, 0xa7,
|
||||||
|
0xe7, 0xa4, 0xea, 0x17, 0x15, 0x24, 0xeb, 0x17, 0x97, 0x24, 0x96, 0x94, 0x16, 0xeb, 0x81, 0xa5,
|
||||||
|
0x84, 0xb8, 0x20, 0x12, 0x7a, 0x45, 0x05, 0xc9, 0x52, 0x92, 0x50, 0x45, 0x70, 0x4d, 0x89, 0x79,
|
||||||
|
0x95, 0x10, 0x65, 0x4a, 0x69, 0x5c, 0x6c, 0xc1, 0x60, 0x6d, 0x42, 0x42, 0x5c, 0x2c, 0xc9, 0xf9,
|
||||||
|
0x29, 0xa9, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x60, 0xb6, 0x90, 0x04, 0x17, 0x7b, 0x6e,
|
||||||
|
0x6a, 0x71, 0x71, 0x62, 0x7a, 0xaa, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x8c, 0x2b, 0xa4,
|
||||||
|
0xc7, 0xc5, 0x9e, 0x92, 0x5a, 0x92, 0x98, 0x99, 0x53, 0x2c, 0xc1, 0xac, 0xc0, 0xac, 0xc1, 0x6d,
|
||||||
|
0x24, 0xa2, 0x07, 0xb5, 0x10, 0x66, 0x89, 0x9e, 0x63, 0x5e, 0x65, 0x10, 0x4c, 0x91, 0x53, 0xf9,
|
||||||
|
0x89, 0x87, 0x72, 0x0c, 0x37, 0x1e, 0xca, 0x31, 0x34, 0x3c, 0x92, 0x63, 0x3c, 0xf1, 0x48, 0x8e,
|
||||||
|
0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0xb9, 0xf8, 0x92, 0xf3, 0x73, 0xf5, 0x10,
|
||||||
|
0x8e, 0x75, 0xe2, 0x86, 0xb8, 0x27, 0x00, 0x64, 0x4c, 0x00, 0x63, 0x94, 0x05, 0x39, 0x41, 0x61,
|
||||||
|
0x5d, 0x54, 0x90, 0xbc, 0x88, 0x89, 0x39, 0x28, 0xc0, 0x39, 0x89, 0x0d, 0x2c, 0x6d, 0x0c, 0x08,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x7d, 0xb3, 0x06, 0x51, 0x53, 0x01, 0x00, 0x00,
|
||||||
|
}
|
92
protobuf/google/rpc/status.proto
Normal file
92
protobuf/google/rpc/status.proto
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
// Copyright 2017 Google 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
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package google.rpc;
|
||||||
|
|
||||||
|
import "google/protobuf/any.proto";
|
||||||
|
|
||||||
|
option go_package = "github.com/containerd/containerd/protobuf/google/rpc;rpc";
|
||||||
|
option java_multiple_files = true;
|
||||||
|
option java_outer_classname = "StatusProto";
|
||||||
|
option java_package = "com.google.rpc";
|
||||||
|
option objc_class_prefix = "RPC";
|
||||||
|
|
||||||
|
|
||||||
|
// The `Status` type defines a logical error model that is suitable for different
|
||||||
|
// programming environments, including REST APIs and RPC APIs. It is used by
|
||||||
|
// [gRPC](https://github.com/grpc). The error model is designed to be:
|
||||||
|
//
|
||||||
|
// - Simple to use and understand for most users
|
||||||
|
// - Flexible enough to meet unexpected needs
|
||||||
|
//
|
||||||
|
// # Overview
|
||||||
|
//
|
||||||
|
// The `Status` message contains three pieces of data: error code, error message,
|
||||||
|
// and error details. The error code should be an enum value of
|
||||||
|
// [google.rpc.Code][google.rpc.Code], but it may accept additional error codes if needed. The
|
||||||
|
// error message should be a developer-facing English message that helps
|
||||||
|
// developers *understand* and *resolve* the error. If a localized user-facing
|
||||||
|
// error message is needed, put the localized message in the error details or
|
||||||
|
// localize it in the client. The optional error details may contain arbitrary
|
||||||
|
// information about the error. There is a predefined set of error detail types
|
||||||
|
// in the package `google.rpc` that can be used for common error conditions.
|
||||||
|
//
|
||||||
|
// # Language mapping
|
||||||
|
//
|
||||||
|
// The `Status` message is the logical representation of the error model, but it
|
||||||
|
// is not necessarily the actual wire format. When the `Status` message is
|
||||||
|
// exposed in different client libraries and different wire protocols, it can be
|
||||||
|
// mapped differently. For example, it will likely be mapped to some exceptions
|
||||||
|
// in Java, but more likely mapped to some error codes in C.
|
||||||
|
//
|
||||||
|
// # Other uses
|
||||||
|
//
|
||||||
|
// The error model and the `Status` message can be used in a variety of
|
||||||
|
// environments, either with or without APIs, to provide a
|
||||||
|
// consistent developer experience across different environments.
|
||||||
|
//
|
||||||
|
// Example uses of this error model include:
|
||||||
|
//
|
||||||
|
// - Partial errors. If a service needs to return partial errors to the client,
|
||||||
|
// it may embed the `Status` in the normal response to indicate the partial
|
||||||
|
// errors.
|
||||||
|
//
|
||||||
|
// - Workflow errors. A typical workflow has multiple steps. Each step may
|
||||||
|
// have a `Status` message for error reporting.
|
||||||
|
//
|
||||||
|
// - Batch operations. If a client uses batch request and batch response, the
|
||||||
|
// `Status` message should be used directly inside batch response, one for
|
||||||
|
// each error sub-response.
|
||||||
|
//
|
||||||
|
// - Asynchronous operations. If an API call embeds asynchronous operation
|
||||||
|
// results in its response, the status of those operations should be
|
||||||
|
// represented directly using the `Status` message.
|
||||||
|
//
|
||||||
|
// - Logging. If some API errors are stored in logs, the message `Status` could
|
||||||
|
// be used directly after any stripping needed for security/privacy reasons.
|
||||||
|
message Status {
|
||||||
|
// The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].
|
||||||
|
int32 code = 1;
|
||||||
|
|
||||||
|
// A developer-facing error message, which should be in English. Any
|
||||||
|
// user-facing error message should be localized and sent in the
|
||||||
|
// [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.
|
||||||
|
string message = 2;
|
||||||
|
|
||||||
|
// A list of messages that carry the error details. There is a common set of
|
||||||
|
// message types for APIs to use.
|
||||||
|
repeated google.protobuf.Any details = 3;
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"expvar"
|
"expvar"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -16,6 +15,7 @@ import (
|
|||||||
diff "github.com/containerd/containerd/api/services/diff/v1"
|
diff "github.com/containerd/containerd/api/services/diff/v1"
|
||||||
eventsapi "github.com/containerd/containerd/api/services/events/v1"
|
eventsapi "github.com/containerd/containerd/api/services/events/v1"
|
||||||
images "github.com/containerd/containerd/api/services/images/v1"
|
images "github.com/containerd/containerd/api/services/images/v1"
|
||||||
|
introspection "github.com/containerd/containerd/api/services/introspection/v1"
|
||||||
namespaces "github.com/containerd/containerd/api/services/namespaces/v1"
|
namespaces "github.com/containerd/containerd/api/services/namespaces/v1"
|
||||||
snapshotapi "github.com/containerd/containerd/api/services/snapshot/v1"
|
snapshotapi "github.com/containerd/containerd/api/services/snapshot/v1"
|
||||||
tasks "github.com/containerd/containerd/api/services/tasks/v1"
|
tasks "github.com/containerd/containerd/api/services/tasks/v1"
|
||||||
@ -29,6 +29,7 @@ import (
|
|||||||
"github.com/containerd/containerd/snapshot"
|
"github.com/containerd/containerd/snapshot"
|
||||||
metrics "github.com/docker/go-metrics"
|
metrics "github.com/docker/go-metrics"
|
||||||
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
|
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
@ -66,7 +67,7 @@ func New(ctx context.Context, config *Config) (*Server, error) {
|
|||||||
rpc: rpc,
|
rpc: rpc,
|
||||||
events: events.NewExchange(),
|
events: events.NewExchange(),
|
||||||
}
|
}
|
||||||
initialized = make(map[plugin.Type]map[string]interface{})
|
initialized = plugin.NewPluginSet()
|
||||||
)
|
)
|
||||||
for _, p := range plugins {
|
for _, p := range plugins {
|
||||||
id := p.URI()
|
id := p.URI()
|
||||||
@ -74,10 +75,10 @@ func New(ctx context.Context, config *Config) (*Server, error) {
|
|||||||
|
|
||||||
initContext := plugin.NewContext(
|
initContext := plugin.NewContext(
|
||||||
ctx,
|
ctx,
|
||||||
|
p,
|
||||||
initialized,
|
initialized,
|
||||||
config.Root,
|
config.Root,
|
||||||
config.State,
|
config.State,
|
||||||
id,
|
|
||||||
)
|
)
|
||||||
initContext.Events = s.events
|
initContext.Events = s.events
|
||||||
initContext.Address = config.GRPC.Address
|
initContext.Address = config.GRPC.Address
|
||||||
@ -90,7 +91,12 @@ func New(ctx context.Context, config *Config) (*Server, error) {
|
|||||||
}
|
}
|
||||||
initContext.Config = pluginConfig
|
initContext.Config = pluginConfig
|
||||||
}
|
}
|
||||||
instance, err := p.Init(initContext)
|
result := p.Init(initContext)
|
||||||
|
if err := initialized.Add(result); err != nil {
|
||||||
|
return nil, errors.Wrapf(err, "could not add plugin result to plugin set")
|
||||||
|
}
|
||||||
|
|
||||||
|
instance, err := result.Instance()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if plugin.IsSkipPlugin(err) {
|
if plugin.IsSkipPlugin(err) {
|
||||||
log.G(ctx).WithField("type", p.Type).Infof("skip loading plugin %q...", id)
|
log.G(ctx).WithField("type", p.Type).Infof("skip loading plugin %q...", id)
|
||||||
@ -99,14 +105,6 @@ func New(ctx context.Context, config *Config) (*Server, error) {
|
|||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if types, ok := initialized[p.Type]; ok {
|
|
||||||
types[p.ID] = instance
|
|
||||||
} else {
|
|
||||||
initialized[p.Type] = map[string]interface{}{
|
|
||||||
p.ID: instance,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// check for grpc services that should be registered with the server
|
// check for grpc services that should be registered with the server
|
||||||
if service, ok := instance.(plugin.Service); ok {
|
if service, ok := instance.(plugin.Service); ok {
|
||||||
services = append(services, service)
|
services = append(services, service)
|
||||||
@ -171,7 +169,8 @@ func loadPlugins(config *Config) ([]*plugin.Registration, error) {
|
|||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
Type: plugin.ContentPlugin,
|
Type: plugin.ContentPlugin,
|
||||||
ID: "content",
|
ID: "content",
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
|
ic.Meta.Exports["root"] = ic.Root
|
||||||
return local.NewStore(ic.Root)
|
return local.NewStore(ic.Root)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@ -182,7 +181,7 @@ func loadPlugins(config *Config) ([]*plugin.Registration, error) {
|
|||||||
plugin.ContentPlugin,
|
plugin.ContentPlugin,
|
||||||
plugin.SnapshotPlugin,
|
plugin.SnapshotPlugin,
|
||||||
},
|
},
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
if err := os.MkdirAll(ic.Root, 0711); err != nil {
|
if err := os.MkdirAll(ic.Root, 0711); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -191,17 +190,26 @@ func loadPlugins(config *Config) ([]*plugin.Registration, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
rawSnapshotters, err := ic.GetAll(plugin.SnapshotPlugin)
|
snapshottersRaw, err := ic.GetByType(plugin.SnapshotPlugin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
snapshotters := make(map[string]snapshot.Snapshotter)
|
snapshotters := make(map[string]snapshot.Snapshotter)
|
||||||
for name, sn := range rawSnapshotters {
|
for name, sn := range snapshottersRaw {
|
||||||
|
sn, err := sn.Instance()
|
||||||
|
if err != nil {
|
||||||
|
log.G(ic.Context).WithError(err).
|
||||||
|
Warnf("could not use snapshotter %v in metadata plugin", name)
|
||||||
|
continue
|
||||||
|
}
|
||||||
snapshotters[name] = sn.(snapshot.Snapshotter)
|
snapshotters[name] = sn.(snapshot.Snapshotter)
|
||||||
}
|
}
|
||||||
|
|
||||||
db, err := bolt.Open(filepath.Join(ic.Root, "meta.db"), 0644, nil)
|
path := filepath.Join(ic.Root, "meta.db")
|
||||||
|
ic.Meta.Exports["path"] = path
|
||||||
|
|
||||||
|
db, err := bolt.Open(path, 0644, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -245,6 +253,8 @@ func interceptor(
|
|||||||
ctx = log.WithModule(ctx, "namespaces")
|
ctx = log.WithModule(ctx, "namespaces")
|
||||||
case eventsapi.EventsServer:
|
case eventsapi.EventsServer:
|
||||||
ctx = log.WithModule(ctx, "events")
|
ctx = log.WithModule(ctx, "events")
|
||||||
|
case introspection.IntrospectionServer:
|
||||||
|
ctx = log.WithModule(ctx, "introspection")
|
||||||
default:
|
default:
|
||||||
log.G(ctx).Warnf("unknown GRPC server type: %#v\n", info.Server)
|
log.G(ctx).Warnf("unknown GRPC server type: %#v\n", info.Server)
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ func init() {
|
|||||||
Requires: []plugin.Type{
|
Requires: []plugin.Type{
|
||||||
plugin.MetadataPlugin,
|
plugin.MetadataPlugin,
|
||||||
},
|
},
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
m, err := ic.Get(plugin.MetadataPlugin)
|
m, err := ic.Get(plugin.MetadataPlugin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -41,19 +41,22 @@ func init() {
|
|||||||
Requires: []plugin.Type{
|
Requires: []plugin.Type{
|
||||||
plugin.MetadataPlugin,
|
plugin.MetadataPlugin,
|
||||||
},
|
},
|
||||||
Init: NewService,
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
|
m, err := ic.Get(plugin.MetadataPlugin)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
s, err := NewService(m.(*metadata.DB).ContentStore(), ic.Events)
|
||||||
|
return s, err
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewService(ic *plugin.InitContext) (interface{}, error) {
|
func NewService(cs content.Store, publisher events.Publisher) (*Service, error) {
|
||||||
m, err := ic.Get(plugin.MetadataPlugin)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &Service{
|
return &Service{
|
||||||
store: m.(*metadata.DB).ContentStore(),
|
store: cs,
|
||||||
publisher: ic.Events,
|
publisher: publisher,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,8 +32,8 @@ func init() {
|
|||||||
Config: &config{
|
Config: &config{
|
||||||
Order: []string{"walking"},
|
Order: []string{"walking"},
|
||||||
},
|
},
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
differs, err := ic.GetAll(plugin.DiffPlugin)
|
differs, err := ic.GetByType(plugin.DiffPlugin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -41,10 +41,15 @@ func init() {
|
|||||||
orderedNames := ic.Config.(*config).Order
|
orderedNames := ic.Config.(*config).Order
|
||||||
ordered := make([]plugin.Differ, len(orderedNames))
|
ordered := make([]plugin.Differ, len(orderedNames))
|
||||||
for i, n := range orderedNames {
|
for i, n := range orderedNames {
|
||||||
differ, ok := differs[n]
|
differp, ok := differs[n]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.Errorf("needed differ not loaded: %s", n)
|
return nil, errors.Errorf("needed differ not loaded: %s", n)
|
||||||
}
|
}
|
||||||
|
differ, err := differp.Instance()
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrapf(err, "could not load required differ due plugin init error: %s", n)
|
||||||
|
}
|
||||||
|
|
||||||
ordered[i] = differ.(plugin.Differ)
|
ordered[i] = differ.(plugin.Differ)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ func init() {
|
|||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
Type: plugin.GRPCPlugin,
|
Type: plugin.GRPCPlugin,
|
||||||
ID: "events",
|
ID: "events",
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
return NewService(ic.Events), nil
|
return NewService(ic.Events), nil
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -16,11 +16,13 @@ func init() {
|
|||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
Type: plugin.GRPCPlugin,
|
Type: plugin.GRPCPlugin,
|
||||||
ID: "healthcheck",
|
ID: "healthcheck",
|
||||||
Init: NewService,
|
InitFn: func(*plugin.InitContext) (interface{}, error) {
|
||||||
|
return NewService()
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewService(ic *plugin.InitContext) (interface{}, error) {
|
func NewService() (*Service, error) {
|
||||||
return &Service{
|
return &Service{
|
||||||
health.NewServer(),
|
health.NewServer(),
|
||||||
}, nil
|
}, nil
|
||||||
|
@ -23,7 +23,7 @@ func init() {
|
|||||||
Requires: []plugin.Type{
|
Requires: []plugin.Type{
|
||||||
plugin.MetadataPlugin,
|
plugin.MetadataPlugin,
|
||||||
},
|
},
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
m, err := ic.Get(plugin.MetadataPlugin)
|
m, err := ic.Get(plugin.MetadataPlugin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
146
services/introspection/service.go
Normal file
146
services/introspection/service.go
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
package introspection
|
||||||
|
|
||||||
|
import (
|
||||||
|
api "github.com/containerd/containerd/api/services/introspection/v1"
|
||||||
|
"github.com/containerd/containerd/api/types"
|
||||||
|
"github.com/containerd/containerd/errdefs"
|
||||||
|
"github.com/containerd/containerd/filters"
|
||||||
|
"github.com/containerd/containerd/plugin"
|
||||||
|
"github.com/containerd/containerd/protobuf/google/rpc"
|
||||||
|
ptypes "github.com/gogo/protobuf/types"
|
||||||
|
context "golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
plugin.Register(&plugin.Registration{
|
||||||
|
Type: plugin.GRPCPlugin,
|
||||||
|
ID: "introspection",
|
||||||
|
Requires: []plugin.Type{"*"},
|
||||||
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
|
// this service works by using the plugin context up till the point
|
||||||
|
// this service is initialized. Since we require this service last,
|
||||||
|
// it should provide the full set of plugins.
|
||||||
|
pluginsPB := pluginsToPB(ic.GetAll())
|
||||||
|
return NewService(pluginsPB), nil
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type Service struct {
|
||||||
|
plugins []api.Plugin
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewService(plugins []api.Plugin) api.IntrospectionServer {
|
||||||
|
return &Service{
|
||||||
|
plugins: plugins,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) Register(server *grpc.Server) error {
|
||||||
|
api.RegisterIntrospectionServer(server, s)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) Plugins(ctx context.Context, req *api.PluginsRequest) (*api.PluginsResponse, error) {
|
||||||
|
filter, err := filters.ParseAll(req.Filters...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errdefs.ToGRPCf(errdefs.ErrInvalidArgument, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var plugins []api.Plugin
|
||||||
|
for _, p := range s.plugins {
|
||||||
|
if !filter.Match(adaptPlugin(p)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
plugins = append(plugins, p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &api.PluginsResponse{
|
||||||
|
Plugins: plugins,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func adaptPlugin(o interface{}) filters.Adaptor {
|
||||||
|
obj := o.(api.Plugin)
|
||||||
|
return filters.AdapterFunc(func(fieldpath []string) (string, bool) {
|
||||||
|
if len(fieldpath) == 0 {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
switch fieldpath[0] {
|
||||||
|
case "type":
|
||||||
|
return string(obj.Type), len(obj.Type) > 0
|
||||||
|
case "id":
|
||||||
|
return string(obj.ID), len(obj.ID) > 0
|
||||||
|
case "platforms":
|
||||||
|
// TODO(stevvooe): Another case here where have multiple values.
|
||||||
|
// May need to refactor the filter system to allow filtering by
|
||||||
|
// platform, if this is required.
|
||||||
|
case "capabilities":
|
||||||
|
// TODO(stevvooe): Need a better way to match against
|
||||||
|
// collections. We can only return "the value" but really it
|
||||||
|
// would be best if we could return a set of values for the
|
||||||
|
// path, any of which could match.
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func pluginsToPB(plugins []*plugin.Plugin) []api.Plugin {
|
||||||
|
var pluginsPB []api.Plugin
|
||||||
|
for _, p := range plugins {
|
||||||
|
var platforms []types.Platform
|
||||||
|
for _, p := range p.Meta.Platforms {
|
||||||
|
platforms = append(platforms, types.Platform{
|
||||||
|
OS: p.OS,
|
||||||
|
Architecture: p.Architecture,
|
||||||
|
Variant: p.Variant,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var requires []string
|
||||||
|
for _, r := range p.Registration.Requires {
|
||||||
|
requires = append(requires, r.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
var initErr *rpc.Status
|
||||||
|
if err := p.Err(); err != nil {
|
||||||
|
st, ok := status.FromError(errdefs.ToGRPC(err))
|
||||||
|
if ok {
|
||||||
|
var details []*ptypes.Any
|
||||||
|
for _, d := range st.Proto().Details {
|
||||||
|
details = append(details, &ptypes.Any{
|
||||||
|
TypeUrl: d.TypeUrl,
|
||||||
|
Value: d.Value,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
initErr = &rpc.Status{
|
||||||
|
Code: int32(st.Code()),
|
||||||
|
Message: st.Message(),
|
||||||
|
Details: details,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
initErr = &rpc.Status{
|
||||||
|
Code: int32(rpc.Code_UNKNOWN),
|
||||||
|
Message: err.Error(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pluginsPB = append(pluginsPB, api.Plugin{
|
||||||
|
Type: p.Registration.Type.String(),
|
||||||
|
ID: p.Registration.ID,
|
||||||
|
Requires: requires,
|
||||||
|
Platforms: platforms,
|
||||||
|
Capabilities: p.Meta.Capabilities,
|
||||||
|
Exports: p.Meta.Exports,
|
||||||
|
InitErr: initErr,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return pluginsPB
|
||||||
|
}
|
@ -24,7 +24,7 @@ func init() {
|
|||||||
Requires: []plugin.Type{
|
Requires: []plugin.Type{
|
||||||
plugin.MetadataPlugin,
|
plugin.MetadataPlugin,
|
||||||
},
|
},
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
m, err := ic.Get(plugin.MetadataPlugin)
|
m, err := ic.Get(plugin.MetadataPlugin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -25,7 +25,7 @@ func init() {
|
|||||||
Requires: []plugin.Type{
|
Requires: []plugin.Type{
|
||||||
plugin.MetadataPlugin,
|
plugin.MetadataPlugin,
|
||||||
},
|
},
|
||||||
Init: newService,
|
InitFn: newService,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,15 +46,16 @@ func init() {
|
|||||||
plugin.RuntimePlugin,
|
plugin.RuntimePlugin,
|
||||||
plugin.MetadataPlugin,
|
plugin.MetadataPlugin,
|
||||||
},
|
},
|
||||||
Init: New,
|
InitFn: New,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(ic *plugin.InitContext) (interface{}, error) {
|
func New(ic *plugin.InitContext) (interface{}, error) {
|
||||||
rt, err := ic.GetAll(plugin.RuntimePlugin)
|
rt, err := ic.GetByType(plugin.RuntimePlugin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
m, err := ic.Get(plugin.MetadataPlugin)
|
m, err := ic.Get(plugin.MetadataPlugin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -62,9 +63,18 @@ func New(ic *plugin.InitContext) (interface{}, error) {
|
|||||||
cs := m.(*metadata.DB).ContentStore()
|
cs := m.(*metadata.DB).ContentStore()
|
||||||
runtimes := make(map[string]runtime.Runtime)
|
runtimes := make(map[string]runtime.Runtime)
|
||||||
for _, rr := range rt {
|
for _, rr := range rt {
|
||||||
r := rr.(runtime.Runtime)
|
ri, err := rr.Instance()
|
||||||
|
if err != nil {
|
||||||
|
log.G(ic.Context).WithError(err).Warn("could not load runtime instance due to initialization error")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
r := ri.(runtime.Runtime)
|
||||||
runtimes[r.ID()] = r
|
runtimes[r.ID()] = r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(runtimes) == 0 {
|
||||||
|
return nil, errors.New("no runtimes available to create task service")
|
||||||
|
}
|
||||||
return &Service{
|
return &Service{
|
||||||
runtimes: runtimes,
|
runtimes: runtimes,
|
||||||
db: m.(*metadata.DB),
|
db: m.(*metadata.DB),
|
||||||
|
@ -13,9 +13,9 @@ var _ api.VersionServer = &Service{}
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
Type: plugin.GRPCPlugin,
|
Type: plugin.GRPCPlugin,
|
||||||
ID: "version",
|
ID: "version",
|
||||||
Init: New,
|
InitFn: New,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,9 +12,11 @@ import (
|
|||||||
"github.com/containerd/btrfs"
|
"github.com/containerd/btrfs"
|
||||||
"github.com/containerd/containerd/log"
|
"github.com/containerd/containerd/log"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
|
"github.com/containerd/containerd/platforms"
|
||||||
"github.com/containerd/containerd/plugin"
|
"github.com/containerd/containerd/plugin"
|
||||||
"github.com/containerd/containerd/snapshot"
|
"github.com/containerd/containerd/snapshot"
|
||||||
"github.com/containerd/containerd/snapshot/storage"
|
"github.com/containerd/containerd/snapshot/storage"
|
||||||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
@ -23,7 +25,9 @@ func init() {
|
|||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
ID: "btrfs",
|
ID: "btrfs",
|
||||||
Type: plugin.SnapshotPlugin,
|
Type: plugin.SnapshotPlugin,
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
|
ic.Meta.Platforms = []ocispec.Platform{platforms.DefaultSpec()}
|
||||||
|
ic.Meta.Exports = map[string]string{"root": ic.Root}
|
||||||
return NewSnapshotter(ic.Root)
|
return NewSnapshotter(ic.Root)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/containerd/containerd/fs"
|
"github.com/containerd/containerd/fs"
|
||||||
"github.com/containerd/containerd/log"
|
"github.com/containerd/containerd/log"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
|
"github.com/containerd/containerd/platforms"
|
||||||
"github.com/containerd/containerd/plugin"
|
"github.com/containerd/containerd/plugin"
|
||||||
"github.com/containerd/containerd/snapshot"
|
"github.com/containerd/containerd/snapshot"
|
||||||
"github.com/containerd/containerd/snapshot/storage"
|
"github.com/containerd/containerd/snapshot/storage"
|
||||||
@ -19,7 +20,8 @@ func init() {
|
|||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
Type: plugin.SnapshotPlugin,
|
Type: plugin.SnapshotPlugin,
|
||||||
ID: "naive",
|
ID: "naive",
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
|
ic.Meta.Platforms = append(ic.Meta.Platforms, platforms.DefaultSpec())
|
||||||
return NewSnapshotter(ic.Root)
|
return NewSnapshotter(ic.Root)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -14,6 +14,7 @@ import (
|
|||||||
"github.com/containerd/containerd/fs"
|
"github.com/containerd/containerd/fs"
|
||||||
"github.com/containerd/containerd/log"
|
"github.com/containerd/containerd/log"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
|
"github.com/containerd/containerd/platforms"
|
||||||
"github.com/containerd/containerd/plugin"
|
"github.com/containerd/containerd/plugin"
|
||||||
"github.com/containerd/containerd/snapshot"
|
"github.com/containerd/containerd/snapshot"
|
||||||
"github.com/containerd/containerd/snapshot/storage"
|
"github.com/containerd/containerd/snapshot/storage"
|
||||||
@ -24,7 +25,9 @@ func init() {
|
|||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
Type: plugin.SnapshotPlugin,
|
Type: plugin.SnapshotPlugin,
|
||||||
ID: "overlayfs",
|
ID: "overlayfs",
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
|
ic.Meta.Platforms = append(ic.Meta.Platforms, platforms.DefaultSpec())
|
||||||
|
ic.Meta.Exports["root"] = ic.Root
|
||||||
return NewSnapshotter(ic.Root)
|
return NewSnapshotter(ic.Root)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -19,7 +19,7 @@ func init() {
|
|||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
Type: plugin.SnapshotPlugin,
|
Type: plugin.SnapshotPlugin,
|
||||||
ID: "windows",
|
ID: "windows",
|
||||||
Init: func(ic *plugin.InitContext) (interface{}, error) {
|
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
|
||||||
return NewSnapshotter(ic.Root)
|
return NewSnapshotter(ic.Root)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -18,7 +18,7 @@ import proto "github.com/gogo/protobuf/proto"
|
|||||||
import fmt "fmt"
|
import fmt "fmt"
|
||||||
import math "math"
|
import math "math"
|
||||||
import _ "github.com/gogo/protobuf/gogoproto"
|
import _ "github.com/gogo/protobuf/gogoproto"
|
||||||
import _ "github.com/golang/protobuf/ptypes/duration"
|
import _ "github.com/gogo/protobuf/types"
|
||||||
import google_protobuf2 "github.com/gogo/protobuf/types"
|
import google_protobuf2 "github.com/gogo/protobuf/types"
|
||||||
|
|
||||||
import time "time"
|
import time "time"
|
||||||
|
@ -41,9 +41,9 @@ var _ = (runtime.Runtime)(&windowsRuntime{})
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
ID: runtimeName,
|
ID: runtimeName,
|
||||||
Type: plugin.RuntimePlugin,
|
Type: plugin.RuntimePlugin,
|
||||||
Init: New,
|
InitFn: New,
|
||||||
Requires: []plugin.Type{
|
Requires: []plugin.Type{
|
||||||
plugin.MetadataPlugin,
|
plugin.MetadataPlugin,
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user