Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
songlinfeng
k8s-device-plugin
Commits
8a683270
Commit
8a683270
authored
Nov 25, 2025
by
songlinfeng
💬
Browse files
add k8s-device-plugin
parent
f5f6fd20
Changes
165
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
2544 additions
and
0 deletions
+2544
-0
vendor/github.com/golang/protobuf/proto/text_decode.go
vendor/github.com/golang/protobuf/proto/text_decode.go
+801
-0
vendor/github.com/golang/protobuf/proto/text_encode.go
vendor/github.com/golang/protobuf/proto/text_encode.go
+560
-0
vendor/github.com/golang/protobuf/proto/wire.go
vendor/github.com/golang/protobuf/proto/wire.go
+78
-0
vendor/github.com/golang/protobuf/proto/wrappers.go
vendor/github.com/golang/protobuf/proto/wrappers.go
+34
-0
vendor/github.com/golang/protobuf/ptypes/any.go
vendor/github.com/golang/protobuf/ptypes/any.go
+165
-0
vendor/github.com/golang/protobuf/ptypes/any/any.pb.go
vendor/github.com/golang/protobuf/ptypes/any/any.pb.go
+62
-0
vendor/github.com/golang/protobuf/ptypes/doc.go
vendor/github.com/golang/protobuf/ptypes/doc.go
+6
-0
vendor/github.com/golang/protobuf/ptypes/duration.go
vendor/github.com/golang/protobuf/ptypes/duration.go
+72
-0
vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go
...github.com/golang/protobuf/ptypes/duration/duration.pb.go
+63
-0
vendor/github.com/golang/protobuf/ptypes/timestamp.go
vendor/github.com/golang/protobuf/ptypes/timestamp.go
+103
-0
vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
...thub.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
+64
-0
vendor/github.com/kubevirt/device-plugin-manager/LICENSE
vendor/github.com/kubevirt/device-plugin-manager/LICENSE
+21
-0
vendor/github.com/kubevirt/device-plugin-manager/pkg/dpm/doc.go
.../github.com/kubevirt/device-plugin-manager/pkg/dpm/doc.go
+17
-0
vendor/github.com/kubevirt/device-plugin-manager/pkg/dpm/lister.go
...thub.com/kubevirt/device-plugin-manager/pkg/dpm/lister.go
+26
-0
vendor/github.com/kubevirt/device-plugin-manager/pkg/dpm/manager.go
...hub.com/kubevirt/device-plugin-manager/pkg/dpm/manager.go
+226
-0
vendor/github.com/kubevirt/device-plugin-manager/pkg/dpm/plugin.go
...thub.com/kubevirt/device-plugin-manager/pkg/dpm/plugin.go
+191
-0
vendor/golang.org/x/net/AUTHORS
vendor/golang.org/x/net/AUTHORS
+3
-0
vendor/golang.org/x/net/CONTRIBUTORS
vendor/golang.org/x/net/CONTRIBUTORS
+3
-0
vendor/golang.org/x/net/LICENSE
vendor/golang.org/x/net/LICENSE
+27
-0
vendor/golang.org/x/net/PATENTS
vendor/golang.org/x/net/PATENTS
+22
-0
No files found.
Too many changes to show.
To preserve performance only
165 of 165+
files are displayed.
Plain diff
Email patch
vendor/github.com/golang/protobuf/proto/text_decode.go
0 → 100644
View file @
8a683270
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
import
(
"encoding"
"errors"
"fmt"
"reflect"
"strconv"
"strings"
"unicode/utf8"
"google.golang.org/protobuf/encoding/prototext"
protoV2
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
)
const
wrapTextUnmarshalV2
=
false
// ParseError is returned by UnmarshalText.
type
ParseError
struct
{
Message
string
// Deprecated: Do not use.
Line
,
Offset
int
}
func
(
e
*
ParseError
)
Error
()
string
{
if
wrapTextUnmarshalV2
{
return
e
.
Message
}
if
e
.
Line
==
1
{
return
fmt
.
Sprintf
(
"line 1.%d: %v"
,
e
.
Offset
,
e
.
Message
)
}
return
fmt
.
Sprintf
(
"line %d: %v"
,
e
.
Line
,
e
.
Message
)
}
// UnmarshalText parses a proto text formatted string into m.
func
UnmarshalText
(
s
string
,
m
Message
)
error
{
if
u
,
ok
:=
m
.
(
encoding
.
TextUnmarshaler
);
ok
{
return
u
.
UnmarshalText
([]
byte
(
s
))
}
m
.
Reset
()
mi
:=
MessageV2
(
m
)
if
wrapTextUnmarshalV2
{
err
:=
prototext
.
UnmarshalOptions
{
AllowPartial
:
true
,
}
.
Unmarshal
([]
byte
(
s
),
mi
)
if
err
!=
nil
{
return
&
ParseError
{
Message
:
err
.
Error
()}
}
return
checkRequiredNotSet
(
mi
)
}
else
{
if
err
:=
newTextParser
(
s
)
.
unmarshalMessage
(
mi
.
ProtoReflect
(),
""
);
err
!=
nil
{
return
err
}
return
checkRequiredNotSet
(
mi
)
}
}
type
textParser
struct
{
s
string
// remaining input
done
bool
// whether the parsing is finished (success or error)
backed
bool
// whether back() was called
offset
,
line
int
cur
token
}
type
token
struct
{
value
string
err
*
ParseError
line
int
// line number
offset
int
// byte number from start of input, not start of line
unquoted
string
// the unquoted version of value, if it was a quoted string
}
func
newTextParser
(
s
string
)
*
textParser
{
p
:=
new
(
textParser
)
p
.
s
=
s
p
.
line
=
1
p
.
cur
.
line
=
1
return
p
}
func
(
p
*
textParser
)
unmarshalMessage
(
m
protoreflect
.
Message
,
terminator
string
)
(
err
error
)
{
md
:=
m
.
Descriptor
()
fds
:=
md
.
Fields
()
// A struct is a sequence of "name: value", terminated by one of
// '>' or '}', or the end of the input. A name may also be
// "[extension]" or "[type/url]".
//
// The whole struct can also be an expanded Any message, like:
// [type/url] < ... struct contents ... >
seen
:=
make
(
map
[
protoreflect
.
FieldNumber
]
bool
)
for
{
tok
:=
p
.
next
()
if
tok
.
err
!=
nil
{
return
tok
.
err
}
if
tok
.
value
==
terminator
{
break
}
if
tok
.
value
==
"["
{
if
err
:=
p
.
unmarshalExtensionOrAny
(
m
,
seen
);
err
!=
nil
{
return
err
}
continue
}
// This is a normal, non-extension field.
name
:=
protoreflect
.
Name
(
tok
.
value
)
fd
:=
fds
.
ByName
(
name
)
switch
{
case
fd
==
nil
:
gd
:=
fds
.
ByName
(
protoreflect
.
Name
(
strings
.
ToLower
(
string
(
name
))))
if
gd
!=
nil
&&
gd
.
Kind
()
==
protoreflect
.
GroupKind
&&
gd
.
Message
()
.
Name
()
==
name
{
fd
=
gd
}
case
fd
.
Kind
()
==
protoreflect
.
GroupKind
&&
fd
.
Message
()
.
Name
()
!=
name
:
fd
=
nil
case
fd
.
IsWeak
()
&&
fd
.
Message
()
.
IsPlaceholder
()
:
fd
=
nil
}
if
fd
==
nil
{
typeName
:=
string
(
md
.
FullName
())
if
m
,
ok
:=
m
.
Interface
()
.
(
Message
);
ok
{
t
:=
reflect
.
TypeOf
(
m
)
if
t
.
Kind
()
==
reflect
.
Ptr
{
typeName
=
t
.
Elem
()
.
String
()
}
}
return
p
.
errorf
(
"unknown field name %q in %v"
,
name
,
typeName
)
}
if
od
:=
fd
.
ContainingOneof
();
od
!=
nil
&&
m
.
WhichOneof
(
od
)
!=
nil
{
return
p
.
errorf
(
"field '%s' would overwrite already parsed oneof '%s'"
,
name
,
od
.
Name
())
}
if
fd
.
Cardinality
()
!=
protoreflect
.
Repeated
&&
seen
[
fd
.
Number
()]
{
return
p
.
errorf
(
"non-repeated field %q was repeated"
,
fd
.
Name
())
}
seen
[
fd
.
Number
()]
=
true
// Consume any colon.
if
err
:=
p
.
checkForColon
(
fd
);
err
!=
nil
{
return
err
}
// Parse into the field.
v
:=
m
.
Get
(
fd
)
if
!
m
.
Has
(
fd
)
&&
(
fd
.
IsList
()
||
fd
.
IsMap
()
||
fd
.
Message
()
!=
nil
)
{
v
=
m
.
Mutable
(
fd
)
}
if
v
,
err
=
p
.
unmarshalValue
(
v
,
fd
);
err
!=
nil
{
return
err
}
m
.
Set
(
fd
,
v
)
if
err
:=
p
.
consumeOptionalSeparator
();
err
!=
nil
{
return
err
}
}
return
nil
}
func
(
p
*
textParser
)
unmarshalExtensionOrAny
(
m
protoreflect
.
Message
,
seen
map
[
protoreflect
.
FieldNumber
]
bool
)
error
{
name
,
err
:=
p
.
consumeExtensionOrAnyName
()
if
err
!=
nil
{
return
err
}
// If it contains a slash, it's an Any type URL.
if
slashIdx
:=
strings
.
LastIndex
(
name
,
"/"
);
slashIdx
>=
0
{
tok
:=
p
.
next
()
if
tok
.
err
!=
nil
{
return
tok
.
err
}
// consume an optional colon
if
tok
.
value
==
":"
{
tok
=
p
.
next
()
if
tok
.
err
!=
nil
{
return
tok
.
err
}
}
var
terminator
string
switch
tok
.
value
{
case
"<"
:
terminator
=
">"
case
"{"
:
terminator
=
"}"
default
:
return
p
.
errorf
(
"expected '{' or '<', found %q"
,
tok
.
value
)
}
mt
,
err
:=
protoregistry
.
GlobalTypes
.
FindMessageByURL
(
name
)
if
err
!=
nil
{
return
p
.
errorf
(
"unrecognized message %q in google.protobuf.Any"
,
name
[
slashIdx
+
len
(
"/"
)
:
])
}
m2
:=
mt
.
New
()
if
err
:=
p
.
unmarshalMessage
(
m2
,
terminator
);
err
!=
nil
{
return
err
}
b
,
err
:=
protoV2
.
Marshal
(
m2
.
Interface
())
if
err
!=
nil
{
return
p
.
errorf
(
"failed to marshal message of type %q: %v"
,
name
[
slashIdx
+
len
(
"/"
)
:
],
err
)
}
urlFD
:=
m
.
Descriptor
()
.
Fields
()
.
ByName
(
"type_url"
)
valFD
:=
m
.
Descriptor
()
.
Fields
()
.
ByName
(
"value"
)
if
seen
[
urlFD
.
Number
()]
{
return
p
.
errorf
(
"Any message unpacked multiple times, or %q already set"
,
urlFD
.
Name
())
}
if
seen
[
valFD
.
Number
()]
{
return
p
.
errorf
(
"Any message unpacked multiple times, or %q already set"
,
valFD
.
Name
())
}
m
.
Set
(
urlFD
,
protoreflect
.
ValueOfString
(
name
))
m
.
Set
(
valFD
,
protoreflect
.
ValueOfBytes
(
b
))
seen
[
urlFD
.
Number
()]
=
true
seen
[
valFD
.
Number
()]
=
true
return
nil
}
xname
:=
protoreflect
.
FullName
(
name
)
xt
,
_
:=
protoregistry
.
GlobalTypes
.
FindExtensionByName
(
xname
)
if
xt
==
nil
&&
isMessageSet
(
m
.
Descriptor
())
{
xt
,
_
=
protoregistry
.
GlobalTypes
.
FindExtensionByName
(
xname
.
Append
(
"message_set_extension"
))
}
if
xt
==
nil
{
return
p
.
errorf
(
"unrecognized extension %q"
,
name
)
}
fd
:=
xt
.
TypeDescriptor
()
if
fd
.
ContainingMessage
()
.
FullName
()
!=
m
.
Descriptor
()
.
FullName
()
{
return
p
.
errorf
(
"extension field %q does not extend message %q"
,
name
,
m
.
Descriptor
()
.
FullName
())
}
if
err
:=
p
.
checkForColon
(
fd
);
err
!=
nil
{
return
err
}
v
:=
m
.
Get
(
fd
)
if
!
m
.
Has
(
fd
)
&&
(
fd
.
IsList
()
||
fd
.
IsMap
()
||
fd
.
Message
()
!=
nil
)
{
v
=
m
.
Mutable
(
fd
)
}
v
,
err
=
p
.
unmarshalValue
(
v
,
fd
)
if
err
!=
nil
{
return
err
}
m
.
Set
(
fd
,
v
)
return
p
.
consumeOptionalSeparator
()
}
func
(
p
*
textParser
)
unmarshalValue
(
v
protoreflect
.
Value
,
fd
protoreflect
.
FieldDescriptor
)
(
protoreflect
.
Value
,
error
)
{
tok
:=
p
.
next
()
if
tok
.
err
!=
nil
{
return
v
,
tok
.
err
}
if
tok
.
value
==
""
{
return
v
,
p
.
errorf
(
"unexpected EOF"
)
}
switch
{
case
fd
.
IsList
()
:
lv
:=
v
.
List
()
var
err
error
if
tok
.
value
==
"["
{
// Repeated field with list notation, like [1,2,3].
for
{
vv
:=
lv
.
NewElement
()
vv
,
err
=
p
.
unmarshalSingularValue
(
vv
,
fd
)
if
err
!=
nil
{
return
v
,
err
}
lv
.
Append
(
vv
)
tok
:=
p
.
next
()
if
tok
.
err
!=
nil
{
return
v
,
tok
.
err
}
if
tok
.
value
==
"]"
{
break
}
if
tok
.
value
!=
","
{
return
v
,
p
.
errorf
(
"Expected ']' or ',' found %q"
,
tok
.
value
)
}
}
return
v
,
nil
}
// One value of the repeated field.
p
.
back
()
vv
:=
lv
.
NewElement
()
vv
,
err
=
p
.
unmarshalSingularValue
(
vv
,
fd
)
if
err
!=
nil
{
return
v
,
err
}
lv
.
Append
(
vv
)
return
v
,
nil
case
fd
.
IsMap
()
:
// The map entry should be this sequence of tokens:
// < key : KEY value : VALUE >
// However, implementations may omit key or value, and technically
// we should support them in any order.
var
terminator
string
switch
tok
.
value
{
case
"<"
:
terminator
=
">"
case
"{"
:
terminator
=
"}"
default
:
return
v
,
p
.
errorf
(
"expected '{' or '<', found %q"
,
tok
.
value
)
}
keyFD
:=
fd
.
MapKey
()
valFD
:=
fd
.
MapValue
()
mv
:=
v
.
Map
()
kv
:=
keyFD
.
Default
()
vv
:=
mv
.
NewValue
()
for
{
tok
:=
p
.
next
()
if
tok
.
err
!=
nil
{
return
v
,
tok
.
err
}
if
tok
.
value
==
terminator
{
break
}
var
err
error
switch
tok
.
value
{
case
"key"
:
if
err
:=
p
.
consumeToken
(
":"
);
err
!=
nil
{
return
v
,
err
}
if
kv
,
err
=
p
.
unmarshalSingularValue
(
kv
,
keyFD
);
err
!=
nil
{
return
v
,
err
}
if
err
:=
p
.
consumeOptionalSeparator
();
err
!=
nil
{
return
v
,
err
}
case
"value"
:
if
err
:=
p
.
checkForColon
(
valFD
);
err
!=
nil
{
return
v
,
err
}
if
vv
,
err
=
p
.
unmarshalSingularValue
(
vv
,
valFD
);
err
!=
nil
{
return
v
,
err
}
if
err
:=
p
.
consumeOptionalSeparator
();
err
!=
nil
{
return
v
,
err
}
default
:
p
.
back
()
return
v
,
p
.
errorf
(
`expected "key", "value", or %q, found %q`
,
terminator
,
tok
.
value
)
}
}
mv
.
Set
(
kv
.
MapKey
(),
vv
)
return
v
,
nil
default
:
p
.
back
()
return
p
.
unmarshalSingularValue
(
v
,
fd
)
}
}
func
(
p
*
textParser
)
unmarshalSingularValue
(
v
protoreflect
.
Value
,
fd
protoreflect
.
FieldDescriptor
)
(
protoreflect
.
Value
,
error
)
{
tok
:=
p
.
next
()
if
tok
.
err
!=
nil
{
return
v
,
tok
.
err
}
if
tok
.
value
==
""
{
return
v
,
p
.
errorf
(
"unexpected EOF"
)
}
switch
fd
.
Kind
()
{
case
protoreflect
.
BoolKind
:
switch
tok
.
value
{
case
"true"
,
"1"
,
"t"
,
"True"
:
return
protoreflect
.
ValueOfBool
(
true
),
nil
case
"false"
,
"0"
,
"f"
,
"False"
:
return
protoreflect
.
ValueOfBool
(
false
),
nil
}
case
protoreflect
.
Int32Kind
,
protoreflect
.
Sint32Kind
,
protoreflect
.
Sfixed32Kind
:
if
x
,
err
:=
strconv
.
ParseInt
(
tok
.
value
,
0
,
32
);
err
==
nil
{
return
protoreflect
.
ValueOfInt32
(
int32
(
x
)),
nil
}
// The C++ parser accepts large positive hex numbers that uses
// two's complement arithmetic to represent negative numbers.
// This feature is here for backwards compatibility with C++.
if
strings
.
HasPrefix
(
tok
.
value
,
"0x"
)
{
if
x
,
err
:=
strconv
.
ParseUint
(
tok
.
value
,
0
,
32
);
err
==
nil
{
return
protoreflect
.
ValueOfInt32
(
int32
(
-
(
int64
(
^
x
)
+
1
))),
nil
}
}
case
protoreflect
.
Int64Kind
,
protoreflect
.
Sint64Kind
,
protoreflect
.
Sfixed64Kind
:
if
x
,
err
:=
strconv
.
ParseInt
(
tok
.
value
,
0
,
64
);
err
==
nil
{
return
protoreflect
.
ValueOfInt64
(
int64
(
x
)),
nil
}
// The C++ parser accepts large positive hex numbers that uses
// two's complement arithmetic to represent negative numbers.
// This feature is here for backwards compatibility with C++.
if
strings
.
HasPrefix
(
tok
.
value
,
"0x"
)
{
if
x
,
err
:=
strconv
.
ParseUint
(
tok
.
value
,
0
,
64
);
err
==
nil
{
return
protoreflect
.
ValueOfInt64
(
int64
(
-
(
int64
(
^
x
)
+
1
))),
nil
}
}
case
protoreflect
.
Uint32Kind
,
protoreflect
.
Fixed32Kind
:
if
x
,
err
:=
strconv
.
ParseUint
(
tok
.
value
,
0
,
32
);
err
==
nil
{
return
protoreflect
.
ValueOfUint32
(
uint32
(
x
)),
nil
}
case
protoreflect
.
Uint64Kind
,
protoreflect
.
Fixed64Kind
:
if
x
,
err
:=
strconv
.
ParseUint
(
tok
.
value
,
0
,
64
);
err
==
nil
{
return
protoreflect
.
ValueOfUint64
(
uint64
(
x
)),
nil
}
case
protoreflect
.
FloatKind
:
// Ignore 'f' for compatibility with output generated by C++,
// but don't remove 'f' when the value is "-inf" or "inf".
v
:=
tok
.
value
if
strings
.
HasSuffix
(
v
,
"f"
)
&&
v
!=
"-inf"
&&
v
!=
"inf"
{
v
=
v
[
:
len
(
v
)
-
len
(
"f"
)]
}
if
x
,
err
:=
strconv
.
ParseFloat
(
v
,
32
);
err
==
nil
{
return
protoreflect
.
ValueOfFloat32
(
float32
(
x
)),
nil
}
case
protoreflect
.
DoubleKind
:
// Ignore 'f' for compatibility with output generated by C++,
// but don't remove 'f' when the value is "-inf" or "inf".
v
:=
tok
.
value
if
strings
.
HasSuffix
(
v
,
"f"
)
&&
v
!=
"-inf"
&&
v
!=
"inf"
{
v
=
v
[
:
len
(
v
)
-
len
(
"f"
)]
}
if
x
,
err
:=
strconv
.
ParseFloat
(
v
,
64
);
err
==
nil
{
return
protoreflect
.
ValueOfFloat64
(
float64
(
x
)),
nil
}
case
protoreflect
.
StringKind
:
if
isQuote
(
tok
.
value
[
0
])
{
return
protoreflect
.
ValueOfString
(
tok
.
unquoted
),
nil
}
case
protoreflect
.
BytesKind
:
if
isQuote
(
tok
.
value
[
0
])
{
return
protoreflect
.
ValueOfBytes
([]
byte
(
tok
.
unquoted
)),
nil
}
case
protoreflect
.
EnumKind
:
if
x
,
err
:=
strconv
.
ParseInt
(
tok
.
value
,
0
,
32
);
err
==
nil
{
return
protoreflect
.
ValueOfEnum
(
protoreflect
.
EnumNumber
(
x
)),
nil
}
vd
:=
fd
.
Enum
()
.
Values
()
.
ByName
(
protoreflect
.
Name
(
tok
.
value
))
if
vd
!=
nil
{
return
protoreflect
.
ValueOfEnum
(
vd
.
Number
()),
nil
}
case
protoreflect
.
MessageKind
,
protoreflect
.
GroupKind
:
var
terminator
string
switch
tok
.
value
{
case
"{"
:
terminator
=
"}"
case
"<"
:
terminator
=
">"
default
:
return
v
,
p
.
errorf
(
"expected '{' or '<', found %q"
,
tok
.
value
)
}
err
:=
p
.
unmarshalMessage
(
v
.
Message
(),
terminator
)
return
v
,
err
default
:
panic
(
fmt
.
Sprintf
(
"invalid kind %v"
,
fd
.
Kind
()))
}
return
v
,
p
.
errorf
(
"invalid %v: %v"
,
fd
.
Kind
(),
tok
.
value
)
}
// Consume a ':' from the input stream (if the next token is a colon),
// returning an error if a colon is needed but not present.
func
(
p
*
textParser
)
checkForColon
(
fd
protoreflect
.
FieldDescriptor
)
*
ParseError
{
tok
:=
p
.
next
()
if
tok
.
err
!=
nil
{
return
tok
.
err
}
if
tok
.
value
!=
":"
{
if
fd
.
Message
()
==
nil
{
return
p
.
errorf
(
"expected ':', found %q"
,
tok
.
value
)
}
p
.
back
()
}
return
nil
}
// consumeExtensionOrAnyName consumes an extension name or an Any type URL and
// the following ']'. It returns the name or URL consumed.
func
(
p
*
textParser
)
consumeExtensionOrAnyName
()
(
string
,
error
)
{
tok
:=
p
.
next
()
if
tok
.
err
!=
nil
{
return
""
,
tok
.
err
}
// If extension name or type url is quoted, it's a single token.
if
len
(
tok
.
value
)
>
2
&&
isQuote
(
tok
.
value
[
0
])
&&
tok
.
value
[
len
(
tok
.
value
)
-
1
]
==
tok
.
value
[
0
]
{
name
,
err
:=
unquoteC
(
tok
.
value
[
1
:
len
(
tok
.
value
)
-
1
],
rune
(
tok
.
value
[
0
]))
if
err
!=
nil
{
return
""
,
err
}
return
name
,
p
.
consumeToken
(
"]"
)
}
// Consume everything up to "]"
var
parts
[]
string
for
tok
.
value
!=
"]"
{
parts
=
append
(
parts
,
tok
.
value
)
tok
=
p
.
next
()
if
tok
.
err
!=
nil
{
return
""
,
p
.
errorf
(
"unrecognized type_url or extension name: %s"
,
tok
.
err
)
}
if
p
.
done
&&
tok
.
value
!=
"]"
{
return
""
,
p
.
errorf
(
"unclosed type_url or extension name"
)
}
}
return
strings
.
Join
(
parts
,
""
),
nil
}
// consumeOptionalSeparator consumes an optional semicolon or comma.
// It is used in unmarshalMessage to provide backward compatibility.
func
(
p
*
textParser
)
consumeOptionalSeparator
()
error
{
tok
:=
p
.
next
()
if
tok
.
err
!=
nil
{
return
tok
.
err
}
if
tok
.
value
!=
";"
&&
tok
.
value
!=
","
{
p
.
back
()
}
return
nil
}
func
(
p
*
textParser
)
errorf
(
format
string
,
a
...
interface
{})
*
ParseError
{
pe
:=
&
ParseError
{
fmt
.
Sprintf
(
format
,
a
...
),
p
.
cur
.
line
,
p
.
cur
.
offset
}
p
.
cur
.
err
=
pe
p
.
done
=
true
return
pe
}
func
(
p
*
textParser
)
skipWhitespace
()
{
i
:=
0
for
i
<
len
(
p
.
s
)
&&
(
isWhitespace
(
p
.
s
[
i
])
||
p
.
s
[
i
]
==
'#'
)
{
if
p
.
s
[
i
]
==
'#'
{
// comment; skip to end of line or input
for
i
<
len
(
p
.
s
)
&&
p
.
s
[
i
]
!=
'\n'
{
i
++
}
if
i
==
len
(
p
.
s
)
{
break
}
}
if
p
.
s
[
i
]
==
'\n'
{
p
.
line
++
}
i
++
}
p
.
offset
+=
i
p
.
s
=
p
.
s
[
i
:
len
(
p
.
s
)]
if
len
(
p
.
s
)
==
0
{
p
.
done
=
true
}
}
func
(
p
*
textParser
)
advance
()
{
// Skip whitespace
p
.
skipWhitespace
()
if
p
.
done
{
return
}
// Start of non-whitespace
p
.
cur
.
err
=
nil
p
.
cur
.
offset
,
p
.
cur
.
line
=
p
.
offset
,
p
.
line
p
.
cur
.
unquoted
=
""
switch
p
.
s
[
0
]
{
case
'<'
,
'>'
,
'{'
,
'}'
,
':'
,
'['
,
']'
,
';'
,
','
,
'/'
:
// Single symbol
p
.
cur
.
value
,
p
.
s
=
p
.
s
[
0
:
1
],
p
.
s
[
1
:
len
(
p
.
s
)]
case
'"'
,
'\'
'
:
// Quoted string
i
:=
1
for
i
<
len
(
p
.
s
)
&&
p
.
s
[
i
]
!=
p
.
s
[
0
]
&&
p
.
s
[
i
]
!=
'\n'
{
if
p
.
s
[
i
]
==
'\\'
&&
i
+
1
<
len
(
p
.
s
)
{
// skip escaped char
i
++
}
i
++
}
if
i
>=
len
(
p
.
s
)
||
p
.
s
[
i
]
!=
p
.
s
[
0
]
{
p
.
errorf
(
"unmatched quote"
)
return
}
unq
,
err
:=
unquoteC
(
p
.
s
[
1
:
i
],
rune
(
p
.
s
[
0
]))
if
err
!=
nil
{
p
.
errorf
(
"invalid quoted string %s: %v"
,
p
.
s
[
0
:
i
+
1
],
err
)
return
}
p
.
cur
.
value
,
p
.
s
=
p
.
s
[
0
:
i
+
1
],
p
.
s
[
i
+
1
:
len
(
p
.
s
)]
p
.
cur
.
unquoted
=
unq
default
:
i
:=
0
for
i
<
len
(
p
.
s
)
&&
isIdentOrNumberChar
(
p
.
s
[
i
])
{
i
++
}
if
i
==
0
{
p
.
errorf
(
"unexpected byte %#x"
,
p
.
s
[
0
])
return
}
p
.
cur
.
value
,
p
.
s
=
p
.
s
[
0
:
i
],
p
.
s
[
i
:
len
(
p
.
s
)]
}
p
.
offset
+=
len
(
p
.
cur
.
value
)
}
// Back off the parser by one token. Can only be done between calls to next().
// It makes the next advance() a no-op.
func
(
p
*
textParser
)
back
()
{
p
.
backed
=
true
}
// Advances the parser and returns the new current token.
func
(
p
*
textParser
)
next
()
*
token
{
if
p
.
backed
||
p
.
done
{
p
.
backed
=
false
return
&
p
.
cur
}
p
.
advance
()
if
p
.
done
{
p
.
cur
.
value
=
""
}
else
if
len
(
p
.
cur
.
value
)
>
0
&&
isQuote
(
p
.
cur
.
value
[
0
])
{
// Look for multiple quoted strings separated by whitespace,
// and concatenate them.
cat
:=
p
.
cur
for
{
p
.
skipWhitespace
()
if
p
.
done
||
!
isQuote
(
p
.
s
[
0
])
{
break
}
p
.
advance
()
if
p
.
cur
.
err
!=
nil
{
return
&
p
.
cur
}
cat
.
value
+=
" "
+
p
.
cur
.
value
cat
.
unquoted
+=
p
.
cur
.
unquoted
}
p
.
done
=
false
// parser may have seen EOF, but we want to return cat
p
.
cur
=
cat
}
return
&
p
.
cur
}
func
(
p
*
textParser
)
consumeToken
(
s
string
)
error
{
tok
:=
p
.
next
()
if
tok
.
err
!=
nil
{
return
tok
.
err
}
if
tok
.
value
!=
s
{
p
.
back
()
return
p
.
errorf
(
"expected %q, found %q"
,
s
,
tok
.
value
)
}
return
nil
}
var
errBadUTF8
=
errors
.
New
(
"proto: bad UTF-8"
)
func
unquoteC
(
s
string
,
quote
rune
)
(
string
,
error
)
{
// This is based on C++'s tokenizer.cc.
// Despite its name, this is *not* parsing C syntax.
// For instance, "\0" is an invalid quoted string.
// Avoid allocation in trivial cases.
simple
:=
true
for
_
,
r
:=
range
s
{
if
r
==
'\\'
||
r
==
quote
{
simple
=
false
break
}
}
if
simple
{
return
s
,
nil
}
buf
:=
make
([]
byte
,
0
,
3
*
len
(
s
)
/
2
)
for
len
(
s
)
>
0
{
r
,
n
:=
utf8
.
DecodeRuneInString
(
s
)
if
r
==
utf8
.
RuneError
&&
n
==
1
{
return
""
,
errBadUTF8
}
s
=
s
[
n
:
]
if
r
!=
'\\'
{
if
r
<
utf8
.
RuneSelf
{
buf
=
append
(
buf
,
byte
(
r
))
}
else
{
buf
=
append
(
buf
,
string
(
r
)
...
)
}
continue
}
ch
,
tail
,
err
:=
unescape
(
s
)
if
err
!=
nil
{
return
""
,
err
}
buf
=
append
(
buf
,
ch
...
)
s
=
tail
}
return
string
(
buf
),
nil
}
func
unescape
(
s
string
)
(
ch
string
,
tail
string
,
err
error
)
{
r
,
n
:=
utf8
.
DecodeRuneInString
(
s
)
if
r
==
utf8
.
RuneError
&&
n
==
1
{
return
""
,
""
,
errBadUTF8
}
s
=
s
[
n
:
]
switch
r
{
case
'a'
:
return
"
\a
"
,
s
,
nil
case
'b'
:
return
"
\b
"
,
s
,
nil
case
'f'
:
return
"
\f
"
,
s
,
nil
case
'n'
:
return
"
\n
"
,
s
,
nil
case
'r'
:
return
"
\r
"
,
s
,
nil
case
't'
:
return
"
\t
"
,
s
,
nil
case
'v'
:
return
"
\v
"
,
s
,
nil
case
'?'
:
return
"?"
,
s
,
nil
// trigraph workaround
case
'\'
'
,
'"'
,
'\\'
:
return
string
(
r
),
s
,
nil
case
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
:
if
len
(
s
)
<
2
{
return
""
,
""
,
fmt
.
Errorf
(
`\%c requires 2 following digits`
,
r
)
}
ss
:=
string
(
r
)
+
s
[
:
2
]
s
=
s
[
2
:
]
i
,
err
:=
strconv
.
ParseUint
(
ss
,
8
,
8
)
if
err
!=
nil
{
return
""
,
""
,
fmt
.
Errorf
(
`\%s contains non-octal digits`
,
ss
)
}
return
string
([]
byte
{
byte
(
i
)}),
s
,
nil
case
'x'
,
'X'
,
'u'
,
'U'
:
var
n
int
switch
r
{
case
'x'
,
'X'
:
n
=
2
case
'u'
:
n
=
4
case
'U'
:
n
=
8
}
if
len
(
s
)
<
n
{
return
""
,
""
,
fmt
.
Errorf
(
`\%c requires %d following digits`
,
r
,
n
)
}
ss
:=
s
[
:
n
]
s
=
s
[
n
:
]
i
,
err
:=
strconv
.
ParseUint
(
ss
,
16
,
64
)
if
err
!=
nil
{
return
""
,
""
,
fmt
.
Errorf
(
`\%c%s contains non-hexadecimal digits`
,
r
,
ss
)
}
if
r
==
'x'
||
r
==
'X'
{
return
string
([]
byte
{
byte
(
i
)}),
s
,
nil
}
if
i
>
utf8
.
MaxRune
{
return
""
,
""
,
fmt
.
Errorf
(
`\%c%s is not a valid Unicode code point`
,
r
,
ss
)
}
return
string
(
i
),
s
,
nil
}
return
""
,
""
,
fmt
.
Errorf
(
`unknown escape \%c`
,
r
)
}
func
isIdentOrNumberChar
(
c
byte
)
bool
{
switch
{
case
'A'
<=
c
&&
c
<=
'Z'
,
'a'
<=
c
&&
c
<=
'z'
:
return
true
case
'0'
<=
c
&&
c
<=
'9'
:
return
true
}
switch
c
{
case
'-'
,
'+'
,
'.'
,
'_'
:
return
true
}
return
false
}
func
isWhitespace
(
c
byte
)
bool
{
switch
c
{
case
' '
,
'\t'
,
'\n'
,
'\r'
:
return
true
}
return
false
}
func
isQuote
(
c
byte
)
bool
{
switch
c
{
case
'"'
,
'\'
'
:
return
true
}
return
false
}
vendor/github.com/golang/protobuf/proto/text_encode.go
0 → 100644
View file @
8a683270
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
import
(
"bytes"
"encoding"
"fmt"
"io"
"math"
"sort"
"strings"
"google.golang.org/protobuf/encoding/prototext"
"google.golang.org/protobuf/encoding/protowire"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
)
const
wrapTextMarshalV2
=
false
// TextMarshaler is a configurable text format marshaler.
type
TextMarshaler
struct
{
Compact
bool
// use compact text format (one line)
ExpandAny
bool
// expand google.protobuf.Any messages of known types
}
// Marshal writes the proto text format of m to w.
func
(
tm
*
TextMarshaler
)
Marshal
(
w
io
.
Writer
,
m
Message
)
error
{
b
,
err
:=
tm
.
marshal
(
m
)
if
len
(
b
)
>
0
{
if
_
,
err
:=
w
.
Write
(
b
);
err
!=
nil
{
return
err
}
}
return
err
}
// Text returns a proto text formatted string of m.
func
(
tm
*
TextMarshaler
)
Text
(
m
Message
)
string
{
b
,
_
:=
tm
.
marshal
(
m
)
return
string
(
b
)
}
func
(
tm
*
TextMarshaler
)
marshal
(
m
Message
)
([]
byte
,
error
)
{
mr
:=
MessageReflect
(
m
)
if
mr
==
nil
||
!
mr
.
IsValid
()
{
return
[]
byte
(
"<nil>"
),
nil
}
if
wrapTextMarshalV2
{
if
m
,
ok
:=
m
.
(
encoding
.
TextMarshaler
);
ok
{
return
m
.
MarshalText
()
}
opts
:=
prototext
.
MarshalOptions
{
AllowPartial
:
true
,
EmitUnknown
:
true
,
}
if
!
tm
.
Compact
{
opts
.
Indent
=
" "
}
if
!
tm
.
ExpandAny
{
opts
.
Resolver
=
(
*
protoregistry
.
Types
)(
nil
)
}
return
opts
.
Marshal
(
mr
.
Interface
())
}
else
{
w
:=
&
textWriter
{
compact
:
tm
.
Compact
,
expandAny
:
tm
.
ExpandAny
,
complete
:
true
,
}
if
m
,
ok
:=
m
.
(
encoding
.
TextMarshaler
);
ok
{
b
,
err
:=
m
.
MarshalText
()
if
err
!=
nil
{
return
nil
,
err
}
w
.
Write
(
b
)
return
w
.
buf
,
nil
}
err
:=
w
.
writeMessage
(
mr
)
return
w
.
buf
,
err
}
}
var
(
defaultTextMarshaler
=
TextMarshaler
{}
compactTextMarshaler
=
TextMarshaler
{
Compact
:
true
}
)
// MarshalText writes the proto text format of m to w.
func
MarshalText
(
w
io
.
Writer
,
m
Message
)
error
{
return
defaultTextMarshaler
.
Marshal
(
w
,
m
)
}
// MarshalTextString returns a proto text formatted string of m.
func
MarshalTextString
(
m
Message
)
string
{
return
defaultTextMarshaler
.
Text
(
m
)
}
// CompactText writes the compact proto text format of m to w.
func
CompactText
(
w
io
.
Writer
,
m
Message
)
error
{
return
compactTextMarshaler
.
Marshal
(
w
,
m
)
}
// CompactTextString returns a compact proto text formatted string of m.
func
CompactTextString
(
m
Message
)
string
{
return
compactTextMarshaler
.
Text
(
m
)
}
var
(
newline
=
[]
byte
(
"
\n
"
)
endBraceNewline
=
[]
byte
(
"}
\n
"
)
posInf
=
[]
byte
(
"inf"
)
negInf
=
[]
byte
(
"-inf"
)
nan
=
[]
byte
(
"nan"
)
)
// textWriter is an io.Writer that tracks its indentation level.
type
textWriter
struct
{
compact
bool
// same as TextMarshaler.Compact
expandAny
bool
// same as TextMarshaler.ExpandAny
complete
bool
// whether the current position is a complete line
indent
int
// indentation level; never negative
buf
[]
byte
}
func
(
w
*
textWriter
)
Write
(
p
[]
byte
)
(
n
int
,
_
error
)
{
newlines
:=
bytes
.
Count
(
p
,
newline
)
if
newlines
==
0
{
if
!
w
.
compact
&&
w
.
complete
{
w
.
writeIndent
()
}
w
.
buf
=
append
(
w
.
buf
,
p
...
)
w
.
complete
=
false
return
len
(
p
),
nil
}
frags
:=
bytes
.
SplitN
(
p
,
newline
,
newlines
+
1
)
if
w
.
compact
{
for
i
,
frag
:=
range
frags
{
if
i
>
0
{
w
.
buf
=
append
(
w
.
buf
,
' '
)
n
++
}
w
.
buf
=
append
(
w
.
buf
,
frag
...
)
n
+=
len
(
frag
)
}
return
n
,
nil
}
for
i
,
frag
:=
range
frags
{
if
w
.
complete
{
w
.
writeIndent
()
}
w
.
buf
=
append
(
w
.
buf
,
frag
...
)
n
+=
len
(
frag
)
if
i
+
1
<
len
(
frags
)
{
w
.
buf
=
append
(
w
.
buf
,
'\n'
)
n
++
}
}
w
.
complete
=
len
(
frags
[
len
(
frags
)
-
1
])
==
0
return
n
,
nil
}
func
(
w
*
textWriter
)
WriteByte
(
c
byte
)
error
{
if
w
.
compact
&&
c
==
'\n'
{
c
=
' '
}
if
!
w
.
compact
&&
w
.
complete
{
w
.
writeIndent
()
}
w
.
buf
=
append
(
w
.
buf
,
c
)
w
.
complete
=
c
==
'\n'
return
nil
}
func
(
w
*
textWriter
)
writeName
(
fd
protoreflect
.
FieldDescriptor
)
{
if
!
w
.
compact
&&
w
.
complete
{
w
.
writeIndent
()
}
w
.
complete
=
false
if
fd
.
Kind
()
!=
protoreflect
.
GroupKind
{
w
.
buf
=
append
(
w
.
buf
,
fd
.
Name
()
...
)
w
.
WriteByte
(
':'
)
}
else
{
// Use message type name for group field name.
w
.
buf
=
append
(
w
.
buf
,
fd
.
Message
()
.
Name
()
...
)
}
if
!
w
.
compact
{
w
.
WriteByte
(
' '
)
}
}
func
requiresQuotes
(
u
string
)
bool
{
// When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted.
for
_
,
ch
:=
range
u
{
switch
{
case
ch
==
'.'
||
ch
==
'/'
||
ch
==
'_'
:
continue
case
'0'
<=
ch
&&
ch
<=
'9'
:
continue
case
'A'
<=
ch
&&
ch
<=
'Z'
:
continue
case
'a'
<=
ch
&&
ch
<=
'z'
:
continue
default
:
return
true
}
}
return
false
}
// writeProto3Any writes an expanded google.protobuf.Any message.
//
// It returns (false, nil) if sv value can't be unmarshaled (e.g. because
// required messages are not linked in).
//
// It returns (true, error) when sv was written in expanded format or an error
// was encountered.
func
(
w
*
textWriter
)
writeProto3Any
(
m
protoreflect
.
Message
)
(
bool
,
error
)
{
md
:=
m
.
Descriptor
()
fdURL
:=
md
.
Fields
()
.
ByName
(
"type_url"
)
fdVal
:=
md
.
Fields
()
.
ByName
(
"value"
)
url
:=
m
.
Get
(
fdURL
)
.
String
()
mt
,
err
:=
protoregistry
.
GlobalTypes
.
FindMessageByURL
(
url
)
if
err
!=
nil
{
return
false
,
nil
}
b
:=
m
.
Get
(
fdVal
)
.
Bytes
()
m2
:=
mt
.
New
()
if
err
:=
proto
.
Unmarshal
(
b
,
m2
.
Interface
());
err
!=
nil
{
return
false
,
nil
}
w
.
Write
([]
byte
(
"["
))
if
requiresQuotes
(
url
)
{
w
.
writeQuotedString
(
url
)
}
else
{
w
.
Write
([]
byte
(
url
))
}
if
w
.
compact
{
w
.
Write
([]
byte
(
"]:<"
))
}
else
{
w
.
Write
([]
byte
(
"]: <
\n
"
))
w
.
indent
++
}
if
err
:=
w
.
writeMessage
(
m2
);
err
!=
nil
{
return
true
,
err
}
if
w
.
compact
{
w
.
Write
([]
byte
(
"> "
))
}
else
{
w
.
indent
--
w
.
Write
([]
byte
(
">
\n
"
))
}
return
true
,
nil
}
func
(
w
*
textWriter
)
writeMessage
(
m
protoreflect
.
Message
)
error
{
md
:=
m
.
Descriptor
()
if
w
.
expandAny
&&
md
.
FullName
()
==
"google.protobuf.Any"
{
if
canExpand
,
err
:=
w
.
writeProto3Any
(
m
);
canExpand
{
return
err
}
}
fds
:=
md
.
Fields
()
for
i
:=
0
;
i
<
fds
.
Len
();
{
fd
:=
fds
.
Get
(
i
)
if
od
:=
fd
.
ContainingOneof
();
od
!=
nil
{
fd
=
m
.
WhichOneof
(
od
)
i
+=
od
.
Fields
()
.
Len
()
}
else
{
i
++
}
if
fd
==
nil
||
!
m
.
Has
(
fd
)
{
continue
}
switch
{
case
fd
.
IsList
()
:
lv
:=
m
.
Get
(
fd
)
.
List
()
for
j
:=
0
;
j
<
lv
.
Len
();
j
++
{
w
.
writeName
(
fd
)
v
:=
lv
.
Get
(
j
)
if
err
:=
w
.
writeSingularValue
(
v
,
fd
);
err
!=
nil
{
return
err
}
w
.
WriteByte
(
'\n'
)
}
case
fd
.
IsMap
()
:
kfd
:=
fd
.
MapKey
()
vfd
:=
fd
.
MapValue
()
mv
:=
m
.
Get
(
fd
)
.
Map
()
type
entry
struct
{
key
,
val
protoreflect
.
Value
}
var
entries
[]
entry
mv
.
Range
(
func
(
k
protoreflect
.
MapKey
,
v
protoreflect
.
Value
)
bool
{
entries
=
append
(
entries
,
entry
{
k
.
Value
(),
v
})
return
true
})
sort
.
Slice
(
entries
,
func
(
i
,
j
int
)
bool
{
switch
kfd
.
Kind
()
{
case
protoreflect
.
BoolKind
:
return
!
entries
[
i
]
.
key
.
Bool
()
&&
entries
[
j
]
.
key
.
Bool
()
case
protoreflect
.
Int32Kind
,
protoreflect
.
Sint32Kind
,
protoreflect
.
Sfixed32Kind
,
protoreflect
.
Int64Kind
,
protoreflect
.
Sint64Kind
,
protoreflect
.
Sfixed64Kind
:
return
entries
[
i
]
.
key
.
Int
()
<
entries
[
j
]
.
key
.
Int
()
case
protoreflect
.
Uint32Kind
,
protoreflect
.
Fixed32Kind
,
protoreflect
.
Uint64Kind
,
protoreflect
.
Fixed64Kind
:
return
entries
[
i
]
.
key
.
Uint
()
<
entries
[
j
]
.
key
.
Uint
()
case
protoreflect
.
StringKind
:
return
entries
[
i
]
.
key
.
String
()
<
entries
[
j
]
.
key
.
String
()
default
:
panic
(
"invalid kind"
)
}
})
for
_
,
entry
:=
range
entries
{
w
.
writeName
(
fd
)
w
.
WriteByte
(
'<'
)
if
!
w
.
compact
{
w
.
WriteByte
(
'\n'
)
}
w
.
indent
++
w
.
writeName
(
kfd
)
if
err
:=
w
.
writeSingularValue
(
entry
.
key
,
kfd
);
err
!=
nil
{
return
err
}
w
.
WriteByte
(
'\n'
)
w
.
writeName
(
vfd
)
if
err
:=
w
.
writeSingularValue
(
entry
.
val
,
vfd
);
err
!=
nil
{
return
err
}
w
.
WriteByte
(
'\n'
)
w
.
indent
--
w
.
WriteByte
(
'>'
)
w
.
WriteByte
(
'\n'
)
}
default
:
w
.
writeName
(
fd
)
if
err
:=
w
.
writeSingularValue
(
m
.
Get
(
fd
),
fd
);
err
!=
nil
{
return
err
}
w
.
WriteByte
(
'\n'
)
}
}
if
b
:=
m
.
GetUnknown
();
len
(
b
)
>
0
{
w
.
writeUnknownFields
(
b
)
}
return
w
.
writeExtensions
(
m
)
}
func
(
w
*
textWriter
)
writeSingularValue
(
v
protoreflect
.
Value
,
fd
protoreflect
.
FieldDescriptor
)
error
{
switch
fd
.
Kind
()
{
case
protoreflect
.
FloatKind
,
protoreflect
.
DoubleKind
:
switch
vf
:=
v
.
Float
();
{
case
math
.
IsInf
(
vf
,
+
1
)
:
w
.
Write
(
posInf
)
case
math
.
IsInf
(
vf
,
-
1
)
:
w
.
Write
(
negInf
)
case
math
.
IsNaN
(
vf
)
:
w
.
Write
(
nan
)
default
:
fmt
.
Fprint
(
w
,
v
.
Interface
())
}
case
protoreflect
.
StringKind
:
// NOTE: This does not validate UTF-8 for historical reasons.
w
.
writeQuotedString
(
string
(
v
.
String
()))
case
protoreflect
.
BytesKind
:
w
.
writeQuotedString
(
string
(
v
.
Bytes
()))
case
protoreflect
.
MessageKind
,
protoreflect
.
GroupKind
:
var
bra
,
ket
byte
=
'<'
,
'>'
if
fd
.
Kind
()
==
protoreflect
.
GroupKind
{
bra
,
ket
=
'{'
,
'}'
}
w
.
WriteByte
(
bra
)
if
!
w
.
compact
{
w
.
WriteByte
(
'\n'
)
}
w
.
indent
++
m
:=
v
.
Message
()
if
m2
,
ok
:=
m
.
Interface
()
.
(
encoding
.
TextMarshaler
);
ok
{
b
,
err
:=
m2
.
MarshalText
()
if
err
!=
nil
{
return
err
}
w
.
Write
(
b
)
}
else
{
w
.
writeMessage
(
m
)
}
w
.
indent
--
w
.
WriteByte
(
ket
)
case
protoreflect
.
EnumKind
:
if
ev
:=
fd
.
Enum
()
.
Values
()
.
ByNumber
(
v
.
Enum
());
ev
!=
nil
{
fmt
.
Fprint
(
w
,
ev
.
Name
())
}
else
{
fmt
.
Fprint
(
w
,
v
.
Enum
())
}
default
:
fmt
.
Fprint
(
w
,
v
.
Interface
())
}
return
nil
}
// writeQuotedString writes a quoted string in the protocol buffer text format.
func
(
w
*
textWriter
)
writeQuotedString
(
s
string
)
{
w
.
WriteByte
(
'"'
)
for
i
:=
0
;
i
<
len
(
s
);
i
++
{
switch
c
:=
s
[
i
];
c
{
case
'\n'
:
w
.
buf
=
append
(
w
.
buf
,
`\n`
...
)
case
'\r'
:
w
.
buf
=
append
(
w
.
buf
,
`\r`
...
)
case
'\t'
:
w
.
buf
=
append
(
w
.
buf
,
`\t`
...
)
case
'"'
:
w
.
buf
=
append
(
w
.
buf
,
`\"`
...
)
case
'\\'
:
w
.
buf
=
append
(
w
.
buf
,
`\\`
...
)
default
:
if
isPrint
:=
c
>=
0x20
&&
c
<
0x7f
;
isPrint
{
w
.
buf
=
append
(
w
.
buf
,
c
)
}
else
{
w
.
buf
=
append
(
w
.
buf
,
fmt
.
Sprintf
(
`\%03o`
,
c
)
...
)
}
}
}
w
.
WriteByte
(
'"'
)
}
func
(
w
*
textWriter
)
writeUnknownFields
(
b
[]
byte
)
{
if
!
w
.
compact
{
fmt
.
Fprintf
(
w
,
"/* %d unknown bytes */
\n
"
,
len
(
b
))
}
for
len
(
b
)
>
0
{
num
,
wtyp
,
n
:=
protowire
.
ConsumeTag
(
b
)
if
n
<
0
{
return
}
b
=
b
[
n
:
]
if
wtyp
==
protowire
.
EndGroupType
{
w
.
indent
--
w
.
Write
(
endBraceNewline
)
continue
}
fmt
.
Fprint
(
w
,
num
)
if
wtyp
!=
protowire
.
StartGroupType
{
w
.
WriteByte
(
':'
)
}
if
!
w
.
compact
||
wtyp
==
protowire
.
StartGroupType
{
w
.
WriteByte
(
' '
)
}
switch
wtyp
{
case
protowire
.
VarintType
:
v
,
n
:=
protowire
.
ConsumeVarint
(
b
)
if
n
<
0
{
return
}
b
=
b
[
n
:
]
fmt
.
Fprint
(
w
,
v
)
case
protowire
.
Fixed32Type
:
v
,
n
:=
protowire
.
ConsumeFixed32
(
b
)
if
n
<
0
{
return
}
b
=
b
[
n
:
]
fmt
.
Fprint
(
w
,
v
)
case
protowire
.
Fixed64Type
:
v
,
n
:=
protowire
.
ConsumeFixed64
(
b
)
if
n
<
0
{
return
}
b
=
b
[
n
:
]
fmt
.
Fprint
(
w
,
v
)
case
protowire
.
BytesType
:
v
,
n
:=
protowire
.
ConsumeBytes
(
b
)
if
n
<
0
{
return
}
b
=
b
[
n
:
]
fmt
.
Fprintf
(
w
,
"%q"
,
v
)
case
protowire
.
StartGroupType
:
w
.
WriteByte
(
'{'
)
w
.
indent
++
default
:
fmt
.
Fprintf
(
w
,
"/* unknown wire type %d */"
,
wtyp
)
}
w
.
WriteByte
(
'\n'
)
}
}
// writeExtensions writes all the extensions in m.
func
(
w
*
textWriter
)
writeExtensions
(
m
protoreflect
.
Message
)
error
{
md
:=
m
.
Descriptor
()
if
md
.
ExtensionRanges
()
.
Len
()
==
0
{
return
nil
}
type
ext
struct
{
desc
protoreflect
.
FieldDescriptor
val
protoreflect
.
Value
}
var
exts
[]
ext
m
.
Range
(
func
(
fd
protoreflect
.
FieldDescriptor
,
v
protoreflect
.
Value
)
bool
{
if
fd
.
IsExtension
()
{
exts
=
append
(
exts
,
ext
{
fd
,
v
})
}
return
true
})
sort
.
Slice
(
exts
,
func
(
i
,
j
int
)
bool
{
return
exts
[
i
]
.
desc
.
Number
()
<
exts
[
j
]
.
desc
.
Number
()
})
for
_
,
ext
:=
range
exts
{
// For message set, use the name of the message as the extension name.
name
:=
string
(
ext
.
desc
.
FullName
())
if
isMessageSet
(
ext
.
desc
.
ContainingMessage
())
{
name
=
strings
.
TrimSuffix
(
name
,
".message_set_extension"
)
}
if
!
ext
.
desc
.
IsList
()
{
if
err
:=
w
.
writeSingularExtension
(
name
,
ext
.
val
,
ext
.
desc
);
err
!=
nil
{
return
err
}
}
else
{
lv
:=
ext
.
val
.
List
()
for
i
:=
0
;
i
<
lv
.
Len
();
i
++
{
if
err
:=
w
.
writeSingularExtension
(
name
,
lv
.
Get
(
i
),
ext
.
desc
);
err
!=
nil
{
return
err
}
}
}
}
return
nil
}
func
(
w
*
textWriter
)
writeSingularExtension
(
name
string
,
v
protoreflect
.
Value
,
fd
protoreflect
.
FieldDescriptor
)
error
{
fmt
.
Fprintf
(
w
,
"[%s]:"
,
name
)
if
!
w
.
compact
{
w
.
WriteByte
(
' '
)
}
if
err
:=
w
.
writeSingularValue
(
v
,
fd
);
err
!=
nil
{
return
err
}
w
.
WriteByte
(
'\n'
)
return
nil
}
func
(
w
*
textWriter
)
writeIndent
()
{
if
!
w
.
complete
{
return
}
for
i
:=
0
;
i
<
w
.
indent
*
2
;
i
++
{
w
.
buf
=
append
(
w
.
buf
,
' '
)
}
w
.
complete
=
false
}
vendor/github.com/golang/protobuf/proto/wire.go
0 → 100644
View file @
8a683270
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
import
(
protoV2
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/runtime/protoiface"
)
// Size returns the size in bytes of the wire-format encoding of m.
func
Size
(
m
Message
)
int
{
if
m
==
nil
{
return
0
}
mi
:=
MessageV2
(
m
)
return
protoV2
.
Size
(
mi
)
}
// Marshal returns the wire-format encoding of m.
func
Marshal
(
m
Message
)
([]
byte
,
error
)
{
b
,
err
:=
marshalAppend
(
nil
,
m
,
false
)
if
b
==
nil
{
b
=
zeroBytes
}
return
b
,
err
}
var
zeroBytes
=
make
([]
byte
,
0
,
0
)
func
marshalAppend
(
buf
[]
byte
,
m
Message
,
deterministic
bool
)
([]
byte
,
error
)
{
if
m
==
nil
{
return
nil
,
ErrNil
}
mi
:=
MessageV2
(
m
)
nbuf
,
err
:=
protoV2
.
MarshalOptions
{
Deterministic
:
deterministic
,
AllowPartial
:
true
,
}
.
MarshalAppend
(
buf
,
mi
)
if
err
!=
nil
{
return
buf
,
err
}
if
len
(
buf
)
==
len
(
nbuf
)
{
if
!
mi
.
ProtoReflect
()
.
IsValid
()
{
return
buf
,
ErrNil
}
}
return
nbuf
,
checkRequiredNotSet
(
mi
)
}
// Unmarshal parses a wire-format message in b and places the decoded results in m.
//
// Unmarshal resets m before starting to unmarshal, so any existing data in m is always
// removed. Use UnmarshalMerge to preserve and append to existing data.
func
Unmarshal
(
b
[]
byte
,
m
Message
)
error
{
m
.
Reset
()
return
UnmarshalMerge
(
b
,
m
)
}
// UnmarshalMerge parses a wire-format message in b and places the decoded results in m.
func
UnmarshalMerge
(
b
[]
byte
,
m
Message
)
error
{
mi
:=
MessageV2
(
m
)
out
,
err
:=
protoV2
.
UnmarshalOptions
{
AllowPartial
:
true
,
Merge
:
true
,
}
.
UnmarshalState
(
protoiface
.
UnmarshalInput
{
Buf
:
b
,
Message
:
mi
.
ProtoReflect
(),
})
if
err
!=
nil
{
return
err
}
if
out
.
Flags
&
protoiface
.
UnmarshalInitialized
>
0
{
return
nil
}
return
checkRequiredNotSet
(
mi
)
}
vendor/github.com/golang/protobuf/proto/wrappers.go
0 → 100644
View file @
8a683270
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
proto
// Bool stores v in a new bool value and returns a pointer to it.
func
Bool
(
v
bool
)
*
bool
{
return
&
v
}
// Int stores v in a new int32 value and returns a pointer to it.
//
// Deprecated: Use Int32 instead.
func
Int
(
v
int
)
*
int32
{
return
Int32
(
int32
(
v
))
}
// Int32 stores v in a new int32 value and returns a pointer to it.
func
Int32
(
v
int32
)
*
int32
{
return
&
v
}
// Int64 stores v in a new int64 value and returns a pointer to it.
func
Int64
(
v
int64
)
*
int64
{
return
&
v
}
// Uint32 stores v in a new uint32 value and returns a pointer to it.
func
Uint32
(
v
uint32
)
*
uint32
{
return
&
v
}
// Uint64 stores v in a new uint64 value and returns a pointer to it.
func
Uint64
(
v
uint64
)
*
uint64
{
return
&
v
}
// Float32 stores v in a new float32 value and returns a pointer to it.
func
Float32
(
v
float32
)
*
float32
{
return
&
v
}
// Float64 stores v in a new float64 value and returns a pointer to it.
func
Float64
(
v
float64
)
*
float64
{
return
&
v
}
// String stores v in a new string value and returns a pointer to it.
func
String
(
v
string
)
*
string
{
return
&
v
}
vendor/github.com/golang/protobuf/ptypes/any.go
0 → 100644
View file @
8a683270
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
ptypes
import
(
"fmt"
"strings"
"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
anypb
"github.com/golang/protobuf/ptypes/any"
)
const
urlPrefix
=
"type.googleapis.com/"
// AnyMessageName returns the message name contained in an anypb.Any message.
// Most type assertions should use the Is function instead.
func
AnyMessageName
(
any
*
anypb
.
Any
)
(
string
,
error
)
{
name
,
err
:=
anyMessageName
(
any
)
return
string
(
name
),
err
}
func
anyMessageName
(
any
*
anypb
.
Any
)
(
protoreflect
.
FullName
,
error
)
{
if
any
==
nil
{
return
""
,
fmt
.
Errorf
(
"message is nil"
)
}
name
:=
protoreflect
.
FullName
(
any
.
TypeUrl
)
if
i
:=
strings
.
LastIndex
(
any
.
TypeUrl
,
"/"
);
i
>=
0
{
name
=
name
[
i
+
len
(
"/"
)
:
]
}
if
!
name
.
IsValid
()
{
return
""
,
fmt
.
Errorf
(
"message type url %q is invalid"
,
any
.
TypeUrl
)
}
return
name
,
nil
}
// MarshalAny marshals the given message m into an anypb.Any message.
func
MarshalAny
(
m
proto
.
Message
)
(
*
anypb
.
Any
,
error
)
{
switch
dm
:=
m
.
(
type
)
{
case
DynamicAny
:
m
=
dm
.
Message
case
*
DynamicAny
:
if
dm
==
nil
{
return
nil
,
proto
.
ErrNil
}
m
=
dm
.
Message
}
b
,
err
:=
proto
.
Marshal
(
m
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
anypb
.
Any
{
TypeUrl
:
urlPrefix
+
proto
.
MessageName
(
m
),
Value
:
b
},
nil
}
// Empty returns a new message of the type specified in an anypb.Any message.
// It returns protoregistry.NotFound if the corresponding message type could not
// be resolved in the global registry.
func
Empty
(
any
*
anypb
.
Any
)
(
proto
.
Message
,
error
)
{
name
,
err
:=
anyMessageName
(
any
)
if
err
!=
nil
{
return
nil
,
err
}
mt
,
err
:=
protoregistry
.
GlobalTypes
.
FindMessageByName
(
name
)
if
err
!=
nil
{
return
nil
,
err
}
return
proto
.
MessageV1
(
mt
.
New
()
.
Interface
()),
nil
}
// UnmarshalAny unmarshals the encoded value contained in the anypb.Any message
// into the provided message m. It returns an error if the target message
// does not match the type in the Any message or if an unmarshal error occurs.
//
// The target message m may be a *DynamicAny message. If the underlying message
// type could not be resolved, then this returns protoregistry.NotFound.
func
UnmarshalAny
(
any
*
anypb
.
Any
,
m
proto
.
Message
)
error
{
if
dm
,
ok
:=
m
.
(
*
DynamicAny
);
ok
{
if
dm
.
Message
==
nil
{
var
err
error
dm
.
Message
,
err
=
Empty
(
any
)
if
err
!=
nil
{
return
err
}
}
m
=
dm
.
Message
}
anyName
,
err
:=
AnyMessageName
(
any
)
if
err
!=
nil
{
return
err
}
msgName
:=
proto
.
MessageName
(
m
)
if
anyName
!=
msgName
{
return
fmt
.
Errorf
(
"mismatched message type: got %q want %q"
,
anyName
,
msgName
)
}
return
proto
.
Unmarshal
(
any
.
Value
,
m
)
}
// Is reports whether the Any message contains a message of the specified type.
func
Is
(
any
*
anypb
.
Any
,
m
proto
.
Message
)
bool
{
if
any
==
nil
||
m
==
nil
{
return
false
}
name
:=
proto
.
MessageName
(
m
)
if
!
strings
.
HasSuffix
(
any
.
TypeUrl
,
name
)
{
return
false
}
return
len
(
any
.
TypeUrl
)
==
len
(
name
)
||
any
.
TypeUrl
[
len
(
any
.
TypeUrl
)
-
len
(
name
)
-
1
]
==
'/'
}
// DynamicAny is a value that can be passed to UnmarshalAny to automatically
// allocate a proto.Message for the type specified in an anypb.Any message.
// The allocated message is stored in the embedded proto.Message.
//
// Example:
// var x ptypes.DynamicAny
// if err := ptypes.UnmarshalAny(a, &x); err != nil { ... }
// fmt.Printf("unmarshaled message: %v", x.Message)
type
DynamicAny
struct
{
proto
.
Message
}
func
(
m
DynamicAny
)
String
()
string
{
if
m
.
Message
==
nil
{
return
"<nil>"
}
return
m
.
Message
.
String
()
}
func
(
m
DynamicAny
)
Reset
()
{
if
m
.
Message
==
nil
{
return
}
m
.
Message
.
Reset
()
}
func
(
m
DynamicAny
)
ProtoMessage
()
{
return
}
func
(
m
DynamicAny
)
ProtoReflect
()
protoreflect
.
Message
{
if
m
.
Message
==
nil
{
return
nil
}
return
dynamicAny
{
proto
.
MessageReflect
(
m
.
Message
)}
}
type
dynamicAny
struct
{
protoreflect
.
Message
}
func
(
m
dynamicAny
)
Type
()
protoreflect
.
MessageType
{
return
dynamicAnyType
{
m
.
Message
.
Type
()}
}
func
(
m
dynamicAny
)
New
()
protoreflect
.
Message
{
return
dynamicAnyType
{
m
.
Message
.
Type
()}
.
New
()
}
func
(
m
dynamicAny
)
Interface
()
protoreflect
.
ProtoMessage
{
return
DynamicAny
{
proto
.
MessageV1
(
m
.
Message
.
Interface
())}
}
type
dynamicAnyType
struct
{
protoreflect
.
MessageType
}
func
(
t
dynamicAnyType
)
New
()
protoreflect
.
Message
{
return
dynamicAny
{
t
.
MessageType
.
New
()}
}
func
(
t
dynamicAnyType
)
Zero
()
protoreflect
.
Message
{
return
dynamicAny
{
t
.
MessageType
.
Zero
()}
}
vendor/github.com/golang/protobuf/ptypes/any/any.pb.go
0 → 100644
View file @
8a683270
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: github.com/golang/protobuf/ptypes/any/any.proto
package
any
import
(
protoreflect
"google.golang.org/protobuf/reflect/protoreflect"
protoimpl
"google.golang.org/protobuf/runtime/protoimpl"
anypb
"google.golang.org/protobuf/types/known/anypb"
reflect
"reflect"
)
// Symbols defined in public import of google/protobuf/any.proto.
type
Any
=
anypb
.
Any
var
File_github_com_golang_protobuf_ptypes_any_any_proto
protoreflect
.
FileDescriptor
var
file_github_com_golang_protobuf_ptypes_any_any_proto_rawDesc
=
[]
byte
{
0x0a
,
0x2f
,
0x67
,
0x69
,
0x74
,
0x68
,
0x75
,
0x62
,
0x2e
,
0x63
,
0x6f
,
0x6d
,
0x2f
,
0x67
,
0x6f
,
0x6c
,
0x61
,
0x6e
,
0x67
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x62
,
0x75
,
0x66
,
0x2f
,
0x70
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2f
,
0x61
,
0x6e
,
0x79
,
0x2f
,
0x61
,
0x6e
,
0x79
,
0x2e
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x1a
,
0x19
,
0x67
,
0x6f
,
0x6f
,
0x67
,
0x6c
,
0x65
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x62
,
0x75
,
0x66
,
0x2f
,
0x61
,
0x6e
,
0x79
,
0x2e
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x42
,
0x2b
,
0x5a
,
0x29
,
0x67
,
0x69
,
0x74
,
0x68
,
0x75
,
0x62
,
0x2e
,
0x63
,
0x6f
,
0x6d
,
0x2f
,
0x67
,
0x6f
,
0x6c
,
0x61
,
0x6e
,
0x67
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x62
,
0x75
,
0x66
,
0x2f
,
0x70
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2f
,
0x61
,
0x6e
,
0x79
,
0x3b
,
0x61
,
0x6e
,
0x79
,
0x50
,
0x00
,
0x62
,
0x06
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x33
,
}
var
file_github_com_golang_protobuf_ptypes_any_any_proto_goTypes
=
[]
interface
{}{}
var
file_github_com_golang_protobuf_ptypes_any_any_proto_depIdxs
=
[]
int32
{
0
,
// [0:0] is the sub-list for method output_type
0
,
// [0:0] is the sub-list for method input_type
0
,
// [0:0] is the sub-list for extension type_name
0
,
// [0:0] is the sub-list for extension extendee
0
,
// [0:0] is the sub-list for field type_name
}
func
init
()
{
file_github_com_golang_protobuf_ptypes_any_any_proto_init
()
}
func
file_github_com_golang_protobuf_ptypes_any_any_proto_init
()
{
if
File_github_com_golang_protobuf_ptypes_any_any_proto
!=
nil
{
return
}
type
x
struct
{}
out
:=
protoimpl
.
TypeBuilder
{
File
:
protoimpl
.
DescBuilder
{
GoPackagePath
:
reflect
.
TypeOf
(
x
{})
.
PkgPath
(),
RawDescriptor
:
file_github_com_golang_protobuf_ptypes_any_any_proto_rawDesc
,
NumEnums
:
0
,
NumMessages
:
0
,
NumExtensions
:
0
,
NumServices
:
0
,
},
GoTypes
:
file_github_com_golang_protobuf_ptypes_any_any_proto_goTypes
,
DependencyIndexes
:
file_github_com_golang_protobuf_ptypes_any_any_proto_depIdxs
,
}
.
Build
()
File_github_com_golang_protobuf_ptypes_any_any_proto
=
out
.
File
file_github_com_golang_protobuf_ptypes_any_any_proto_rawDesc
=
nil
file_github_com_golang_protobuf_ptypes_any_any_proto_goTypes
=
nil
file_github_com_golang_protobuf_ptypes_any_any_proto_depIdxs
=
nil
}
vendor/github.com/golang/protobuf/ptypes/doc.go
0 → 100644
View file @
8a683270
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package ptypes provides functionality for interacting with well-known types.
package
ptypes
vendor/github.com/golang/protobuf/ptypes/duration.go
0 → 100644
View file @
8a683270
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
ptypes
import
(
"errors"
"fmt"
"time"
durationpb
"github.com/golang/protobuf/ptypes/duration"
)
// Range of google.protobuf.Duration as specified in duration.proto.
// This is about 10,000 years in seconds.
const
(
maxSeconds
=
int64
(
10000
*
365.25
*
24
*
60
*
60
)
minSeconds
=
-
maxSeconds
)
// Duration converts a durationpb.Duration to a time.Duration.
// Duration returns an error if dur is invalid or overflows a time.Duration.
func
Duration
(
dur
*
durationpb
.
Duration
)
(
time
.
Duration
,
error
)
{
if
err
:=
validateDuration
(
dur
);
err
!=
nil
{
return
0
,
err
}
d
:=
time
.
Duration
(
dur
.
Seconds
)
*
time
.
Second
if
int64
(
d
/
time
.
Second
)
!=
dur
.
Seconds
{
return
0
,
fmt
.
Errorf
(
"duration: %v is out of range for time.Duration"
,
dur
)
}
if
dur
.
Nanos
!=
0
{
d
+=
time
.
Duration
(
dur
.
Nanos
)
*
time
.
Nanosecond
if
(
d
<
0
)
!=
(
dur
.
Nanos
<
0
)
{
return
0
,
fmt
.
Errorf
(
"duration: %v is out of range for time.Duration"
,
dur
)
}
}
return
d
,
nil
}
// DurationProto converts a time.Duration to a durationpb.Duration.
func
DurationProto
(
d
time
.
Duration
)
*
durationpb
.
Duration
{
nanos
:=
d
.
Nanoseconds
()
secs
:=
nanos
/
1e9
nanos
-=
secs
*
1e9
return
&
durationpb
.
Duration
{
Seconds
:
int64
(
secs
),
Nanos
:
int32
(
nanos
),
}
}
// validateDuration determines whether the durationpb.Duration is valid
// according to the definition in google/protobuf/duration.proto.
// A valid durpb.Duration may still be too large to fit into a time.Duration
// Note that the range of durationpb.Duration is about 10,000 years,
// while the range of time.Duration is about 290 years.
func
validateDuration
(
dur
*
durationpb
.
Duration
)
error
{
if
dur
==
nil
{
return
errors
.
New
(
"duration: nil Duration"
)
}
if
dur
.
Seconds
<
minSeconds
||
dur
.
Seconds
>
maxSeconds
{
return
fmt
.
Errorf
(
"duration: %v: seconds out of range"
,
dur
)
}
if
dur
.
Nanos
<=
-
1e9
||
dur
.
Nanos
>=
1e9
{
return
fmt
.
Errorf
(
"duration: %v: nanos out of range"
,
dur
)
}
// Seconds and Nanos must have the same sign, unless d.Nanos is zero.
if
(
dur
.
Seconds
<
0
&&
dur
.
Nanos
>
0
)
||
(
dur
.
Seconds
>
0
&&
dur
.
Nanos
<
0
)
{
return
fmt
.
Errorf
(
"duration: %v: seconds and nanos have different signs"
,
dur
)
}
return
nil
}
vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go
0 → 100644
View file @
8a683270
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: github.com/golang/protobuf/ptypes/duration/duration.proto
package
duration
import
(
protoreflect
"google.golang.org/protobuf/reflect/protoreflect"
protoimpl
"google.golang.org/protobuf/runtime/protoimpl"
durationpb
"google.golang.org/protobuf/types/known/durationpb"
reflect
"reflect"
)
// Symbols defined in public import of google/protobuf/duration.proto.
type
Duration
=
durationpb
.
Duration
var
File_github_com_golang_protobuf_ptypes_duration_duration_proto
protoreflect
.
FileDescriptor
var
file_github_com_golang_protobuf_ptypes_duration_duration_proto_rawDesc
=
[]
byte
{
0x0a
,
0x39
,
0x67
,
0x69
,
0x74
,
0x68
,
0x75
,
0x62
,
0x2e
,
0x63
,
0x6f
,
0x6d
,
0x2f
,
0x67
,
0x6f
,
0x6c
,
0x61
,
0x6e
,
0x67
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x62
,
0x75
,
0x66
,
0x2f
,
0x70
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2f
,
0x64
,
0x75
,
0x72
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x2f
,
0x64
,
0x75
,
0x72
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x2e
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x1a
,
0x1e
,
0x67
,
0x6f
,
0x6f
,
0x67
,
0x6c
,
0x65
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x62
,
0x75
,
0x66
,
0x2f
,
0x64
,
0x75
,
0x72
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x2e
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x42
,
0x35
,
0x5a
,
0x33
,
0x67
,
0x69
,
0x74
,
0x68
,
0x75
,
0x62
,
0x2e
,
0x63
,
0x6f
,
0x6d
,
0x2f
,
0x67
,
0x6f
,
0x6c
,
0x61
,
0x6e
,
0x67
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x62
,
0x75
,
0x66
,
0x2f
,
0x70
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2f
,
0x64
,
0x75
,
0x72
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x3b
,
0x64
,
0x75
,
0x72
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x50
,
0x00
,
0x62
,
0x06
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x33
,
}
var
file_github_com_golang_protobuf_ptypes_duration_duration_proto_goTypes
=
[]
interface
{}{}
var
file_github_com_golang_protobuf_ptypes_duration_duration_proto_depIdxs
=
[]
int32
{
0
,
// [0:0] is the sub-list for method output_type
0
,
// [0:0] is the sub-list for method input_type
0
,
// [0:0] is the sub-list for extension type_name
0
,
// [0:0] is the sub-list for extension extendee
0
,
// [0:0] is the sub-list for field type_name
}
func
init
()
{
file_github_com_golang_protobuf_ptypes_duration_duration_proto_init
()
}
func
file_github_com_golang_protobuf_ptypes_duration_duration_proto_init
()
{
if
File_github_com_golang_protobuf_ptypes_duration_duration_proto
!=
nil
{
return
}
type
x
struct
{}
out
:=
protoimpl
.
TypeBuilder
{
File
:
protoimpl
.
DescBuilder
{
GoPackagePath
:
reflect
.
TypeOf
(
x
{})
.
PkgPath
(),
RawDescriptor
:
file_github_com_golang_protobuf_ptypes_duration_duration_proto_rawDesc
,
NumEnums
:
0
,
NumMessages
:
0
,
NumExtensions
:
0
,
NumServices
:
0
,
},
GoTypes
:
file_github_com_golang_protobuf_ptypes_duration_duration_proto_goTypes
,
DependencyIndexes
:
file_github_com_golang_protobuf_ptypes_duration_duration_proto_depIdxs
,
}
.
Build
()
File_github_com_golang_protobuf_ptypes_duration_duration_proto
=
out
.
File
file_github_com_golang_protobuf_ptypes_duration_duration_proto_rawDesc
=
nil
file_github_com_golang_protobuf_ptypes_duration_duration_proto_goTypes
=
nil
file_github_com_golang_protobuf_ptypes_duration_duration_proto_depIdxs
=
nil
}
vendor/github.com/golang/protobuf/ptypes/timestamp.go
0 → 100644
View file @
8a683270
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
ptypes
import
(
"errors"
"fmt"
"time"
timestamppb
"github.com/golang/protobuf/ptypes/timestamp"
)
// Range of google.protobuf.Duration as specified in timestamp.proto.
const
(
// Seconds field of the earliest valid Timestamp.
// This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix().
minValidSeconds
=
-
62135596800
// Seconds field just after the latest valid Timestamp.
// This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix().
maxValidSeconds
=
253402300800
)
// Timestamp converts a timestamppb.Timestamp to a time.Time.
// It returns an error if the argument is invalid.
//
// Unlike most Go functions, if Timestamp returns an error, the first return
// value is not the zero time.Time. Instead, it is the value obtained from the
// time.Unix function when passed the contents of the Timestamp, in the UTC
// locale. This may or may not be a meaningful time; many invalid Timestamps
// do map to valid time.Times.
//
// A nil Timestamp returns an error. The first return value in that case is
// undefined.
func
Timestamp
(
ts
*
timestamppb
.
Timestamp
)
(
time
.
Time
,
error
)
{
// Don't return the zero value on error, because corresponds to a valid
// timestamp. Instead return whatever time.Unix gives us.
var
t
time
.
Time
if
ts
==
nil
{
t
=
time
.
Unix
(
0
,
0
)
.
UTC
()
// treat nil like the empty Timestamp
}
else
{
t
=
time
.
Unix
(
ts
.
Seconds
,
int64
(
ts
.
Nanos
))
.
UTC
()
}
return
t
,
validateTimestamp
(
ts
)
}
// TimestampNow returns a google.protobuf.Timestamp for the current time.
func
TimestampNow
()
*
timestamppb
.
Timestamp
{
ts
,
err
:=
TimestampProto
(
time
.
Now
())
if
err
!=
nil
{
panic
(
"ptypes: time.Now() out of Timestamp range"
)
}
return
ts
}
// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto.
// It returns an error if the resulting Timestamp is invalid.
func
TimestampProto
(
t
time
.
Time
)
(
*
timestamppb
.
Timestamp
,
error
)
{
ts
:=
&
timestamppb
.
Timestamp
{
Seconds
:
t
.
Unix
(),
Nanos
:
int32
(
t
.
Nanosecond
()),
}
if
err
:=
validateTimestamp
(
ts
);
err
!=
nil
{
return
nil
,
err
}
return
ts
,
nil
}
// TimestampString returns the RFC 3339 string for valid Timestamps.
// For invalid Timestamps, it returns an error message in parentheses.
func
TimestampString
(
ts
*
timestamppb
.
Timestamp
)
string
{
t
,
err
:=
Timestamp
(
ts
)
if
err
!=
nil
{
return
fmt
.
Sprintf
(
"(%v)"
,
err
)
}
return
t
.
Format
(
time
.
RFC3339Nano
)
}
// validateTimestamp determines whether a Timestamp is valid.
// A valid timestamp represents a time in the range [0001-01-01, 10000-01-01)
// and has a Nanos field in the range [0, 1e9).
//
// If the Timestamp is valid, validateTimestamp returns nil.
// Otherwise, it returns an error that describes the problem.
//
// Every valid Timestamp can be represented by a time.Time,
// but the converse is not true.
func
validateTimestamp
(
ts
*
timestamppb
.
Timestamp
)
error
{
if
ts
==
nil
{
return
errors
.
New
(
"timestamp: nil Timestamp"
)
}
if
ts
.
Seconds
<
minValidSeconds
{
return
fmt
.
Errorf
(
"timestamp: %v before 0001-01-01"
,
ts
)
}
if
ts
.
Seconds
>=
maxValidSeconds
{
return
fmt
.
Errorf
(
"timestamp: %v after 10000-01-01"
,
ts
)
}
if
ts
.
Nanos
<
0
||
ts
.
Nanos
>=
1e9
{
return
fmt
.
Errorf
(
"timestamp: %v: nanos not in range [0, 1e9)"
,
ts
)
}
return
nil
}
vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
0 → 100644
View file @
8a683270
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: github.com/golang/protobuf/ptypes/timestamp/timestamp.proto
package
timestamp
import
(
protoreflect
"google.golang.org/protobuf/reflect/protoreflect"
protoimpl
"google.golang.org/protobuf/runtime/protoimpl"
timestamppb
"google.golang.org/protobuf/types/known/timestamppb"
reflect
"reflect"
)
// Symbols defined in public import of google/protobuf/timestamp.proto.
type
Timestamp
=
timestamppb
.
Timestamp
var
File_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto
protoreflect
.
FileDescriptor
var
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_rawDesc
=
[]
byte
{
0x0a
,
0x3b
,
0x67
,
0x69
,
0x74
,
0x68
,
0x75
,
0x62
,
0x2e
,
0x63
,
0x6f
,
0x6d
,
0x2f
,
0x67
,
0x6f
,
0x6c
,
0x61
,
0x6e
,
0x67
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x62
,
0x75
,
0x66
,
0x2f
,
0x70
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2f
,
0x74
,
0x69
,
0x6d
,
0x65
,
0x73
,
0x74
,
0x61
,
0x6d
,
0x70
,
0x2f
,
0x74
,
0x69
,
0x6d
,
0x65
,
0x73
,
0x74
,
0x61
,
0x6d
,
0x70
,
0x2e
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x1a
,
0x1f
,
0x67
,
0x6f
,
0x6f
,
0x67
,
0x6c
,
0x65
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x62
,
0x75
,
0x66
,
0x2f
,
0x74
,
0x69
,
0x6d
,
0x65
,
0x73
,
0x74
,
0x61
,
0x6d
,
0x70
,
0x2e
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x42
,
0x37
,
0x5a
,
0x35
,
0x67
,
0x69
,
0x74
,
0x68
,
0x75
,
0x62
,
0x2e
,
0x63
,
0x6f
,
0x6d
,
0x2f
,
0x67
,
0x6f
,
0x6c
,
0x61
,
0x6e
,
0x67
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x62
,
0x75
,
0x66
,
0x2f
,
0x70
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2f
,
0x74
,
0x69
,
0x6d
,
0x65
,
0x73
,
0x74
,
0x61
,
0x6d
,
0x70
,
0x3b
,
0x74
,
0x69
,
0x6d
,
0x65
,
0x73
,
0x74
,
0x61
,
0x6d
,
0x70
,
0x50
,
0x00
,
0x62
,
0x06
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x33
,
}
var
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_goTypes
=
[]
interface
{}{}
var
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_depIdxs
=
[]
int32
{
0
,
// [0:0] is the sub-list for method output_type
0
,
// [0:0] is the sub-list for method input_type
0
,
// [0:0] is the sub-list for extension type_name
0
,
// [0:0] is the sub-list for extension extendee
0
,
// [0:0] is the sub-list for field type_name
}
func
init
()
{
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_init
()
}
func
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_init
()
{
if
File_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto
!=
nil
{
return
}
type
x
struct
{}
out
:=
protoimpl
.
TypeBuilder
{
File
:
protoimpl
.
DescBuilder
{
GoPackagePath
:
reflect
.
TypeOf
(
x
{})
.
PkgPath
(),
RawDescriptor
:
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_rawDesc
,
NumEnums
:
0
,
NumMessages
:
0
,
NumExtensions
:
0
,
NumServices
:
0
,
},
GoTypes
:
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_goTypes
,
DependencyIndexes
:
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_depIdxs
,
}
.
Build
()
File_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto
=
out
.
File
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_rawDesc
=
nil
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_goTypes
=
nil
file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_depIdxs
=
nil
}
vendor/github.com/kubevirt/device-plugin-manager/LICENSE
0 → 100644
View file @
8a683270
MIT License
Copyright (c) 2017-2018 Red Hat, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
vendor/github.com/kubevirt/device-plugin-manager/pkg/dpm/doc.go
0 → 100644
View file @
8a683270
// Package dpm (Device Plugin Manager) provides a framework that makes implementation of
// Device Plugins https://kubernetes.io/docs/concepts/cluster-administration/device-plugins/
// easier. It provides abstraction of Plugins, thanks to it a user does not need to implement
// actual gRPC server. It also handles dynamic management of available resources and their
// respective plugins.
//
// Usage
//
// The framework contains two main interfaces which must be implemented by user. ListerInterface
// handles resource management, it notifies DPM about available resources. Plugin interface then
// represents a plugin that handles available devices of one resource.
//
// See Also
//
// Repository of this package and some plugins using it can be found on
// https://github.com/kubevirt/kubernetes-device-plugins/.
package
dpm
vendor/github.com/kubevirt/device-plugin-manager/pkg/dpm/lister.go
0 → 100644
View file @
8a683270
package
dpm
// PluginNameList contains last names of discovered resources. This type is used by Discover
// implementation to inform manager about changes in found resources, e.g. last name of resource
// "color.example.com/red" is "red".
type
PluginNameList
[]
string
// ListerInterface serves as an interface between imlementation and Manager machinery. User passes
// implementation of this interface to NewManager function. Manager will use it to obtain resource
// namespace, monitor available resources and instantate a new plugin for them.
type
ListerInterface
interface
{
// GetResourceNamespace must return namespace (vendor ID) of implemented Lister. e.g. for
// resources in format "color.example.com/<color>" that would be "color.example.com".
GetResourceNamespace
()
string
// Discover notifies manager with a list of currently available resources in its namespace.
// e.g. if "color.example.com/red" and "color.example.com/blue" are available in the system,
// it would pass PluginNameList{"red", "blue"} to given channel. In case list of
// resources is static, it would use the channel only once and then return. In case the list is
// dynamic, it could block and pass a new list each times resources changed. If blocking is
// used, it should check whether the channel is closed, i.e. Discover should stop.
Discover
(
chan
PluginNameList
)
// NewPlugin instantiates a plugin implementation. It is given the last name of the resource,
// e.g. for resource name "color.example.com/red" that would be "red". It must return valid
// implementation of a PluginInterface.
NewPlugin
(
string
)
PluginInterface
}
vendor/github.com/kubevirt/device-plugin-manager/pkg/dpm/manager.go
0 → 100644
View file @
8a683270
package
dpm
import
(
"os"
"os/signal"
"sync"
"syscall"
"time"
"github.com/fsnotify/fsnotify"
"github.com/golang/glog"
pluginapi
"k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1"
)
// TODO: Make plugin server start retries configurable.
const
(
startPluginServerRetries
=
3
startPluginServerRetryWait
=
3
*
time
.
Second
)
// Manager contains the main machinery of this framework. It uses user defined lister to monitor
// available resources and start/stop plugins accordingly. It also handles system signals and
// unexpected kubelet events.
type
Manager
struct
{
lister
ListerInterface
}
// NewManager is the canonical way of initializing Manager. User must provide ListerInterface
// implementation. Lister will provide information about handled resources, monitor their
// availability and provide method to spawn plugins that will handle found resources.
func
NewManager
(
lister
ListerInterface
)
*
Manager
{
dpm
:=
&
Manager
{
lister
:
lister
,
}
return
dpm
}
// Run starts the Manager. It sets up the infrastructure and handles system signals, Kubelet socket
// watch and monitoring of available resources as well as starting and stoping of plugins.
func
(
dpm
*
Manager
)
Run
()
{
glog
.
V
(
3
)
.
Info
(
"Starting device plugin manager"
)
// First important signal channel is the os signal channel. We only care about (somewhat) small
// subset of available signals.
glog
.
V
(
3
)
.
Info
(
"Registering for system signal notifications"
)
signalCh
:=
make
(
chan
os
.
Signal
,
1
)
signal
.
Notify
(
signalCh
,
syscall
.
SIGTERM
,
syscall
.
SIGQUIT
,
syscall
.
SIGINT
)
// The other important channel is filesystem notification channel, responsible for watching
// device plugin directory.
glog
.
V
(
3
)
.
Info
(
"Registering for notifications of filesystem changes in device plugin directory"
)
fsWatcher
,
_
:=
fsnotify
.
NewWatcher
()
defer
fsWatcher
.
Close
()
fsWatcher
.
Add
(
pluginapi
.
DevicePluginPath
)
// Create list of running plugins and start Discover method of given lister. This method is
// responsible of notifying manager about changes in available plugins.
var
pluginMap
=
make
(
map
[
string
]
devicePlugin
)
glog
.
V
(
3
)
.
Info
(
"Starting Discovery on new plugins"
)
pluginsCh
:=
make
(
chan
PluginNameList
)
defer
close
(
pluginsCh
)
go
dpm
.
lister
.
Discover
(
pluginsCh
)
// Finally start a loop that will handle messages from opened channels.
glog
.
V
(
3
)
.
Info
(
"Handling incoming signals"
)
HandleSignals
:
for
{
select
{
case
newPluginsList
:=
<-
pluginsCh
:
glog
.
V
(
3
)
.
Infof
(
"Received new list of plugins: %s"
,
newPluginsList
)
dpm
.
handleNewPlugins
(
pluginMap
,
newPluginsList
)
case
event
:=
<-
fsWatcher
.
Events
:
if
event
.
Name
==
pluginapi
.
KubeletSocket
{
glog
.
V
(
3
)
.
Infof
(
"Received kubelet socket event: %s"
,
event
)
if
event
.
Op
&
fsnotify
.
Create
==
fsnotify
.
Create
{
dpm
.
startPluginServers
(
pluginMap
)
}
// TODO: Kubelet doesn't really clean-up it's socket, so this is currently
// manual-testing thing. Could we solve Kubelet deaths better?
if
event
.
Op
&
fsnotify
.
Remove
==
fsnotify
.
Remove
{
dpm
.
stopPluginServers
(
pluginMap
)
}
}
case
s
:=
<-
signalCh
:
switch
s
{
case
syscall
.
SIGTERM
,
syscall
.
SIGQUIT
,
syscall
.
SIGINT
:
glog
.
V
(
3
)
.
Infof
(
"Received signal
\"
%v
\"
, shutting down"
,
s
)
dpm
.
stopPlugins
(
pluginMap
)
break
HandleSignals
}
}
}
}
func
(
dpm
*
Manager
)
handleNewPlugins
(
currentPluginsMap
map
[
string
]
devicePlugin
,
newPluginsList
PluginNameList
)
{
var
wg
sync
.
WaitGroup
var
pluginMapMutex
=
&
sync
.
Mutex
{}
// This map is used for faster searches when removing old plugins
newPluginsSet
:=
make
(
map
[
string
]
bool
)
// Add new plugins
for
_
,
newPluginLastName
:=
range
newPluginsList
{
newPluginsSet
[
newPluginLastName
]
=
true
wg
.
Add
(
1
)
go
func
(
name
string
)
{
if
_
,
ok
:=
currentPluginsMap
[
name
];
!
ok
{
// add new plugin only if it doesn't already exist
glog
.
V
(
3
)
.
Infof
(
"Adding a new plugin
\"
%s
\"
"
,
name
)
plugin
:=
newDevicePlugin
(
dpm
.
lister
.
GetResourceNamespace
(),
name
,
dpm
.
lister
.
NewPlugin
(
name
))
startPlugin
(
name
,
plugin
)
pluginMapMutex
.
Lock
()
currentPluginsMap
[
name
]
=
plugin
pluginMapMutex
.
Unlock
()
}
wg
.
Done
()
}(
newPluginLastName
)
}
wg
.
Wait
()
// Remove old plugins
for
pluginLastName
,
currentPlugin
:=
range
currentPluginsMap
{
wg
.
Add
(
1
)
go
func
(
name
string
,
plugin
devicePlugin
)
{
if
_
,
found
:=
newPluginsSet
[
name
];
!
found
{
glog
.
V
(
3
)
.
Infof
(
"Remove unused plugin
\"
%s
\"
"
,
name
)
stopPlugin
(
name
,
plugin
)
pluginMapMutex
.
Lock
()
delete
(
currentPluginsMap
,
name
)
pluginMapMutex
.
Unlock
()
}
wg
.
Done
()
}(
pluginLastName
,
currentPlugin
)
}
wg
.
Wait
()
}
func
(
dpm
*
Manager
)
startPluginServers
(
pluginMap
map
[
string
]
devicePlugin
)
{
var
wg
sync
.
WaitGroup
for
pluginLastName
,
currentPlugin
:=
range
pluginMap
{
wg
.
Add
(
1
)
go
func
(
name
string
,
plugin
devicePlugin
)
{
startPluginServer
(
name
,
plugin
)
wg
.
Done
()
}(
pluginLastName
,
currentPlugin
)
}
wg
.
Wait
()
}
func
(
dpm
*
Manager
)
stopPluginServers
(
pluginMap
map
[
string
]
devicePlugin
)
{
var
wg
sync
.
WaitGroup
for
pluginLastName
,
currentPlugin
:=
range
pluginMap
{
wg
.
Add
(
1
)
go
func
(
name
string
,
plugin
devicePlugin
)
{
stopPluginServer
(
name
,
plugin
)
wg
.
Done
()
}(
pluginLastName
,
currentPlugin
)
}
wg
.
Wait
()
}
func
(
dpm
*
Manager
)
stopPlugins
(
pluginMap
map
[
string
]
devicePlugin
)
{
var
wg
sync
.
WaitGroup
var
pluginMapMutex
=
&
sync
.
Mutex
{}
for
pluginLastName
,
currentPlugin
:=
range
pluginMap
{
wg
.
Add
(
1
)
go
func
(
name
string
,
plugin
devicePlugin
)
{
stopPlugin
(
name
,
plugin
)
pluginMapMutex
.
Lock
()
delete
(
pluginMap
,
name
)
pluginMapMutex
.
Unlock
()
wg
.
Done
()
}(
pluginLastName
,
currentPlugin
)
}
wg
.
Wait
()
}
func
startPlugin
(
pluginLastName
string
,
plugin
devicePlugin
)
{
var
err
error
if
devicePluginImpl
,
ok
:=
plugin
.
DevicePluginImpl
.
(
PluginInterfaceStart
);
ok
{
err
=
devicePluginImpl
.
Start
()
if
err
!=
nil
{
glog
.
Errorf
(
"Failed to start plugin
\"
%s
\"
: %s"
,
pluginLastName
,
err
)
}
}
if
err
==
nil
{
startPluginServer
(
pluginLastName
,
plugin
)
}
}
func
stopPlugin
(
pluginLastName
string
,
plugin
devicePlugin
)
{
stopPluginServer
(
pluginLastName
,
plugin
)
if
devicePluginImpl
,
ok
:=
plugin
.
DevicePluginImpl
.
(
PluginInterfaceStop
);
ok
{
err
:=
devicePluginImpl
.
Stop
()
if
err
!=
nil
{
glog
.
Errorf
(
"Failed to stop plugin
\"
%s
\"
: %s"
,
pluginLastName
,
err
)
}
}
}
func
startPluginServer
(
pluginLastName
string
,
plugin
devicePlugin
)
{
for
i
:=
1
;
i
<=
startPluginServerRetries
;
i
++
{
err
:=
plugin
.
StartServer
()
if
err
==
nil
{
return
}
else
if
i
==
startPluginServerRetries
{
glog
.
V
(
3
)
.
Infof
(
"Failed to start plugin's
\"
%s
\"
server, within given %d tries: %s"
,
pluginLastName
,
startPluginServerRetries
,
err
)
}
else
{
glog
.
Errorf
(
"Failed to start plugin's
\"
%s
\"
server, atempt %d ouf of %d waiting %d before next try: %s"
,
pluginLastName
,
i
,
startPluginServerRetries
,
startPluginServerRetryWait
,
err
)
time
.
Sleep
(
startPluginServerRetryWait
)
}
}
}
func
stopPluginServer
(
pluginLastName
string
,
plugin
devicePlugin
)
{
err
:=
plugin
.
StopServer
()
if
err
!=
nil
{
glog
.
Errorf
(
"Failed to stop plugin's
\"
%s
\"
server: %s"
,
pluginLastName
,
err
)
}
}
vendor/github.com/kubevirt/device-plugin-manager/pkg/dpm/plugin.go
0 → 100644
View file @
8a683270
package
dpm
import
(
"net"
"os"
"path"
"sync"
"time"
"github.com/golang/glog"
"golang.org/x/net/context"
"google.golang.org/grpc"
pluginapi
"k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1"
)
// PluginInterface is a mandatory interface that must be implemented by all plugins. It is
// identical to DevicePluginServer interface of device plugin API. In version v1alpha this
// interface contains methods Allocate and ListAndWatch. For more information see
// https://godoc.org/k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1alpha#DevicePluginServer
type
PluginInterface
interface
{
pluginapi
.
DevicePluginServer
}
// PluginInterfaceStart is an optional interface that could be implemented by plugin. If case Start
// is implemented, it will be executed by Manager after plugin instantiation and before its
// registartion to kubelet. This method could be used to prepare resources before they are offered
// to Kubernetes.
type
PluginInterfaceStart
interface
{
Start
()
error
}
// PluginInterfaceStop is an optional interface that could be implemented by plugin. If case Stop
// is implemented, it will be executed by Manager after the plugin is unregistered from kubelet.
// This method could be used to tear down resources.
type
PluginInterfaceStop
interface
{
Stop
()
error
}
// DevicePlugin represents a gRPC server client/server.
type
devicePlugin
struct
{
DevicePluginImpl
PluginInterface
ResourceName
string
Name
string
Socket
string
Server
*
grpc
.
Server
Running
bool
Starting
*
sync
.
Mutex
}
func
newDevicePlugin
(
resourceNamespace
string
,
pluginName
string
,
devicePluginImpl
PluginInterface
)
devicePlugin
{
return
devicePlugin
{
DevicePluginImpl
:
devicePluginImpl
,
Socket
:
pluginapi
.
DevicePluginPath
+
resourceNamespace
+
"_"
+
pluginName
,
ResourceName
:
resourceNamespace
+
"/"
+
pluginName
,
Name
:
pluginName
,
Starting
:
&
sync
.
Mutex
{},
}
}
// StartServer starts the gRPC server and registers the device plugin to Kubelet. Calling
// StartServer on started object is NOOP.
func
(
dpi
*
devicePlugin
)
StartServer
()
error
{
glog
.
V
(
3
)
.
Infof
(
"%s: Starting plugin server"
,
dpi
.
Name
)
// If Kubelet socket is created, we may try to start the same plugin concurrently. To avoid
// that, let's make plugins startup a critical section.
dpi
.
Starting
.
Lock
()
defer
dpi
.
Starting
.
Unlock
()
// If we've acquired the lock after waiting for the Start to finish, we don't need to do
// anything (as long as the plugin is running).
if
dpi
.
Running
{
return
nil
}
err
:=
dpi
.
serve
()
if
err
!=
nil
{
return
err
}
err
=
dpi
.
register
()
if
err
!=
nil
{
dpi
.
StopServer
()
return
err
}
dpi
.
Running
=
true
return
nil
}
// serve starts the gRPC server of the device plugin.
func
(
dpi
*
devicePlugin
)
serve
()
error
{
glog
.
V
(
3
)
.
Infof
(
"%s: Starting the DPI gRPC server"
,
dpi
.
Name
)
err
:=
dpi
.
cleanup
()
if
err
!=
nil
{
glog
.
Errorf
(
"%s: Failed to setup a DPI gRPC server: %s"
,
dpi
.
Name
,
err
)
return
err
}
sock
,
err
:=
net
.
Listen
(
"unix"
,
dpi
.
Socket
)
if
err
!=
nil
{
glog
.
Errorf
(
"%s: Failed to setup a DPI gRPC server: %s"
,
dpi
.
Name
,
err
)
return
err
}
dpi
.
Server
=
grpc
.
NewServer
([]
grpc
.
ServerOption
{}
...
)
pluginapi
.
RegisterDevicePluginServer
(
dpi
.
Server
,
dpi
.
DevicePluginImpl
)
go
dpi
.
Server
.
Serve
(
sock
)
glog
.
V
(
3
)
.
Infof
(
"%s: Serving requests..."
,
dpi
.
Name
)
// Wait till grpc server is ready.
for
i
:=
0
;
i
<
10
;
i
++
{
services
:=
dpi
.
Server
.
GetServiceInfo
()
if
len
(
services
)
>=
1
{
break
}
time
.
Sleep
(
1
*
time
.
Second
)
}
return
nil
}
// register registers the device plugin (as gRPC client call) for the given ResourceName with
// Kubelet DPI infrastructure.
func
(
dpi
*
devicePlugin
)
register
()
error
{
glog
.
V
(
3
)
.
Infof
(
"%s: Registering the DPI with Kubelet"
,
dpi
.
Name
)
conn
,
err
:=
grpc
.
Dial
(
pluginapi
.
KubeletSocket
,
grpc
.
WithInsecure
(),
grpc
.
WithDialer
(
func
(
addr
string
,
timeout
time
.
Duration
)
(
net
.
Conn
,
error
)
{
return
net
.
DialTimeout
(
"unix"
,
addr
,
timeout
)
}))
defer
conn
.
Close
()
if
err
!=
nil
{
glog
.
Errorf
(
"%s: Could not dial gRPC: %s"
,
dpi
.
Name
,
err
)
return
err
}
client
:=
pluginapi
.
NewRegistrationClient
(
conn
)
glog
.
Infof
(
"%s: Registration for endpoint %s"
,
dpi
.
Name
,
path
.
Base
(
dpi
.
Socket
))
options
,
err
:=
dpi
.
DevicePluginImpl
.
GetDevicePluginOptions
(
context
.
Background
(),
&
pluginapi
.
Empty
{})
if
err
!=
nil
{
glog
.
Errorf
(
"%s: Failed to get device plugin options %s"
,
dpi
.
Name
,
err
)
return
err
}
reqt
:=
&
pluginapi
.
RegisterRequest
{
Version
:
pluginapi
.
Version
,
Endpoint
:
path
.
Base
(
dpi
.
Socket
),
ResourceName
:
dpi
.
ResourceName
,
Options
:
options
,
}
_
,
err
=
client
.
Register
(
context
.
Background
(),
reqt
)
if
err
!=
nil
{
glog
.
Errorf
(
"%s: Registration failed: %s"
,
dpi
.
Name
,
err
)
glog
.
Errorf
(
"%s: Make sure that the DevicePlugins feature gate is enabled and kubelet running"
,
dpi
.
Name
)
return
err
}
return
nil
}
// StopServer stops the gRPC server. Trying to stop already stopped plugin emits an info-level
// log message.
func
(
dpi
*
devicePlugin
)
StopServer
()
error
{
// TODO: should this also be a critical section?
// how do we prevent multiple stops? or start/stop race condition?
glog
.
V
(
3
)
.
Infof
(
"%s: Stopping plugin server"
,
dpi
.
Name
)
if
!
dpi
.
Running
{
glog
.
V
(
3
)
.
Infof
(
"%s: Tried to stop stopped DPI"
,
dpi
.
Name
)
return
nil
}
glog
.
V
(
3
)
.
Infof
(
"%s: Stopping the DPI gRPC server"
,
dpi
.
Name
)
dpi
.
Server
.
Stop
()
dpi
.
Running
=
false
return
dpi
.
cleanup
()
}
// cleanup is a helper to remove DPI's socket.
func
(
dpi
*
devicePlugin
)
cleanup
()
error
{
if
err
:=
os
.
Remove
(
dpi
.
Socket
);
err
!=
nil
&&
!
os
.
IsNotExist
(
err
)
{
glog
.
Errorf
(
"%s: Could not clean up socket %s: %s"
,
dpi
.
Name
,
dpi
.
Socket
,
err
)
return
err
}
return
nil
}
vendor/golang.org/x/net/AUTHORS
0 → 100644
View file @
8a683270
# This source code refers to The Go Authors for copyright purposes.
# The master list of authors is in the main Go distribution,
# visible at http://tip.golang.org/AUTHORS.
vendor/golang.org/x/net/CONTRIBUTORS
0 → 100644
View file @
8a683270
# This source code was written by the Go contributors.
# The master list of contributors is in the main Go distribution,
# visible at http://tip.golang.org/CONTRIBUTORS.
vendor/golang.org/x/net/LICENSE
0 → 100644
View file @
8a683270
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
vendor/golang.org/x/net/PATENTS
0 → 100644
View file @
8a683270
Additional IP Rights Grant (Patents)
"This implementation" means the copyrightable works distributed by
Google as part of the Go project.
Google hereby grants to You a perpetual, worldwide, non-exclusive,
no-charge, royalty-free, irrevocable (except as stated in this section)
patent license to make, have made, use, offer to sell, sell, import,
transfer and otherwise run, modify and propagate the contents of this
implementation of Go, where such license applies only to those patent
claims, both currently owned or controlled by Google and acquired in
the future, licensable by Google that are necessarily infringed by this
implementation of Go. This grant does not include claims that would be
infringed only as a consequence of further modification of this
implementation. If you or your agent or exclusive licensee institute or
order or agree to the institution of patent litigation against any
entity (including a cross-claim or counterclaim in a lawsuit) alleging
that this implementation of Go or any code incorporated within this
implementation of Go constitutes direct or contributory patent
infringement, or inducement of patent infringement, then any patent
rights granted to you under this License for this implementation of Go
shall terminate as of the date such litigation is filed.
Prev
1
2
3
4
5
6
7
8
9
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment