v3: associate feature and namespace with detector

This commit is contained in:
Sida Chen 2018-09-12 16:41:45 -04:00
parent 0609ed964b
commit 9f5d1ea4e1
4 changed files with 312 additions and 167 deletions

View File

@ -9,6 +9,8 @@ It is generated from these files:
It has these top-level messages:
Vulnerability
Detector
Namespace
Feature
Layer
ClairStatus
@ -48,6 +50,30 @@ var _ = math.Inf
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type Detector_Type int32
const (
Detector_DETECTOR_TYPE_INVALID Detector_Type = 0
Detector_DETECTOR_TYPE_NAMESPACE Detector_Type = 1
Detector_DETECTOR_TYPE_FEATURE Detector_Type = 2
)
var Detector_Type_name = map[int32]string{
0: "DETECTOR_TYPE_INVALID",
1: "DETECTOR_TYPE_NAMESPACE",
2: "DETECTOR_TYPE_FEATURE",
}
var Detector_Type_value = map[string]int32{
"DETECTOR_TYPE_INVALID": 0,
"DETECTOR_TYPE_NAMESPACE": 1,
"DETECTOR_TYPE_FEATURE": 2,
}
func (x Detector_Type) String() string {
return proto.EnumName(Detector_Type_name, int32(x))
}
func (Detector_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 0} }
type Vulnerability struct {
// The name of the vulnerability.
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
@ -130,23 +156,88 @@ func (m *Vulnerability) GetAffectedVersions() []*Feature {
return nil
}
type Detector struct {
// The name of the detector.
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
// The version of the detector.
Version string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
// The type of the detector.
Type Detector_Type `protobuf:"varint,3,opt,name=type,enum=coreos.clair.Detector_Type" json:"type,omitempty"`
}
func (m *Detector) Reset() { *m = Detector{} }
func (m *Detector) String() string { return proto.CompactTextString(m) }
func (*Detector) ProtoMessage() {}
func (*Detector) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
func (m *Detector) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *Detector) GetVersion() string {
if m != nil {
return m.Version
}
return ""
}
func (m *Detector) GetType() Detector_Type {
if m != nil {
return m.Type
}
return Detector_DETECTOR_TYPE_INVALID
}
type Namespace struct {
// The name of the namespace.
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
// The detector used to detect the namespace. This only exists when present in
// an Ancestry Feature.
Detector *Detector `protobuf:"bytes,2,opt,name=detector" json:"detector,omitempty"`
}
func (m *Namespace) Reset() { *m = Namespace{} }
func (m *Namespace) String() string { return proto.CompactTextString(m) }
func (*Namespace) ProtoMessage() {}
func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (m *Namespace) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *Namespace) GetDetector() *Detector {
if m != nil {
return m.Detector
}
return nil
}
type Feature struct {
// The name of the feature.
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
// The name of the namespace in which the feature is detected.
NamespaceName string `protobuf:"bytes,2,opt,name=namespace_name,json=namespaceName" json:"namespace_name,omitempty"`
// The namespace in which the feature is detected.
Namespace *Namespace `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"`
// The specific version of this feature.
Version string `protobuf:"bytes,3,opt,name=version" json:"version,omitempty"`
// The format used to parse version numbers for the feature.
VersionFormat string `protobuf:"bytes,4,opt,name=version_format,json=versionFormat" json:"version_format,omitempty"`
// The detector used to detect this feature. This only exists when present in
// an Ancestry.
Detector *Detector `protobuf:"bytes,5,opt,name=detector" json:"detector,omitempty"`
// The list of vulnerabilities that affect the feature.
Vulnerabilities []*Vulnerability `protobuf:"bytes,5,rep,name=vulnerabilities" json:"vulnerabilities,omitempty"`
Vulnerabilities []*Vulnerability `protobuf:"bytes,6,rep,name=vulnerabilities" json:"vulnerabilities,omitempty"`
}
func (m *Feature) Reset() { *m = Feature{} }
func (m *Feature) String() string { return proto.CompactTextString(m) }
func (*Feature) ProtoMessage() {}
func (*Feature) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
func (*Feature) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (m *Feature) GetName() string {
if m != nil {
@ -155,11 +246,11 @@ func (m *Feature) GetName() string {
return ""
}
func (m *Feature) GetNamespaceName() string {
func (m *Feature) GetNamespace() *Namespace {
if m != nil {
return m.NamespaceName
return m.Namespace
}
return ""
return nil
}
func (m *Feature) GetVersion() string {
@ -176,6 +267,13 @@ func (m *Feature) GetVersionFormat() string {
return ""
}
func (m *Feature) GetDetector() *Detector {
if m != nil {
return m.Detector
}
return nil
}
func (m *Feature) GetVulnerabilities() []*Vulnerability {
if m != nil {
return m.Vulnerabilities
@ -191,7 +289,7 @@ type Layer struct {
func (m *Layer) Reset() { *m = Layer{} }
func (m *Layer) String() string { return proto.CompactTextString(m) }
func (*Layer) ProtoMessage() {}
func (*Layer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (*Layer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func (m *Layer) GetHash() string {
if m != nil {
@ -201,27 +299,18 @@ func (m *Layer) GetHash() string {
}
type ClairStatus struct {
// The configured list of feature listers used to scan an ancestry.
Listers []string `protobuf:"bytes,1,rep,name=listers" json:"listers,omitempty"`
// The configured list of namespace detectors used to scan an ancestry.
Detectors []string `protobuf:"bytes,2,rep,name=detectors" json:"detectors,omitempty"`
// The implemented detectors in this Clair instance
Detectors []*Detector `protobuf:"bytes,1,rep,name=detectors" json:"detectors,omitempty"`
// The time at which the updater last ran.
LastUpdateTime *google_protobuf.Timestamp `protobuf:"bytes,3,opt,name=last_update_time,json=lastUpdateTime" json:"last_update_time,omitempty"`
LastUpdateTime *google_protobuf.Timestamp `protobuf:"bytes,2,opt,name=last_update_time,json=lastUpdateTime" json:"last_update_time,omitempty"`
}
func (m *ClairStatus) Reset() { *m = ClairStatus{} }
func (m *ClairStatus) String() string { return proto.CompactTextString(m) }
func (*ClairStatus) ProtoMessage() {}
func (*ClairStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (*ClairStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (m *ClairStatus) GetListers() []string {
if m != nil {
return m.Listers
}
return nil
}
func (m *ClairStatus) GetDetectors() []string {
func (m *ClairStatus) GetDetectors() []*Detector {
if m != nil {
return m.Detectors
}
@ -243,7 +332,7 @@ type GetAncestryRequest struct {
func (m *GetAncestryRequest) Reset() { *m = GetAncestryRequest{} }
func (m *GetAncestryRequest) String() string { return proto.CompactTextString(m) }
func (*GetAncestryRequest) ProtoMessage() {}
func (*GetAncestryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func (*GetAncestryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (m *GetAncestryRequest) GetAncestryName() string {
if m != nil {
@ -262,7 +351,7 @@ type GetAncestryResponse struct {
func (m *GetAncestryResponse) Reset() { *m = GetAncestryResponse{} }
func (m *GetAncestryResponse) String() string { return proto.CompactTextString(m) }
func (*GetAncestryResponse) ProtoMessage() {}
func (*GetAncestryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (*GetAncestryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (m *GetAncestryResponse) GetAncestry() *GetAncestryResponse_Ancestry {
if m != nil {
@ -289,7 +378,7 @@ func (m *GetAncestryResponse_AncestryLayer) Reset() { *m = GetAncestryRe
func (m *GetAncestryResponse_AncestryLayer) String() string { return proto.CompactTextString(m) }
func (*GetAncestryResponse_AncestryLayer) ProtoMessage() {}
func (*GetAncestryResponse_AncestryLayer) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{5, 0}
return fileDescriptor0, []int{7, 0}
}
func (m *GetAncestryResponse_AncestryLayer) GetLayer() *Layer {
@ -309,18 +398,17 @@ func (m *GetAncestryResponse_AncestryLayer) GetDetectedFeatures() []*Feature {
type GetAncestryResponse_Ancestry struct {
// The name of the desired ancestry.
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
// The configured list of feature listers used to scan this ancestry.
ScannedListers []string `protobuf:"bytes,4,rep,name=scanned_listers,json=scannedListers" json:"scanned_listers,omitempty"`
// The configured list of namespace detectors used to scan an ancestry.
ScannedDetectors []string `protobuf:"bytes,5,rep,name=scanned_detectors,json=scannedDetectors" json:"scanned_detectors,omitempty"`
// The detectors used to scan this Ancestry. It may not be the current set
// of detectors in clair status.
Detectors []*Detector `protobuf:"bytes,2,rep,name=detectors" json:"detectors,omitempty"`
// The list of layers along with detected features in each.
Layers []*GetAncestryResponse_AncestryLayer `protobuf:"bytes,6,rep,name=layers" json:"layers,omitempty"`
Layers []*GetAncestryResponse_AncestryLayer `protobuf:"bytes,3,rep,name=layers" json:"layers,omitempty"`
}
func (m *GetAncestryResponse_Ancestry) Reset() { *m = GetAncestryResponse_Ancestry{} }
func (m *GetAncestryResponse_Ancestry) String() string { return proto.CompactTextString(m) }
func (*GetAncestryResponse_Ancestry) ProtoMessage() {}
func (*GetAncestryResponse_Ancestry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5, 1} }
func (*GetAncestryResponse_Ancestry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 1} }
func (m *GetAncestryResponse_Ancestry) GetName() string {
if m != nil {
@ -329,16 +417,9 @@ func (m *GetAncestryResponse_Ancestry) GetName() string {
return ""
}
func (m *GetAncestryResponse_Ancestry) GetScannedListers() []string {
func (m *GetAncestryResponse_Ancestry) GetDetectors() []*Detector {
if m != nil {
return m.ScannedListers
}
return nil
}
func (m *GetAncestryResponse_Ancestry) GetScannedDetectors() []string {
if m != nil {
return m.ScannedDetectors
return m.Detectors
}
return nil
}
@ -364,7 +445,7 @@ type PostAncestryRequest struct {
func (m *PostAncestryRequest) Reset() { *m = PostAncestryRequest{} }
func (m *PostAncestryRequest) String() string { return proto.CompactTextString(m) }
func (*PostAncestryRequest) ProtoMessage() {}
func (*PostAncestryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (*PostAncestryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (m *PostAncestryRequest) GetAncestryName() string {
if m != nil {
@ -400,7 +481,7 @@ func (m *PostAncestryRequest_PostLayer) Reset() { *m = PostAncestryReque
func (m *PostAncestryRequest_PostLayer) String() string { return proto.CompactTextString(m) }
func (*PostAncestryRequest_PostLayer) ProtoMessage() {}
func (*PostAncestryRequest_PostLayer) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{6, 0}
return fileDescriptor0, []int{8, 0}
}
func (m *PostAncestryRequest_PostLayer) GetHash() string {
@ -432,7 +513,7 @@ type PostAncestryResponse struct {
func (m *PostAncestryResponse) Reset() { *m = PostAncestryResponse{} }
func (m *PostAncestryResponse) String() string { return proto.CompactTextString(m) }
func (*PostAncestryResponse) ProtoMessage() {}
func (*PostAncestryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (*PostAncestryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (m *PostAncestryResponse) GetStatus() *ClairStatus {
if m != nil {
@ -457,7 +538,7 @@ type GetNotificationRequest struct {
func (m *GetNotificationRequest) Reset() { *m = GetNotificationRequest{} }
func (m *GetNotificationRequest) String() string { return proto.CompactTextString(m) }
func (*GetNotificationRequest) ProtoMessage() {}
func (*GetNotificationRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (*GetNotificationRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (m *GetNotificationRequest) GetOldVulnerabilityPage() string {
if m != nil {
@ -495,7 +576,7 @@ type GetNotificationResponse struct {
func (m *GetNotificationResponse) Reset() { *m = GetNotificationResponse{} }
func (m *GetNotificationResponse) String() string { return proto.CompactTextString(m) }
func (*GetNotificationResponse) ProtoMessage() {}
func (*GetNotificationResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (*GetNotificationResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (m *GetNotificationResponse) GetNotification() *GetNotificationResponse_Notification {
if m != nil {
@ -523,7 +604,7 @@ func (m *GetNotificationResponse_Notification) Reset() { *m = GetNotific
func (m *GetNotificationResponse_Notification) String() string { return proto.CompactTextString(m) }
func (*GetNotificationResponse_Notification) ProtoMessage() {}
func (*GetNotificationResponse_Notification) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{9, 0}
return fileDescriptor0, []int{11, 0}
}
func (m *GetNotificationResponse_Notification) GetName() string {
@ -585,7 +666,7 @@ type PagedVulnerableAncestries struct {
func (m *PagedVulnerableAncestries) Reset() { *m = PagedVulnerableAncestries{} }
func (m *PagedVulnerableAncestries) String() string { return proto.CompactTextString(m) }
func (*PagedVulnerableAncestries) ProtoMessage() {}
func (*PagedVulnerableAncestries) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (*PagedVulnerableAncestries) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (m *PagedVulnerableAncestries) GetCurrentPage() string {
if m != nil {
@ -638,7 +719,7 @@ func (m *PagedVulnerableAncestries_IndexedAncestryName) String() string {
}
func (*PagedVulnerableAncestries_IndexedAncestryName) ProtoMessage() {}
func (*PagedVulnerableAncestries_IndexedAncestryName) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{10, 0}
return fileDescriptor0, []int{12, 0}
}
func (m *PagedVulnerableAncestries_IndexedAncestryName) GetIndex() int32 {
@ -663,7 +744,7 @@ type MarkNotificationAsReadRequest struct {
func (m *MarkNotificationAsReadRequest) Reset() { *m = MarkNotificationAsReadRequest{} }
func (m *MarkNotificationAsReadRequest) String() string { return proto.CompactTextString(m) }
func (*MarkNotificationAsReadRequest) ProtoMessage() {}
func (*MarkNotificationAsReadRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (*MarkNotificationAsReadRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (m *MarkNotificationAsReadRequest) GetName() string {
if m != nil {
@ -678,7 +759,7 @@ type MarkNotificationAsReadResponse struct {
func (m *MarkNotificationAsReadResponse) Reset() { *m = MarkNotificationAsReadResponse{} }
func (m *MarkNotificationAsReadResponse) String() string { return proto.CompactTextString(m) }
func (*MarkNotificationAsReadResponse) ProtoMessage() {}
func (*MarkNotificationAsReadResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (*MarkNotificationAsReadResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
type GetStatusRequest struct {
}
@ -686,7 +767,7 @@ type GetStatusRequest struct {
func (m *GetStatusRequest) Reset() { *m = GetStatusRequest{} }
func (m *GetStatusRequest) String() string { return proto.CompactTextString(m) }
func (*GetStatusRequest) ProtoMessage() {}
func (*GetStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (*GetStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
type GetStatusResponse struct {
// The status of the current Clair instance.
@ -696,7 +777,7 @@ type GetStatusResponse struct {
func (m *GetStatusResponse) Reset() { *m = GetStatusResponse{} }
func (m *GetStatusResponse) String() string { return proto.CompactTextString(m) }
func (*GetStatusResponse) ProtoMessage() {}
func (*GetStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (*GetStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (m *GetStatusResponse) GetStatus() *ClairStatus {
if m != nil {
@ -707,6 +788,8 @@ func (m *GetStatusResponse) GetStatus() *ClairStatus {
func init() {
proto.RegisterType((*Vulnerability)(nil), "coreos.clair.Vulnerability")
proto.RegisterType((*Detector)(nil), "coreos.clair.Detector")
proto.RegisterType((*Namespace)(nil), "coreos.clair.Namespace")
proto.RegisterType((*Feature)(nil), "coreos.clair.Feature")
proto.RegisterType((*Layer)(nil), "coreos.clair.Layer")
proto.RegisterType((*ClairStatus)(nil), "coreos.clair.ClairStatus")
@ -726,6 +809,7 @@ func init() {
proto.RegisterType((*MarkNotificationAsReadResponse)(nil), "coreos.clair.MarkNotificationAsReadResponse")
proto.RegisterType((*GetStatusRequest)(nil), "coreos.clair.GetStatusRequest")
proto.RegisterType((*GetStatusResponse)(nil), "coreos.clair.GetStatusResponse")
proto.RegisterEnum("coreos.clair.Detector_Type", Detector_Type_name, Detector_Type_value)
}
// Reference imports to suppress errors if they are not otherwise used.
@ -1007,83 +1091,89 @@ var _StatusService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("api/v3/clairpb/clair.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 1237 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0x4b, 0x6f, 0x1b, 0xd5,
0x17, 0xd7, 0xd8, 0x71, 0x1c, 0x1f, 0xdb, 0x49, 0x7a, 0x93, 0xa6, 0x93, 0x49, 0x1f, 0xc9, 0xfc,
0xff, 0x55, 0x4b, 0x8b, 0x6c, 0xe1, 0xb2, 0x68, 0xcb, 0x02, 0xa5, 0x8f, 0x84, 0x4a, 0xa5, 0xaa,
0xa6, 0xd0, 0x05, 0x08, 0x59, 0xd7, 0x33, 0xc7, 0xc9, 0x28, 0xe3, 0x19, 0x33, 0xf7, 0xda, 0x89,
0x55, 0x95, 0x05, 0x5b, 0x76, 0xb0, 0xe0, 0x33, 0xb0, 0xe1, 0x1b, 0xb0, 0x62, 0xcb, 0x02, 0xc1,
0x16, 0x76, 0x2c, 0xf8, 0x02, 0xec, 0xd1, 0x7d, 0x4d, 0x66, 0x12, 0xe7, 0xd1, 0xb2, 0xf2, 0x9c,
0xf7, 0xeb, 0x77, 0xcf, 0x49, 0xc0, 0xa1, 0xc3, 0xb0, 0x3d, 0xbe, 0xd3, 0xf6, 0x23, 0x1a, 0xa6,
0xc3, 0x9e, 0xfa, 0x6d, 0x0d, 0xd3, 0x84, 0x27, 0xa4, 0xe1, 0x27, 0x29, 0x26, 0xac, 0x25, 0x79,
0xce, 0xb5, 0x9d, 0x24, 0xd9, 0x89, 0xb0, 0x2d, 0x65, 0xbd, 0x51, 0xbf, 0xcd, 0xc3, 0x01, 0x32,
0x4e, 0x07, 0x43, 0xa5, 0xee, 0x5c, 0xd6, 0x0a, 0xc2, 0x23, 0x8d, 0xe3, 0x84, 0x53, 0x1e, 0x26,
0x31, 0x53, 0x52, 0xf7, 0xfb, 0x12, 0x34, 0x5f, 0x8e, 0xa2, 0x18, 0x53, 0xda, 0x0b, 0xa3, 0x90,
0x4f, 0x08, 0x81, 0x99, 0x98, 0x0e, 0xd0, 0xb6, 0xd6, 0xad, 0x9b, 0x35, 0x4f, 0x7e, 0x93, 0xeb,
0x30, 0x2f, 0x7e, 0xd9, 0x90, 0xfa, 0xd8, 0x95, 0xd2, 0x92, 0x94, 0x36, 0x33, 0xee, 0x33, 0xa1,
0xb6, 0x0e, 0xf5, 0x00, 0x99, 0x9f, 0x86, 0x43, 0x11, 0xc2, 0x2e, 0x4b, 0x9d, 0x3c, 0x4b, 0x38,
0x8f, 0xc2, 0x78, 0xcf, 0x9e, 0x51, 0xce, 0xc5, 0x37, 0x71, 0x60, 0x8e, 0xe1, 0x18, 0xd3, 0x90,
0x4f, 0xec, 0x8a, 0xe4, 0x67, 0xb4, 0x90, 0x0d, 0x90, 0xd3, 0x80, 0x72, 0x6a, 0xcf, 0x2a, 0x99,
0xa1, 0xc9, 0x2a, 0xcc, 0xf5, 0xc3, 0x03, 0x0c, 0xba, 0xbd, 0x89, 0x5d, 0x95, 0xb2, 0xaa, 0xa4,
0x1f, 0x4c, 0xc8, 0x03, 0xb8, 0x40, 0xfb, 0x7d, 0xf4, 0x39, 0x06, 0xdd, 0x31, 0xa6, 0x4c, 0x14,
0x6c, 0xcf, 0xad, 0x97, 0x6f, 0xd6, 0x3b, 0x17, 0x5b, 0xf9, 0xf6, 0xb5, 0xb6, 0x90, 0xf2, 0x51,
0x8a, 0xde, 0xa2, 0xd1, 0x7f, 0xa9, 0xd5, 0xdd, 0x5f, 0x2c, 0xa8, 0x6a, 0xe9, 0x7f, 0xe9, 0x89,
0x0d, 0x55, 0x9d, 0x81, 0xee, 0x87, 0x21, 0x85, 0x03, 0xfd, 0xd9, 0xed, 0x27, 0xe9, 0x80, 0x72,
0xdd, 0x95, 0xa6, 0xe6, 0x6e, 0x49, 0x26, 0x79, 0x0c, 0x0b, 0xe3, 0xdc, 0x80, 0x42, 0x64, 0x76,
0x45, 0x56, 0xb2, 0x56, 0xac, 0xa4, 0x30, 0x45, 0xef, 0xa8, 0x8d, 0xbb, 0x06, 0x95, 0xa7, 0x74,
0x82, 0xa9, 0xa8, 0x65, 0x97, 0xb2, 0x5d, 0x53, 0x8b, 0xf8, 0x76, 0xbf, 0xb1, 0xa0, 0xfe, 0x50,
0x78, 0x79, 0xc1, 0x29, 0x1f, 0x31, 0x91, 0x74, 0x14, 0x32, 0x8e, 0x29, 0xb3, 0xad, 0xf5, 0xb2,
0x48, 0x5a, 0x93, 0xe4, 0x32, 0xd4, 0x02, 0xe4, 0xe8, 0xf3, 0x24, 0x65, 0x76, 0x49, 0xca, 0x0e,
0x19, 0xe4, 0x11, 0x2c, 0x46, 0x94, 0xf1, 0xee, 0x68, 0x18, 0x50, 0x8e, 0x5d, 0x01, 0x45, 0x59,
0x75, 0xbd, 0xe3, 0xb4, 0x14, 0x0c, 0x5b, 0x06, 0xa7, 0xad, 0x4f, 0x0c, 0x4e, 0xbd, 0x79, 0x61,
0xf3, 0xa9, 0x34, 0x11, 0x4c, 0xf7, 0x1e, 0x90, 0x6d, 0xe4, 0x9b, 0xb1, 0x8f, 0x8c, 0xa7, 0x13,
0x0f, 0xbf, 0x1c, 0x21, 0xe3, 0xe4, 0x7f, 0xd0, 0xa4, 0x9a, 0xd5, 0xcd, 0x0d, 0xa3, 0x61, 0x98,
0xa2, 0xdb, 0xee, 0xaf, 0x65, 0x58, 0x2a, 0xd8, 0xb2, 0x61, 0x12, 0x33, 0x24, 0x5b, 0x30, 0x67,
0xf4, 0xa4, 0x5d, 0xbd, 0x73, 0xab, 0xd8, 0xbd, 0x29, 0x46, 0xad, 0x8c, 0x91, 0xd9, 0x92, 0xf7,
0x60, 0x96, 0xc9, 0x16, 0xc9, 0x61, 0xd7, 0x3b, 0xab, 0x45, 0x2f, 0xb9, 0x1e, 0x7a, 0x5a, 0xd1,
0xf9, 0x0a, 0x9a, 0xc6, 0x91, 0x1a, 0xc0, 0x3b, 0x50, 0x89, 0xc4, 0x87, 0x4e, 0x64, 0xa9, 0xe8,
0x42, 0xea, 0x78, 0x4a, 0x43, 0xe0, 0x58, 0x35, 0x17, 0x83, 0x6e, 0x5f, 0x61, 0x51, 0x75, 0xfd,
0x64, 0x1c, 0x1b, 0x7d, 0xcd, 0x60, 0xce, 0x4f, 0x16, 0xcc, 0x99, 0x04, 0xa6, 0x02, 0xf9, 0x06,
0x2c, 0x30, 0x9f, 0xc6, 0x31, 0x06, 0x5d, 0x33, 0xf4, 0x19, 0x39, 0xd8, 0x79, 0xcd, 0x7e, 0xaa,
0x67, 0x7f, 0x1b, 0x2e, 0x18, 0xc5, 0x43, 0x0c, 0x54, 0xa4, 0xea, 0xa2, 0x16, 0x3c, 0xca, 0xa0,
0xb0, 0x0d, 0xb3, 0xb2, 0x06, 0x66, 0xcf, 0xca, 0x7c, 0xdb, 0xe7, 0xef, 0xb7, 0x6a, 0x81, 0x36,
0x77, 0xff, 0x2c, 0xc1, 0xd2, 0xf3, 0x84, 0xbd, 0x15, 0x1e, 0xc8, 0x0a, 0xcc, 0xea, 0xb7, 0xa5,
0x1e, 0xa7, 0xa6, 0xc8, 0xc3, 0x2c, 0xbb, 0xb2, 0xcc, 0xee, 0x76, 0x31, 0xbb, 0x29, 0xf1, 0x24,
0xaf, 0x90, 0x99, 0xf3, 0xb3, 0x05, 0xb5, 0x8c, 0x3b, 0xed, 0x5d, 0x09, 0xde, 0x90, 0xf2, 0x5d,
0x1d, 0x5c, 0x7e, 0x13, 0x0f, 0xaa, 0xbb, 0x48, 0x83, 0xc3, 0xd8, 0x77, 0xdf, 0x20, 0x76, 0xeb,
0x23, 0x65, 0xfa, 0x38, 0x16, 0x52, 0xe3, 0xc8, 0xb9, 0x0f, 0x8d, 0xbc, 0x80, 0x2c, 0x42, 0x79,
0x0f, 0x27, 0x3a, 0x15, 0xf1, 0x49, 0x96, 0xa1, 0x32, 0xa6, 0xd1, 0xc8, 0x2c, 0x29, 0x45, 0xdc,
0x2f, 0xdd, 0xb5, 0xdc, 0x27, 0xb0, 0x5c, 0x0c, 0xa9, 0x9f, 0xcc, 0x21, 0xd4, 0xad, 0x73, 0x42,
0xdd, 0xfd, 0xd1, 0x82, 0x95, 0x6d, 0xe4, 0xcf, 0x12, 0x1e, 0xf6, 0x43, 0x5f, 0xde, 0x19, 0x33,
0xad, 0xf7, 0x61, 0x25, 0x89, 0x82, 0x6e, 0x7e, 0x2b, 0x4d, 0xba, 0x43, 0xba, 0x63, 0xc6, 0xb6,
0x9c, 0x44, 0x41, 0x61, 0x83, 0x3d, 0xa7, 0x3b, 0x28, 0xac, 0x62, 0xdc, 0x9f, 0x66, 0xa5, 0xca,
0x58, 0x8e, 0x71, 0xff, 0xb8, 0xd5, 0x32, 0x54, 0xa2, 0x70, 0x10, 0x72, 0xb9, 0x7a, 0x2a, 0x9e,
0x22, 0x32, 0xe8, 0xcf, 0x1c, 0x42, 0xdf, 0xfd, 0xa3, 0x04, 0x97, 0x8e, 0x25, 0xac, 0xeb, 0x7f,
0x09, 0x8d, 0x38, 0xc7, 0xd7, 0x5d, 0xe8, 0x1c, 0x83, 0xf1, 0x34, 0xe3, 0x56, 0x81, 0x59, 0xf0,
0xe3, 0xfc, 0x6d, 0x41, 0x23, 0x2f, 0x9e, 0xfa, 0x26, 0x6d, 0xa8, 0xfa, 0x29, 0x52, 0x8e, 0x81,
0xae, 0xd4, 0x90, 0xe2, 0x22, 0x2a, 0x77, 0x18, 0xe8, 0x83, 0x92, 0xd1, 0xc2, 0x2a, 0xc0, 0x08,
0x85, 0x95, 0xaa, 0xd2, 0x90, 0xe4, 0x1e, 0x94, 0x93, 0x28, 0x90, 0xe7, 0xb5, 0xde, 0xb9, 0x71,
0x04, 0x70, 0x74, 0x07, 0xb3, 0xde, 0x47, 0xa8, 0x81, 0x10, 0x22, 0xf3, 0x84, 0x8d, 0x30, 0x8d,
0x71, 0x5f, 0x5e, 0xdf, 0x37, 0x31, 0x8d, 0x71, 0xdf, 0xfd, 0xad, 0x04, 0xab, 0x27, 0xaa, 0x90,
0x0d, 0x68, 0xf8, 0xa3, 0x34, 0xc5, 0x98, 0xe7, 0x81, 0x50, 0xd7, 0x3c, 0x39, 0xc9, 0x35, 0xa8,
0xc5, 0x78, 0xc0, 0xf3, 0x23, 0x9f, 0x13, 0x8c, 0x53, 0xc6, 0xbc, 0x09, 0xcd, 0x02, 0x5c, 0x64,
0x27, 0xce, 0x38, 0x96, 0x45, 0x0b, 0xf2, 0x39, 0x00, 0xcd, 0xd2, 0xd4, 0xc7, 0xf6, 0x83, 0x73,
0x16, 0xde, 0x7a, 0x12, 0x07, 0x78, 0x80, 0xc1, 0x66, 0x6e, 0x0b, 0x79, 0x39, 0x77, 0xce, 0x87,
0xb0, 0x34, 0x45, 0x45, 0x14, 0x13, 0x0a, 0xb6, 0xec, 0x42, 0xc5, 0x53, 0x44, 0x06, 0x8d, 0x52,
0x0e, 0xb3, 0x77, 0xe0, 0xca, 0xc7, 0x34, 0xdd, 0xcb, 0x43, 0x68, 0x93, 0x79, 0x48, 0x03, 0xf3,
0xd4, 0xa6, 0xe0, 0xc9, 0x5d, 0x87, 0xab, 0x27, 0x19, 0x29, 0xc4, 0xba, 0x04, 0x16, 0xb7, 0x91,
0xeb, 0x07, 0xad, 0x3c, 0xb9, 0x5b, 0x70, 0x21, 0xc7, 0x7b, 0xeb, 0xbd, 0xd0, 0xf9, 0xc7, 0x82,
0x05, 0x53, 0xed, 0x0b, 0x4c, 0xc7, 0xa1, 0x8f, 0x64, 0x04, 0xf5, 0xdc, 0x0d, 0x20, 0xeb, 0xa7,
0x9c, 0x07, 0x99, 0x8c, 0xb3, 0x71, 0xe6, 0x01, 0x71, 0x37, 0xbe, 0xfe, 0xfd, 0xaf, 0xef, 0x4a,
0x6b, 0x64, 0xb5, 0x6d, 0x8e, 0x40, 0xfb, 0x55, 0xe1, 0x46, 0xbc, 0x26, 0x7b, 0xd0, 0xc8, 0x6f,
0x3b, 0xb2, 0x71, 0xe6, 0xf2, 0x75, 0xdc, 0xd3, 0x54, 0x74, 0xe4, 0x65, 0x19, 0x79, 0xde, 0xad,
0x65, 0x91, 0xef, 0x5b, 0xb7, 0x3a, 0x3f, 0x94, 0x60, 0x29, 0xdf, 0x72, 0x53, 0xfb, 0x6b, 0x58,
0x38, 0xb2, 0x38, 0xc8, 0xff, 0xcf, 0xd8, 0x2b, 0x2a, 0x95, 0xeb, 0xe7, 0xda, 0x3e, 0xee, 0x15,
0x99, 0xcd, 0x25, 0x72, 0xb1, 0x9d, 0xdf, 0x3c, 0xac, 0xfd, 0x4a, 0xf5, 0xe0, 0x5b, 0x0b, 0x56,
0xa6, 0xa3, 0x81, 0x1c, 0xb9, 0x83, 0xa7, 0x02, 0xcd, 0x79, 0xf7, 0x7c, 0xca, 0xc5, 0xa4, 0x6e,
0x4d, 0x4f, 0xaa, 0x13, 0x43, 0x53, 0xa1, 0xc6, 0x34, 0xe9, 0x0b, 0xa8, 0x65, 0xe0, 0x23, 0x57,
0x8f, 0x15, 0x5e, 0x40, 0xaa, 0x73, 0xed, 0x44, 0xb9, 0x8e, 0xbe, 0x20, 0xa3, 0xd7, 0x48, 0xb5,
0xad, 0x30, 0xf9, 0xe0, 0x2a, 0x2c, 0xf9, 0xc9, 0xa0, 0x68, 0x36, 0xec, 0x7d, 0x56, 0xd5, 0xff,
0x71, 0xf5, 0x66, 0xe5, 0x1f, 0xaa, 0x77, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x7b, 0xd2, 0x74,
0xfa, 0x8a, 0x0d, 0x00, 0x00,
// 1334 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x4d, 0x6f, 0x1b, 0xc5,
0x1b, 0xff, 0xaf, 0x13, 0xc7, 0xf6, 0x63, 0x3b, 0x71, 0x27, 0x69, 0xe2, 0x6c, 0xfe, 0x6d, 0x93,
0x85, 0x8a, 0x52, 0x90, 0x2d, 0xdc, 0x22, 0xb5, 0xe5, 0x80, 0xdc, 0xc4, 0x09, 0x91, 0xda, 0x10,
0x6d, 0xd2, 0x48, 0x05, 0x21, 0x6b, 0xe2, 0x7d, 0x9c, 0xac, 0xb2, 0xde, 0x5d, 0x76, 0xc7, 0x49,
0xad, 0xaa, 0x1c, 0xb8, 0x71, 0x43, 0x70, 0xe0, 0xc4, 0x07, 0xe0, 0x82, 0xf8, 0x0e, 0xf0, 0x09,
0xe0, 0x0a, 0x37, 0x0e, 0x7c, 0x01, 0xee, 0x68, 0x66, 0x67, 0x36, 0xbb, 0xc9, 0x26, 0x71, 0x7b,
0xf2, 0xcc, 0xf3, 0xfe, 0xf2, 0x9b, 0xe7, 0x59, 0x83, 0x4e, 0x7d, 0xbb, 0x79, 0x7c, 0xaf, 0xd9,
0x73, 0xa8, 0x1d, 0xf8, 0xfb, 0xd1, 0x6f, 0xc3, 0x0f, 0x3c, 0xe6, 0x91, 0x4a, 0xcf, 0x0b, 0xd0,
0x0b, 0x1b, 0x82, 0xa6, 0xdf, 0x3a, 0xf0, 0xbc, 0x03, 0x07, 0x9b, 0x82, 0xb7, 0x3f, 0xec, 0x37,
0x99, 0x3d, 0xc0, 0x90, 0xd1, 0x81, 0x1f, 0x89, 0xeb, 0xff, 0x97, 0x02, 0xdc, 0x22, 0x75, 0x5d,
0x8f, 0x51, 0x66, 0x7b, 0x6e, 0x18, 0x71, 0x8d, 0x1f, 0x72, 0x50, 0xdd, 0x1b, 0x3a, 0x2e, 0x06,
0x74, 0xdf, 0x76, 0x6c, 0x36, 0x22, 0x04, 0x26, 0x5d, 0x3a, 0xc0, 0xba, 0xb6, 0xac, 0xdd, 0x29,
0x99, 0xe2, 0x4c, 0x6e, 0xc3, 0x34, 0xff, 0x0d, 0x7d, 0xda, 0xc3, 0xae, 0xe0, 0xe6, 0x04, 0xb7,
0x1a, 0x53, 0xb7, 0xb8, 0xd8, 0x32, 0x94, 0x2d, 0x0c, 0x7b, 0x81, 0xed, 0x73, 0x17, 0xf5, 0x09,
0x21, 0x93, 0x24, 0x71, 0xe3, 0x8e, 0xed, 0x1e, 0xd5, 0x27, 0x23, 0xe3, 0xfc, 0x4c, 0x74, 0x28,
0x86, 0x78, 0x8c, 0x81, 0xcd, 0x46, 0xf5, 0xbc, 0xa0, 0xc7, 0x77, 0xce, 0x1b, 0x20, 0xa3, 0x16,
0x65, 0xb4, 0x3e, 0x15, 0xf1, 0xd4, 0x9d, 0x2c, 0x42, 0xb1, 0x6f, 0xbf, 0x40, 0xab, 0xbb, 0x3f,
0xaa, 0x17, 0x04, 0xaf, 0x20, 0xee, 0x8f, 0x47, 0xe4, 0x31, 0x5c, 0xa3, 0xfd, 0x3e, 0xf6, 0x18,
0x5a, 0xdd, 0x63, 0x0c, 0x42, 0x9e, 0x70, 0xbd, 0xb8, 0x3c, 0x71, 0xa7, 0xdc, 0xba, 0xde, 0x48,
0x96, 0xaf, 0xb1, 0x8e, 0x94, 0x0d, 0x03, 0x34, 0x6b, 0x4a, 0x7e, 0x4f, 0x8a, 0x1b, 0xbf, 0x69,
0x50, 0x5c, 0x43, 0x86, 0x3d, 0xe6, 0x05, 0x99, 0x45, 0xa9, 0x43, 0x41, 0xda, 0x96, 0xd5, 0x50,
0x57, 0xd2, 0x84, 0x49, 0x36, 0xf2, 0x51, 0x14, 0x60, 0xba, 0xb5, 0x94, 0xf6, 0xa8, 0x6c, 0x36,
0x76, 0x47, 0x3e, 0x9a, 0x42, 0xd0, 0x78, 0x0e, 0x93, 0xfc, 0x46, 0x16, 0xe1, 0xfa, 0x5a, 0x67,
0xb7, 0xb3, 0xba, 0xfb, 0xa9, 0xd9, 0xdd, 0x7d, 0xbe, 0xdd, 0xe9, 0x6e, 0x6e, 0xed, 0xb5, 0x9f,
0x6c, 0xae, 0xd5, 0xfe, 0x47, 0x96, 0x60, 0x21, 0xcd, 0xda, 0x6a, 0x3f, 0xed, 0xec, 0x6c, 0xb7,
0x57, 0x3b, 0x35, 0xed, 0xbc, 0xde, 0x7a, 0xa7, 0xbd, 0xfb, 0xcc, 0xec, 0xd4, 0x72, 0xc6, 0x0e,
0x94, 0xb6, 0x54, 0x93, 0x32, 0xd3, 0x68, 0x41, 0xd1, 0x92, 0x21, 0x89, 0x3c, 0xca, 0xad, 0xf9,
0xec, 0x80, 0xcd, 0x58, 0xce, 0xf8, 0x36, 0x07, 0x05, 0x59, 0xb9, 0x4c, 0x9b, 0x1f, 0x42, 0x29,
0x46, 0x86, 0x34, 0xba, 0x90, 0x36, 0x1a, 0xc7, 0x64, 0x9e, 0x4a, 0x26, 0x2b, 0x3a, 0x91, 0xae,
0xe8, 0x6d, 0x98, 0x96, 0xc7, 0x6e, 0xdf, 0x0b, 0x06, 0x94, 0x49, 0x04, 0x55, 0x25, 0x75, 0x5d,
0x10, 0x53, 0xb9, 0xe4, 0xc7, 0xcb, 0x85, 0x74, 0x60, 0xe6, 0x38, 0xf1, 0x00, 0x6c, 0x0c, 0xeb,
0x53, 0x02, 0x29, 0x67, 0xfa, 0x96, 0x7a, 0x25, 0xe6, 0x59, 0x1d, 0x63, 0x09, 0xf2, 0x4f, 0xe8,
0x08, 0x05, 0x54, 0x0e, 0x69, 0x78, 0xa8, 0xea, 0xc1, 0xcf, 0xc6, 0x37, 0x1a, 0x94, 0x57, 0xb9,
0x95, 0x1d, 0x46, 0xd9, 0x30, 0x24, 0xf7, 0xa1, 0xa4, 0xfc, 0x87, 0x75, 0x4d, 0x78, 0xbb, 0x28,
0xd0, 0x53, 0x41, 0xb2, 0x06, 0x35, 0x87, 0x86, 0xac, 0x3b, 0xf4, 0x2d, 0xca, 0xb0, 0xcb, 0x1f,
0xba, 0x2c, 0xae, 0xde, 0x88, 0x1e, 0x79, 0x43, 0x4d, 0x81, 0xc6, 0xae, 0x9a, 0x02, 0xe6, 0x34,
0xd7, 0x79, 0x26, 0x54, 0x38, 0xd1, 0x78, 0x08, 0x64, 0x03, 0x59, 0xdb, 0xed, 0x61, 0xc8, 0x82,
0x91, 0x89, 0x5f, 0x0e, 0x31, 0x64, 0xe4, 0x2d, 0xa8, 0x52, 0x49, 0xea, 0x26, 0xda, 0x59, 0x51,
0x44, 0xde, 0x2f, 0xe3, 0x97, 0x09, 0x98, 0x4d, 0xe9, 0x86, 0xbe, 0xe7, 0x86, 0x48, 0xd6, 0xa1,
0xa8, 0xe4, 0x84, 0x5e, 0xb9, 0x75, 0x37, 0x9d, 0x4d, 0x86, 0x52, 0x23, 0x26, 0xc4, 0xba, 0xe4,
0x03, 0x98, 0x0a, 0x45, 0x81, 0x64, 0x5a, 0x8b, 0x69, 0x2b, 0x89, 0x0a, 0x9a, 0x52, 0x50, 0xff,
0x0a, 0xaa, 0xca, 0x50, 0x54, 0xfe, 0x77, 0x21, 0xef, 0xf0, 0x83, 0x0c, 0x64, 0x36, 0x6d, 0x42,
0xc8, 0x98, 0x91, 0x04, 0x9f, 0x12, 0x51, 0x71, 0xd1, 0xea, 0xf6, 0x23, 0x34, 0x73, 0xcf, 0x97,
0x4d, 0x09, 0x25, 0x2f, 0x09, 0xa1, 0xfe, 0xa3, 0x06, 0x45, 0x15, 0x40, 0xe6, 0x53, 0x48, 0xb5,
0x3a, 0x37, 0x6e, 0xab, 0x37, 0x60, 0x4a, 0xc4, 0x18, 0xd6, 0x27, 0x84, 0x4a, 0x73, 0xfc, 0x7a,
0x46, 0x29, 0x4a, 0x75, 0xe3, 0xaf, 0x1c, 0xcc, 0x6e, 0x7b, 0xe1, 0x1b, 0xf5, 0x9b, 0xcc, 0xc3,
0x94, 0x7c, 0x6d, 0xd1, 0x80, 0x93, 0x37, 0xb2, 0x7a, 0x26, 0xba, 0xf7, 0xd2, 0xd1, 0x65, 0xf8,
0x13, 0xb4, 0x54, 0x64, 0xfa, 0xaf, 0x1a, 0x94, 0x62, 0x6a, 0xd6, 0xab, 0xe1, 0x34, 0x9f, 0xb2,
0x43, 0xe9, 0x5c, 0x9c, 0x89, 0x09, 0x85, 0x43, 0xa4, 0xd6, 0xa9, 0xef, 0x07, 0xaf, 0xe1, 0xbb,
0xf1, 0x49, 0xa4, 0xda, 0x71, 0x39, 0x57, 0x19, 0xd2, 0x1f, 0x41, 0x25, 0xc9, 0x20, 0x35, 0x98,
0x38, 0xc2, 0x91, 0x0c, 0x85, 0x1f, 0xc9, 0x1c, 0xe4, 0x8f, 0xa9, 0x33, 0x54, 0x6b, 0x2f, 0xba,
0x3c, 0xca, 0x3d, 0xd0, 0x8c, 0x4d, 0x98, 0x4b, 0xbb, 0x94, 0x4f, 0xe2, 0x14, 0xca, 0xda, 0x98,
0x50, 0x36, 0x7e, 0xd6, 0x60, 0x7e, 0x03, 0xd9, 0x96, 0xc7, 0xec, 0xbe, 0xdd, 0x13, 0x5b, 0x5a,
0x75, 0xeb, 0x3e, 0xcc, 0x7b, 0x8e, 0xd5, 0x4d, 0xce, 0x9c, 0x51, 0xd7, 0xa7, 0x07, 0xaa, 0x6d,
0x73, 0x9e, 0x63, 0xa5, 0xe6, 0xd3, 0x36, 0x3d, 0xe0, 0xd0, 0x9b, 0x77, 0xf1, 0x24, 0x4b, 0x2b,
0x4a, 0x63, 0xce, 0xc5, 0x93, 0xf3, 0x5a, 0x73, 0x90, 0x77, 0xec, 0x81, 0xcd, 0xc4, 0x08, 0xce,
0x9b, 0xd1, 0x25, 0x86, 0xf6, 0xe4, 0x29, 0xb4, 0x8d, 0x3f, 0x73, 0xb0, 0x70, 0x2e, 0x60, 0x99,
0xff, 0x1e, 0x54, 0xdc, 0x04, 0x5d, 0x56, 0xa1, 0x75, 0x0e, 0xc6, 0x59, 0xca, 0x8d, 0x14, 0x31,
0x65, 0x47, 0xff, 0x47, 0x83, 0x4a, 0x92, 0x7d, 0xd1, 0x66, 0xee, 0x05, 0x48, 0x19, 0x5a, 0x6a,
0x33, 0xcb, 0x2b, 0xff, 0x9e, 0x88, 0xcc, 0xa1, 0x25, 0x57, 0x4c, 0x7c, 0xe7, 0x5a, 0x16, 0x3a,
0xc8, 0xb5, 0xa2, 0x2c, 0xd5, 0x95, 0x3c, 0x84, 0x09, 0xcf, 0xb1, 0xe4, 0x46, 0x79, 0xe7, 0x0c,
0xe0, 0xe8, 0x01, 0xc6, 0xb5, 0x77, 0x50, 0x02, 0xc1, 0xc6, 0xd0, 0xe4, 0x3a, 0x5c, 0xd5, 0xc5,
0x13, 0xf1, 0xed, 0xf2, 0x3a, 0xaa, 0x2e, 0x9e, 0x18, 0xbf, 0xe7, 0x60, 0xf1, 0x42, 0x11, 0xb2,
0x02, 0x95, 0xde, 0x30, 0x08, 0xd0, 0x65, 0x49, 0x20, 0x94, 0x25, 0x4d, 0x74, 0x72, 0x09, 0x4a,
0x2e, 0xbe, 0x60, 0xc9, 0x96, 0x17, 0x39, 0xe1, 0x92, 0x36, 0xb7, 0xa1, 0x9a, 0x82, 0x8b, 0xa8,
0xc4, 0x15, 0xab, 0x30, 0xad, 0x41, 0x3e, 0x07, 0xa0, 0x71, 0x98, 0xf5, 0xbc, 0x78, 0xa4, 0x1f,
0x8d, 0x99, 0x78, 0x63, 0xd3, 0xb5, 0xf0, 0x05, 0x5a, 0xed, 0xc4, 0x14, 0x32, 0x13, 0xe6, 0xf4,
0x8f, 0x61, 0x36, 0x43, 0x84, 0x27, 0x63, 0x73, 0xb2, 0xa8, 0x42, 0xde, 0x8c, 0x2e, 0x31, 0x34,
0x72, 0x09, 0xcc, 0xde, 0x83, 0x1b, 0x4f, 0x69, 0x70, 0x94, 0x84, 0x50, 0x3b, 0x34, 0x91, 0x5a,
0xea, 0xa9, 0x65, 0xe0, 0xc9, 0x58, 0x86, 0x9b, 0x17, 0x29, 0x45, 0x88, 0x35, 0x08, 0xd4, 0x36,
0x90, 0xc9, 0x07, 0x1d, 0x59, 0x32, 0xd6, 0xe1, 0x5a, 0x82, 0xf6, 0xc6, 0x73, 0xa1, 0xf5, 0xaf,
0x06, 0x33, 0x2a, 0xdb, 0x1d, 0x0c, 0x8e, 0xed, 0x1e, 0x92, 0x21, 0x94, 0x13, 0x3b, 0x80, 0x2c,
0x5f, 0xb2, 0x1e, 0x44, 0x30, 0xfa, 0xca, 0x95, 0x0b, 0xc4, 0x58, 0xf9, 0xfa, 0x8f, 0xbf, 0xbf,
0xcf, 0x2d, 0x91, 0xc5, 0xa6, 0x5a, 0x02, 0xcd, 0x97, 0xa9, 0x1d, 0xf1, 0x8a, 0x1c, 0x41, 0x25,
0x39, 0xed, 0xc8, 0xca, 0x95, 0xc3, 0x57, 0x37, 0x2e, 0x13, 0x91, 0x9e, 0xe7, 0x84, 0xe7, 0x69,
0xa3, 0x14, 0x7b, 0x7e, 0xa4, 0xdd, 0x6d, 0xfd, 0x94, 0x83, 0xd9, 0x64, 0xc9, 0x55, 0xee, 0xaf,
0x60, 0xe6, 0xcc, 0xe0, 0x20, 0x6f, 0x5f, 0x31, 0x57, 0xa2, 0x50, 0x6e, 0x8f, 0x35, 0x7d, 0x8c,
0x1b, 0x22, 0x9a, 0x05, 0x72, 0xbd, 0x99, 0x9c, 0x3c, 0x61, 0xf3, 0x65, 0x54, 0x83, 0xef, 0x34,
0x98, 0xcf, 0x46, 0x03, 0x39, 0xb3, 0x07, 0x2f, 0x05, 0x9a, 0xfe, 0xfe, 0x78, 0xc2, 0xe9, 0xa0,
0xee, 0x66, 0x07, 0xd5, 0x72, 0xa1, 0x1a, 0xa1, 0x46, 0x15, 0xe9, 0x0b, 0x28, 0xc5, 0xe0, 0x23,
0x37, 0xcf, 0x25, 0x9e, 0x42, 0xaa, 0x7e, 0xeb, 0x42, 0xbe, 0xf4, 0x3e, 0x23, 0xbc, 0x97, 0x48,
0xa1, 0x19, 0x61, 0xf2, 0xf1, 0x4d, 0x98, 0xed, 0x79, 0x83, 0xb4, 0x9a, 0xbf, 0xff, 0x59, 0x41,
0xfe, 0x5f, 0xdd, 0x9f, 0x12, 0x1f, 0xa2, 0xf7, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x9f, 0xd1,
0xa1, 0x1f, 0xc8, 0x0e, 0x00, 0x00,
}

View File

@ -44,17 +44,42 @@ message Vulnerability {
repeated Feature affected_versions = 8;
}
message Detector {
enum Type {
DETECTOR_TYPE_INVALID = 0;
DETECTOR_TYPE_NAMESPACE = 1;
DETECTOR_TYPE_FEATURE = 2;
}
// The name of the detector.
string name = 1;
// The version of the detector.
string version = 2;
// The type of the detector.
Type type = 3;
}
message Namespace {
// The name of the namespace.
string name = 1;
// The detector used to detect the namespace. This only exists when present in
// an Ancestry Feature.
Detector detector = 2;
}
message Feature {
// The name of the feature.
string name = 1;
// The name of the namespace in which the feature is detected.
string namespace_name = 2;
// The namespace in which the feature is detected.
Namespace namespace = 2;
// The specific version of this feature.
string version = 3;
// The format used to parse version numbers for the feature.
string version_format = 4;
// The detector used to detect this feature. This only exists when present in
// an Ancestry.
Detector detector = 5;
// The list of vulnerabilities that affect the feature.
repeated Vulnerability vulnerabilities = 5;
repeated Vulnerability vulnerabilities = 6;
}
message Layer {
@ -77,12 +102,10 @@ service AncestryService {
}
message ClairStatus {
// The configured list of feature listers used to scan an ancestry.
repeated string listers = 1;
// The configured list of namespace detectors used to scan an ancestry.
repeated string detectors = 2;
// The implemented detectors in this Clair instance
repeated Detector detectors = 1;
// The time at which the updater last ran.
google.protobuf.Timestamp last_update_time = 3;
google.protobuf.Timestamp last_update_time = 2;
}
message GetAncestryRequest {
@ -100,12 +123,11 @@ message GetAncestryResponse {
message Ancestry {
// The name of the desired ancestry.
string name = 1;
// The configured list of feature listers used to scan this ancestry.
repeated string scanned_listers = 4;
// The configured list of namespace detectors used to scan an ancestry.
repeated string scanned_detectors = 5;
// The detectors used to scan this Ancestry. It may not be the current set
// of detectors in clair status.
repeated Detector detectors = 2;
// The list of layers along with detected features in each.
repeated AncestryLayer layers = 6;
repeated AncestryLayer layers = 3;
}
// The ancestry requested.
Ancestry ancestry = 1;

View File

@ -163,19 +163,12 @@
"type": "string",
"description": "The name of the desired ancestry."
},
"scanned_listers": {
"detectors": {
"type": "array",
"items": {
"type": "string"
"$ref": "#/definitions/clairDetector"
},
"description": "The configured list of feature listers used to scan this ancestry."
},
"scanned_detectors": {
"type": "array",
"items": {
"type": "string"
},
"description": "The configured list of namespace detectors used to scan an ancestry."
"description": "The detectors used to scan this Ancestry. It may not be the current set\nof detectors in clair status."
},
"layers": {
"type": "array",
@ -268,19 +261,12 @@
"clairClairStatus": {
"type": "object",
"properties": {
"listers": {
"type": "array",
"items": {
"type": "string"
},
"description": "The configured list of feature listers used to scan an ancestry."
},
"detectors": {
"type": "array",
"items": {
"type": "string"
"$ref": "#/definitions/clairDetector"
},
"description": "The configured list of namespace detectors used to scan an ancestry."
"title": "The implemented detectors in this Clair instance"
},
"last_update_time": {
"type": "string",
@ -289,6 +275,32 @@
}
}
},
"clairDetector": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the detector."
},
"version": {
"type": "string",
"description": "The version of the detector."
},
"type": {
"$ref": "#/definitions/clairDetectorType",
"description": "The type of the detector."
}
}
},
"clairDetectorType": {
"type": "string",
"enum": [
"DETECTOR_TYPE_INVALID",
"DETECTOR_TYPE_NAMESPACE",
"DETECTOR_TYPE_FEATURE"
],
"default": "DETECTOR_TYPE_INVALID"
},
"clairFeature": {
"type": "object",
"properties": {
@ -296,9 +308,9 @@
"type": "string",
"description": "The name of the feature."
},
"namespace_name": {
"type": "string",
"description": "The name of the namespace in which the feature is detected."
"namespace": {
"$ref": "#/definitions/clairNamespace",
"description": "The namespace in which the feature is detected."
},
"version": {
"type": "string",
@ -308,6 +320,10 @@
"type": "string",
"description": "The format used to parse version numbers for the feature."
},
"detector": {
"$ref": "#/definitions/clairDetector",
"description": "The detector used to detect this feature. This only exists when present in\nan Ancestry."
},
"vulnerabilities": {
"type": "array",
"items": {
@ -360,6 +376,19 @@
"clairMarkNotificationAsReadResponse": {
"type": "object"
},
"clairNamespace": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the namespace."
},
"detector": {
"$ref": "#/definitions/clairDetector",
"description": "The detector used to detect the namespace. This only exists when present in\nan Ancestry Feature."
}
}
},
"clairPagedVulnerableAncestries": {
"type": "object",
"properties": {

View File

@ -50,7 +50,11 @@ func GetPbAncestryLayer(session database.Session, layer database.AncestryLayer)
return nil, status.Error(codes.Internal, err.Error())
}
for _, feature := range features {
// NOTE(sidac): It's quite inefficient, but the easiest way to implement
// this feature for now, we should refactor the implementation if there's
// any performance issue. It's expected that the number of features is less
// than 1000.
for _, feature := range affectedFeatures {
if !feature.Valid {
return nil, status.Error(codes.Internal, "ancestry feature is not found")
}