From 700362e049e64741d48e666327041c8e9e6649b0 Mon Sep 17 00:00:00 2001 From: Milan Lenco Date: Wed, 27 Nov 2024 12:26:21 +0100 Subject: [PATCH 1/5] Update EVE API to include application network interface order fields Adapter (direct assignment) and NetworkAdapter (VIF) now allow to configure the desired application network interface order. EVE ability to enforce the order is limited, however. Signed-off-by: Milan Lenco --- pkg/pillar/go.mod | 2 +- pkg/pillar/go.sum | 4 +- .../lf-edge/eve-api/go/config/devcommon.pb.go | 51 ++- .../lf-edge/eve-api/go/config/netconfig.pb.go | 241 ++++++------ .../lf-edge/eve-api/go/config/vm.pb.go | 57 ++- .../lf-edge/eve-api/go/info/info.pb.go | 354 +++++++++--------- .../lf-edge/eve-api/go/metrics/metrics.pb.go | 323 ++++++++-------- pkg/pillar/vendor/modules.txt | 2 +- 8 files changed, 573 insertions(+), 461 deletions(-) diff --git a/pkg/pillar/go.mod b/pkg/pillar/go.mod index e7b49bcbd8..9e5ee99d00 100644 --- a/pkg/pillar/go.mod +++ b/pkg/pillar/go.mod @@ -30,7 +30,7 @@ require ( github.com/jaypipes/ghw v0.8.0 github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0 github.com/lf-edge/edge-containers v0.0.0-20240207093504-5dfda0619b80 - github.com/lf-edge/eve-api/go v0.0.0-20241125213346-b026f21b3e75 + github.com/lf-edge/eve-api/go v0.0.0-20241202084032-46c0a58dc84c github.com/lf-edge/eve-libs v0.0.0-20240614221125-6913ec4213f9 github.com/lf-edge/eve/pkg/kube/cnirpc v0.0.0-20240315102754-0f6d1f182e0d github.com/lf-edge/go-qemu v0.0.0-20231121152149-4c467eda0c56 diff --git a/pkg/pillar/go.sum b/pkg/pillar/go.sum index c8ef8ff53e..90d5043ef3 100644 --- a/pkg/pillar/go.sum +++ b/pkg/pillar/go.sum @@ -1432,8 +1432,8 @@ github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xw github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lf-edge/edge-containers v0.0.0-20240207093504-5dfda0619b80 h1:kiqB1Rk8fmWci0idN68azRDJfPxCivD3zNDddWZocFw= github.com/lf-edge/edge-containers v0.0.0-20240207093504-5dfda0619b80/go.mod h1:4yXdumKdTzF0URMtxOl8Xnzdxnoy1QR+2dzfOr4CIZY= -github.com/lf-edge/eve-api/go v0.0.0-20241125213346-b026f21b3e75 h1:vEu+sJLajrsVrBOKSl9+rZZ2tD6kg4Pi4gGiNAT2Cx0= -github.com/lf-edge/eve-api/go v0.0.0-20241125213346-b026f21b3e75/go.mod h1:ot6MhAhBXapUDl/hXklaX4kY88T3uC4PTg0D2wD8DzA= +github.com/lf-edge/eve-api/go v0.0.0-20241202084032-46c0a58dc84c h1:axc1BfKlb6MmvbxPhCMW427b+Wxn7u/5PxdqbvYmm6k= +github.com/lf-edge/eve-api/go v0.0.0-20241202084032-46c0a58dc84c/go.mod h1:ot6MhAhBXapUDl/hXklaX4kY88T3uC4PTg0D2wD8DzA= github.com/lf-edge/eve-libs v0.0.0-20240614221125-6913ec4213f9 h1:blXdD227+xDCsezw8gTlk5Kh0ONb5ZekkH4lLnV4J04= github.com/lf-edge/eve-libs v0.0.0-20240614221125-6913ec4213f9/go.mod h1:bz9uyBFalnRnzXl6A4oAsO7CLJfW01ZR/sT0Frqa6o8= github.com/lf-edge/eve/pkg/kube/cnirpc v0.0.0-20240315102754-0f6d1f182e0d h1:tUBb9M6u42LXwHAYHyh22wJeUUQlTpDkXwRXalpRqbo= diff --git a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/devcommon.pb.go b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/devcommon.pb.go index 00f4471e77..5fbe08dcda 100644 --- a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/devcommon.pb.go +++ b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/devcommon.pb.go @@ -220,6 +220,25 @@ type Adapter struct { Type evecommon.PhyIoType `protobuf:"varint,1,opt,name=type,proto3,enum=org.lfedge.eve.common.PhyIoType" json:"type,omitempty"` Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Short hand name such as "com" from bundle EthVf *EthVF `protobuf:"bytes,3,opt,name=eth_vf,json=ethVf,proto3" json:"eth_vf,omitempty"` // Only relevant for PHY_IO_TYPE_PHY_IO_NET_ETH_VF + // Define the network interface order relative to other directly assigned + // network devices and virtual network adapters. + // Only applies to (assignable) network adapters, i.e. types: "PhyIoNetEth", "PhyIoNetWLAN", + // "PhyIoNetWWAN" and "PhyIoNetEthVF". + // The numbering is across both the "Adapter" (direct assignments) and the "NetworkAdapter" + // (virtual interfaces) lists for a given "AppInstanceConfig", thus every entry in these + // lists, excluding non-networking adapters, must have a unique order number + // (when the "enforce_network_interface_order" is enabled, see "VmConfig"). + // Interface with a lower order value should appear inside the application before + // interface with a higher order value. + // The implementation of this ordering may depend on the hypervisor. For example, + // the hypervisor might virtualize the PCI bus and assign lower PCI addresses to + // interfaces with lower order values. But the actual outcome of interface ordering + // depends on the application and EVE therefore cannot guarantee desired order. + // Since this field was introduced in later versions, older EVE versions do not support + // user-defined interface ordering. For backward compatibility, the user-defined + // order is applied only if "enforce_network_interface_order" is enabled for the given + // application (see "VmConfig", file "vm.proto"). + InterfaceOrder uint32 `protobuf:"varint,4,opt,name=interface_order,json=interfaceOrder,proto3" json:"interface_order,omitempty"` } func (x *Adapter) Reset() { @@ -275,6 +294,13 @@ func (x *Adapter) GetEthVf() *EthVF { return nil } +func (x *Adapter) GetInterfaceOrder() uint32 { + if x != nil { + return x.InterfaceOrder + } + return 0 +} + // Information regarding Virtual Function (VF) customisation type EthVF struct { state protoimpl.MessageState @@ -360,7 +386,7 @@ var file_config_devcommon_proto_rawDesc = []byte{ 0x6f, 0x70, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x34, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x88, 0x01, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb1, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, @@ -369,16 +395,19 @@ var file_config_devcommon_proto_rawDesc = []byte{ 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x74, 0x68, 0x56, - 0x46, 0x52, 0x05, 0x65, 0x74, 0x68, 0x56, 0x66, 0x22, 0x48, 0x0a, 0x05, 0x45, 0x74, 0x68, 0x56, - 0x46, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x76, 0x6c, 0x61, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x6c, 0x61, 0x6e, - 0x49, 0x64, 0x42, 0x3d, 0x0a, 0x15, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, - 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5a, 0x24, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, 0x65, 0x2f, - 0x65, 0x76, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x46, 0x52, 0x05, 0x65, 0x74, 0x68, 0x56, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x22, 0x48, 0x0a, 0x05, 0x45, 0x74, 0x68, 0x56, 0x46, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, + 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x76, 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x42, 0x3d, 0x0a, 0x15, 0x6f, + 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x65, 0x76, 0x65, 0x2d, 0x61, 0x70, 0x69, + 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/netconfig.pb.go b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/netconfig.pb.go index 9aad8a10b5..d70bf26fed 100644 --- a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/netconfig.pb.go +++ b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/netconfig.pb.go @@ -214,6 +214,23 @@ type NetworkAdapter struct { // allow AppInstance to discover other AppInstances // attached to this network instance. Default is false AllowToDiscover bool `protobuf:"varint,42,opt,name=allow_to_discover,json=allowToDiscover,proto3" json:"allow_to_discover,omitempty"` + // Define the network interface order relative to other virtual network adapters + // and directly assigned network devices. + // The numbering is across both the "Adapter" (direct assignments) and the "NetworkAdapter" + // (virtual interfaces) lists for a given "AppInstanceConfig", thus every entry in these + // lists, excluding non-networking adapters, must have a unique order number + // (when the "enforce_network_interface_order" is enabled, see "VmConfig"). + // Interface with a lower order value should appear inside the application before + // interface with a higher order value. + // The implementation of this ordering may depend on the hypervisor. For example, + // the hypervisor might virtualize the PCI bus and assign lower PCI addresses to + // interfaces with lower order values. But the actual outcome of interface ordering + // depends on the application and EVE therefore cannot guarantee desired order. + // Since this field was introduced in later versions, older EVE versions do not support + // user-defined interface ordering. For backward compatibility, the user-defined + // order is applied only if "enforce_network_interface_order" is enabled for the given + // application (see "VmConfig", file "vm.proto"). + InterfaceOrder uint32 `protobuf:"varint,50,opt,name=interface_order,json=interfaceOrder,proto3" json:"interface_order,omitempty"` } func (x *NetworkAdapter) Reset() { @@ -332,6 +349,13 @@ func (x *NetworkAdapter) GetAllowToDiscover() bool { return false } +func (x *NetworkAdapter) GetInterfaceOrder() uint32 { + if x != nil { + return x.InterfaceOrder + } + return 0 +} + type WirelessConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -883,7 +907,7 @@ var file_config_netconfig_proto_rawDesc = []byte{ 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x57, 0x69, 0x72, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x77, 0x69, 0x72, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x4e, 0x65, 0x74, + 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x22, 0xc1, 0x03, 0x0a, 0x0e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x41, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, @@ -909,112 +933,115 @@ var file_config_netconfig_proto_rawDesc = []byte{ 0x73, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x22, 0xcf, 0x01, 0x0a, 0x0e, 0x57, 0x69, 0x72, 0x65, 0x6c, 0x65, 0x73, 0x73, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, - 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x57, 0x69, 0x72, - 0x65, 0x6c, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x47, 0x0a, 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x43, 0x66, 0x67, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, - 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x65, 0x6c, - 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x63, 0x65, 0x6c, - 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x43, 0x66, 0x67, 0x12, 0x3b, 0x0a, 0x07, 0x77, 0x69, 0x66, 0x69, - 0x43, 0x66, 0x67, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x72, 0x67, 0x2e, - 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x57, 0x69, 0x66, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x77, 0x69, - 0x66, 0x69, 0x43, 0x66, 0x67, 0x22, 0x96, 0x02, 0x0a, 0x0e, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, - 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x41, 0x50, 0x4e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x41, 0x50, 0x4e, 0x12, 0x46, 0x0a, 0x05, 0x70, 0x72, - 0x6f, 0x62, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x67, 0x2e, - 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x05, 0x70, 0x72, 0x6f, - 0x62, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x12, - 0x4f, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, - 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, - 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, - 0x6d, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x53, 0x69, 0x6d, 0x53, 0x6c, 0x6f, 0x74, 0x22, 0xab, - 0x01, 0x0a, 0x19, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x4b, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, - 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, - 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x22, 0xfe, 0x02, 0x0a, - 0x13, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x6f, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x69, 0x6d, 0x53, 0x6c, 0x6f, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x61, 0x70, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, - 0x6e, 0x12, 0x50, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, - 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, - 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0a, 0x63, 0x69, - 0x70, 0x68, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x6c, 0x6d, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x50, 0x6c, 0x6d, 0x6e, - 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x5f, 0x72, 0x6f, 0x61, 0x6d, - 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x66, 0x6f, 0x72, 0x62, 0x69, - 0x64, 0x52, 0x6f, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x53, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x2c, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x64, 0x69, 0x6f, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x0d, - 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x61, 0x74, 0x73, 0x22, 0x92, 0x03, - 0x0a, 0x0a, 0x57, 0x69, 0x66, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, - 0x77, 0x69, 0x66, 0x69, 0x53, 0x53, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x77, 0x69, 0x66, 0x69, 0x53, 0x53, 0x49, 0x44, 0x12, 0x42, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6f, 0x72, - 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x57, 0x69, 0x46, 0x69, 0x4b, 0x65, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x06, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, - 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x57, 0x69, 0x66, - 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x52, 0x06, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, - 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x72, - 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, - 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x45, 0x0a, 0x0b, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x6f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x2a, 0xa1, 0x01, 0x0a, 0x14, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x41, - 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1f, 0x0a, 0x1b, 0x43, - 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x50, 0x52, 0x4f, - 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, - 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x50, 0x52, - 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x50, 0x41, 0x50, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, - 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x50, 0x52, - 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0x02, 0x12, 0x27, 0x0a, - 0x23, 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x50, - 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x50, 0x41, 0x50, 0x5f, 0x41, 0x4e, 0x44, 0x5f, - 0x43, 0x48, 0x41, 0x50, 0x10, 0x03, 0x42, 0x3d, 0x0a, 0x15, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, - 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5a, - 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, - 0x64, 0x67, 0x65, 0x2f, 0x65, 0x76, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x76, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, + 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xcf, 0x01, 0x0a, + 0x0e, 0x57, 0x69, 0x72, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x37, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, + 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x57, 0x69, 0x72, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x63, 0x65, 0x6c, 0x6c, + 0x75, 0x6c, 0x61, 0x72, 0x43, 0x66, 0x67, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x43, 0x66, + 0x67, 0x12, 0x3b, 0x0a, 0x07, 0x77, 0x69, 0x66, 0x69, 0x43, 0x66, 0x67, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, + 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x57, 0x69, 0x66, 0x69, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x77, 0x69, 0x66, 0x69, 0x43, 0x66, 0x67, 0x22, 0x96, + 0x02, 0x0a, 0x0e, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x10, 0x0a, 0x03, 0x41, 0x50, 0x4e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x41, 0x50, 0x4e, 0x12, 0x46, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, + 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x75, + 0x6c, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x62, 0x65, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x4f, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0c, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x69, 0x6d, 0x53, 0x6c, 0x6f, 0x74, 0x22, 0xab, 0x01, 0x0a, 0x19, 0x43, 0x65, 0x6c, 0x6c, + 0x75, 0x6c, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x62, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x27, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x62, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4b, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x50, 0x72, 0x6f, 0x62, 0x65, 0x22, 0xfe, 0x02, 0x0a, 0x13, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, + 0x61, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x73, 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x73, 0x69, 0x6d, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, 0x6e, 0x12, 0x50, 0x0a, 0x0d, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, + 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, + 0x61, 0x72, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x0c, + 0x61, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, + 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, + 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x70, + 0x6c, 0x6d, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x64, 0x50, 0x6c, 0x6d, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x6f, + 0x72, 0x62, 0x69, 0x64, 0x5f, 0x72, 0x6f, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x52, 0x6f, 0x61, 0x6d, 0x69, 0x6e, + 0x67, 0x12, 0x53, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x72, + 0x61, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x6f, 0x72, 0x67, 0x2e, + 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x52, 0x61, 0x64, 0x69, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x65, 0x63, + 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x65, 0x64, 0x52, 0x61, 0x74, 0x73, 0x22, 0x92, 0x03, 0x0a, 0x0a, 0x57, 0x69, 0x66, 0x69, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x69, 0x66, 0x69, 0x53, 0x53, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x69, 0x66, 0x69, 0x53, 0x53, 0x49, + 0x44, 0x12, 0x42, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, + 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x57, 0x69, 0x46, + 0x69, 0x4b, 0x65, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, + 0x06, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x57, 0x69, 0x66, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x06, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x12, 0x42, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x1e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, + 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x69, 0x70, + 0x68, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x44, 0x61, 0x74, 0x61, 0x1a, 0x45, 0x0a, 0x0b, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2a, 0xa1, 0x01, 0x0a, 0x14, + 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, + 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x4e, + 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, + 0x52, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, + 0x50, 0x41, 0x50, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, + 0x52, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, + 0x43, 0x48, 0x41, 0x50, 0x10, 0x02, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, + 0x41, 0x52, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, + 0x5f, 0x50, 0x41, 0x50, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0x03, 0x42, + 0x3d, 0x0a, 0x15, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, + 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x65, 0x76, 0x65, + 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/vm.pb.go b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/vm.pb.go index 51b861fe3b..3e576d05cc 100644 --- a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/vm.pb.go +++ b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/config/vm.pb.go @@ -191,6 +191,18 @@ type VmConfig struct { EnableVncShimVm bool `protobuf:"varint,22,opt,name=enable_vnc_shim_vm,json=enableVncShimVm,proto3" json:"enable_vnc_shim_vm,omitempty"` // Boot mode: Legacy or UEFI BootMode VmBootMode `protobuf:"varint,23,opt,name=boot_mode,json=bootMode,proto3,enum=org.lfedge.eve.config.VmBootMode" json:"boot_mode,omitempty"` + // Enables enforcement of user-defined ordering for network interfaces. + // This applies to both virtual interfaces (specified in the "AppInstanceConfig.interfaces" list) + // and directly assigned network adapters (specified in the "AppInstanceConfig.adapters" list + // as items of type "PhyIoNetEth", "PhyIoNetWLAN", "PhyIoNetWWAN", and "PhyIoNetEthVF"). + // Note: Older versions of EVE may not support enforcing the user-defined order + // of application network interfaces. The controller can check + // "ZInfoDevice.api_capability" to verify if the configured device supports the + // API capability "API_CAPABILITY_ENFORCED_NET_INTERFACE_ORDER". + // Please beware that EVE's ability to influence the order of VM application interfaces + // is limited. Depending on the application's operating system, achieving the desired network + // interface order might not be possible. + EnforceNetworkInterfaceOrder bool `protobuf:"varint,24,opt,name=enforce_network_interface_order,json=enforceNetworkInterfaceOrder,proto3" json:"enforce_network_interface_order,omitempty"` } func (x *VmConfig) Reset() { @@ -386,12 +398,19 @@ func (x *VmConfig) GetBootMode() VmBootMode { return VmBootMode_VM_BOOT_MODE_UNSPECIFIED } +func (x *VmConfig) GetEnforceNetworkInterfaceOrder() bool { + if x != nil { + return x.EnforceNetworkInterfaceOrder + } + return false +} + var File_config_vm_proto protoreflect.FileDescriptor var file_config_vm_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, - 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xdb, 0x05, 0x0a, 0x08, 0x56, 0x6d, 0x43, + 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa2, 0x06, 0x0a, 0x08, 0x56, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x6d, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, @@ -437,22 +456,26 @@ var file_config_vm_proto_rawDesc = []byte{ 0x6f, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, 0x6d, 0x42, 0x6f, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x62, 0x6f, - 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x2a, 0x47, 0x0a, 0x06, 0x56, 0x6d, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x06, 0x0a, 0x02, 0x50, 0x56, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x56, 0x4d, 0x10, - 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x6c, 0x65, 0x72, 0x10, 0x02, 0x12, 0x07, 0x0a, - 0x03, 0x46, 0x4d, 0x4c, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x48, 0x59, 0x50, 0x45, - 0x52, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x10, 0x05, 0x2a, - 0x5a, 0x0a, 0x0a, 0x56, 0x6d, 0x42, 0x6f, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, - 0x18, 0x56, 0x4d, 0x5f, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x56, - 0x4d, 0x5f, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4c, 0x45, 0x47, 0x41, - 0x43, 0x59, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x4d, 0x5f, 0x42, 0x4f, 0x4f, 0x54, 0x5f, - 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x45, 0x46, 0x49, 0x10, 0x02, 0x42, 0x3d, 0x0a, 0x15, 0x6f, - 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x65, 0x76, 0x65, 0x2d, 0x61, 0x70, 0x69, - 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x1f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x1c, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2a, 0x47, 0x0a, + 0x06, 0x56, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x50, 0x56, 0x10, 0x00, 0x12, + 0x07, 0x0a, 0x03, 0x48, 0x56, 0x4d, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x6c, + 0x65, 0x72, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x4d, 0x4c, 0x10, 0x03, 0x12, 0x0b, 0x0a, + 0x07, 0x4e, 0x4f, 0x48, 0x59, 0x50, 0x45, 0x52, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45, + 0x47, 0x41, 0x43, 0x59, 0x10, 0x05, 0x2a, 0x5a, 0x0a, 0x0a, 0x56, 0x6d, 0x42, 0x6f, 0x6f, 0x74, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x56, 0x4d, 0x5f, 0x42, 0x4f, 0x4f, 0x54, 0x5f, + 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x56, 0x4d, 0x5f, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x4d, 0x4f, + 0x44, 0x45, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x56, + 0x4d, 0x5f, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x45, 0x46, 0x49, + 0x10, 0x02, 0x42, 0x3d, 0x0a, 0x15, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, + 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5a, 0x24, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, 0x65, 0x2f, + 0x65, 0x76, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/info/info.pb.go b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/info/info.pb.go index b23d324850..50bc6f1214 100644 --- a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/info/info.pb.go +++ b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/info/info.pb.go @@ -1020,43 +1020,46 @@ func (StorageTypeInfo) EnumDescriptor() ([]byte, []int) { type APICapability int32 const ( - APICapability_API_CAPABILITY_UNSPECIFIED APICapability = 0 - APICapability_API_CAPABILITY_RETRY_UPDATE APICapability = 1 // BaseOs.retry_update counter supported - APICapability_API_CAPABILITY_SHUTDOWN APICapability = 2 // shutdown DevOpsCmd support - APICapability_API_CAPABILITY_START_DELAY_IN_SECONDS APICapability = 3 // start_delay_in_seconds supported - APICapability_API_CAPABILITY_EDGEVIEW APICapability = 4 // edgeview and edgeview.token supported - APICapability_API_CAPABILITY_VOLUME_SNAPSHOTS APICapability = 5 // Volume snapshots supported - APICapability_API_CAPABILITY_NETWORK_INSTANCE_ROUTING APICapability = 6 // routing config in NetworkInstanceConfig supported - APICapability_API_CAPABILITY_BOOT_MODE APICapability = 7 // Support different boot modes for Edge Applications (VMs) - APICapability_API_CAPABILITY_MTU APICapability = 8 // Allows to set MTU for network adapters and network instances - APICapability_API_CAPABILITY_ADAPTER_USER_LABELS APICapability = 9 // Supports user-defined shared network adapter labels + APICapability_API_CAPABILITY_UNSPECIFIED APICapability = 0 + APICapability_API_CAPABILITY_RETRY_UPDATE APICapability = 1 // BaseOs.retry_update counter supported + APICapability_API_CAPABILITY_SHUTDOWN APICapability = 2 // shutdown DevOpsCmd support + APICapability_API_CAPABILITY_START_DELAY_IN_SECONDS APICapability = 3 // start_delay_in_seconds supported + APICapability_API_CAPABILITY_EDGEVIEW APICapability = 4 // edgeview and edgeview.token supported + APICapability_API_CAPABILITY_VOLUME_SNAPSHOTS APICapability = 5 // Volume snapshots supported + APICapability_API_CAPABILITY_NETWORK_INSTANCE_ROUTING APICapability = 6 // routing config in NetworkInstanceConfig supported + APICapability_API_CAPABILITY_BOOT_MODE APICapability = 7 // Support different boot modes for Edge Applications (VMs) + APICapability_API_CAPABILITY_MTU APICapability = 8 // Allows to set MTU for network adapters and network instances + APICapability_API_CAPABILITY_ADAPTER_USER_LABELS APICapability = 9 // Supports user-defined shared network adapter labels + APICapability_API_CAPABILITY_ENFORCED_NET_INTERFACE_ORDER APICapability = 10 // EVE is able to enforce the user-defined order of application network interfaces ) // Enum value maps for APICapability. var ( APICapability_name = map[int32]string{ - 0: "API_CAPABILITY_UNSPECIFIED", - 1: "API_CAPABILITY_RETRY_UPDATE", - 2: "API_CAPABILITY_SHUTDOWN", - 3: "API_CAPABILITY_START_DELAY_IN_SECONDS", - 4: "API_CAPABILITY_EDGEVIEW", - 5: "API_CAPABILITY_VOLUME_SNAPSHOTS", - 6: "API_CAPABILITY_NETWORK_INSTANCE_ROUTING", - 7: "API_CAPABILITY_BOOT_MODE", - 8: "API_CAPABILITY_MTU", - 9: "API_CAPABILITY_ADAPTER_USER_LABELS", + 0: "API_CAPABILITY_UNSPECIFIED", + 1: "API_CAPABILITY_RETRY_UPDATE", + 2: "API_CAPABILITY_SHUTDOWN", + 3: "API_CAPABILITY_START_DELAY_IN_SECONDS", + 4: "API_CAPABILITY_EDGEVIEW", + 5: "API_CAPABILITY_VOLUME_SNAPSHOTS", + 6: "API_CAPABILITY_NETWORK_INSTANCE_ROUTING", + 7: "API_CAPABILITY_BOOT_MODE", + 8: "API_CAPABILITY_MTU", + 9: "API_CAPABILITY_ADAPTER_USER_LABELS", + 10: "API_CAPABILITY_ENFORCED_NET_INTERFACE_ORDER", } APICapability_value = map[string]int32{ - "API_CAPABILITY_UNSPECIFIED": 0, - "API_CAPABILITY_RETRY_UPDATE": 1, - "API_CAPABILITY_SHUTDOWN": 2, - "API_CAPABILITY_START_DELAY_IN_SECONDS": 3, - "API_CAPABILITY_EDGEVIEW": 4, - "API_CAPABILITY_VOLUME_SNAPSHOTS": 5, - "API_CAPABILITY_NETWORK_INSTANCE_ROUTING": 6, - "API_CAPABILITY_BOOT_MODE": 7, - "API_CAPABILITY_MTU": 8, - "API_CAPABILITY_ADAPTER_USER_LABELS": 9, + "API_CAPABILITY_UNSPECIFIED": 0, + "API_CAPABILITY_RETRY_UPDATE": 1, + "API_CAPABILITY_SHUTDOWN": 2, + "API_CAPABILITY_START_DELAY_IN_SECONDS": 3, + "API_CAPABILITY_EDGEVIEW": 4, + "API_CAPABILITY_VOLUME_SNAPSHOTS": 5, + "API_CAPABILITY_NETWORK_INSTANCE_ROUTING": 6, + "API_CAPABILITY_BOOT_MODE": 7, + "API_CAPABILITY_MTU": 8, + "API_CAPABILITY_ADAPTER_USER_LABELS": 9, + "API_CAPABILITY_ENFORCED_NET_INTERFACE_ORDER": 10, } ) @@ -9703,8 +9706,8 @@ var file_info_info_proto_rawDesc = []byte{ 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x45, 0x58, 0x54, 0x34, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x5a, 0x46, 0x53, 0x10, 0x02, 0x2a, 0xe5, - 0x02, 0x0a, 0x0d, 0x41, 0x50, 0x49, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x5a, 0x46, 0x53, 0x10, 0x02, 0x2a, 0x96, + 0x03, 0x0a, 0x0d, 0x41, 0x50, 0x49, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x5f, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x50, 0x49, 0x5f, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, @@ -9726,150 +9729,153 @@ var file_info_info_proto_rawDesc = []byte{ 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4d, 0x54, 0x55, 0x10, 0x08, 0x12, 0x26, 0x0a, 0x22, 0x41, 0x50, 0x49, 0x5f, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x41, 0x44, 0x41, 0x50, 0x54, 0x45, 0x52, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4c, 0x41, - 0x42, 0x45, 0x4c, 0x53, 0x10, 0x09, 0x2a, 0xb9, 0x03, 0x0a, 0x0a, 0x42, 0x6f, 0x6f, 0x74, 0x52, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, - 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, - 0x4e, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, 0x4f, - 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54, 0x5f, - 0x43, 0x4d, 0x44, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, - 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, - 0x14, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x4c, - 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, 0x5f, - 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, - 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x4f, - 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x4f, 0x4d, 0x10, 0x07, 0x12, - 0x1d, 0x0a, 0x19, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x57, - 0x41, 0x54, 0x43, 0x48, 0x44, 0x4f, 0x47, 0x5f, 0x48, 0x55, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x1c, - 0x0a, 0x18, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x57, 0x41, - 0x54, 0x43, 0x48, 0x44, 0x4f, 0x47, 0x5f, 0x50, 0x49, 0x44, 0x10, 0x09, 0x12, 0x16, 0x0a, 0x12, - 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x52, 0x4e, - 0x45, 0x4c, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, - 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x0b, - 0x12, 0x17, 0x0a, 0x13, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x0c, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, 0x4f, - 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x46, - 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, 0x4f, 0x54, 0x5f, - 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x4f, 0x46, 0x46, 0x5f, - 0x43, 0x4d, 0x44, 0x10, 0x0e, 0x12, 0x1b, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, - 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, - 0xff, 0x01, 0x2a, 0xbe, 0x01, 0x0a, 0x15, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x1c, - 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, - 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x2a, - 0x0a, 0x26, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, - 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x52, - 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x4d, 0x41, - 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x52, - 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4c, 0x4f, 0x43, 0x4b, - 0x45, 0x44, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x4d, 0x41, 0x49, 0x4e, 0x54, - 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, - 0x4f, 0x4e, 0x5f, 0x4c, 0x4f, 0x57, 0x5f, 0x44, 0x49, 0x53, 0x4b, 0x5f, 0x53, 0x50, 0x41, 0x43, - 0x45, 0x10, 0x03, 0x2a, 0xb5, 0x02, 0x0a, 0x10, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x54, 0x54, 0x45, - 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x41, + 0x42, 0x45, 0x4c, 0x53, 0x10, 0x09, 0x12, 0x2f, 0x0a, 0x2b, 0x41, 0x50, 0x49, 0x5f, 0x43, 0x41, + 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x45, 0x4e, 0x46, 0x4f, 0x52, 0x43, 0x45, + 0x44, 0x5f, 0x4e, 0x45, 0x54, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x0a, 0x2a, 0xb9, 0x03, 0x0a, 0x0a, 0x42, 0x6f, 0x6f, 0x74, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, + 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54, + 0x5f, 0x43, 0x4d, 0x44, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x18, + 0x0a, 0x14, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x41, + 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, + 0x43, 0x54, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x42, + 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x4f, 0x4d, 0x10, 0x07, + 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, + 0x57, 0x41, 0x54, 0x43, 0x48, 0x44, 0x4f, 0x47, 0x5f, 0x48, 0x55, 0x4e, 0x47, 0x10, 0x08, 0x12, + 0x1c, 0x0a, 0x18, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x57, + 0x41, 0x54, 0x43, 0x48, 0x44, 0x4f, 0x47, 0x5f, 0x50, 0x49, 0x44, 0x10, 0x09, 0x12, 0x16, 0x0a, + 0x12, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x52, + 0x4e, 0x45, 0x4c, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, + 0x0b, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x0c, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, + 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x55, 0x4c, 0x54, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, 0x4f, 0x54, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x4f, 0x46, 0x46, + 0x5f, 0x43, 0x4d, 0x44, 0x10, 0x0e, 0x12, 0x1b, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, + 0x10, 0xff, 0x01, 0x2a, 0xbe, 0x01, 0x0a, 0x15, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x20, 0x0a, + 0x1c, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, + 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, + 0x2a, 0x0a, 0x26, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, + 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, + 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x4d, + 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4c, 0x4f, 0x43, + 0x4b, 0x45, 0x44, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x4d, 0x41, 0x49, 0x4e, + 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x4f, 0x57, 0x5f, 0x44, 0x49, 0x53, 0x4b, 0x5f, 0x53, 0x50, 0x41, + 0x43, 0x45, 0x10, 0x03, 0x2a, 0xb5, 0x02, 0x0a, 0x10, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x54, 0x54, + 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, + 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x01, 0x12, 0x24, + 0x0a, 0x20, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x54, 0x50, 0x4d, 0x5f, 0x51, 0x55, 0x4f, 0x54, 0x45, 0x5f, 0x57, 0x41, + 0x49, 0x54, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x50, 0x4d, 0x5f, 0x45, 0x53, + 0x43, 0x52, 0x4f, 0x57, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x4e, 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, - 0x20, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x54, 0x50, 0x4d, 0x5f, 0x51, 0x55, 0x4f, 0x54, 0x45, 0x5f, 0x57, 0x41, 0x49, - 0x54, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x50, 0x4d, 0x5f, 0x45, 0x53, 0x43, - 0x52, 0x4f, 0x57, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x54, - 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x04, 0x12, 0x28, 0x0a, - 0x24, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x45, 0x53, 0x43, 0x52, 0x4f, 0x57, - 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x05, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x54, 0x54, 0x45, 0x53, - 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x06, 0x12, 0x1e, 0x0a, 0x1a, 0x41, - 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x07, 0x2a, 0x8b, 0x01, 0x0a, 0x13, - 0x41, 0x70, 0x70, 0x49, 0x6e, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, - 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, - 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, - 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, 0x01, 0x12, 0x29, - 0x0a, 0x25, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x5f, - 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x02, 0x2a, 0x61, 0x0a, 0x0c, 0x57, 0x69, 0x72, - 0x65, 0x6c, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x57, 0x49, 0x52, - 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x57, 0x49, 0x52, 0x45, - 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x46, 0x49, 0x10, 0x01, - 0x12, 0x1a, 0x0a, 0x16, 0x57, 0x49, 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x0c, - 0x42, 0x61, 0x73, 0x65, 0x4f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x4f, 0x57, 0x4e, 0x4c, 0x4f, - 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x4f, 0x57, 0x4e, 0x4c, - 0x4f, 0x41, 0x44, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x50, - 0x44, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x50, 0x44, 0x41, - 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, 0x43, - 0x4b, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x06, 0x2a, - 0xcb, 0x01, 0x0a, 0x0f, 0x42, 0x61, 0x73, 0x65, 0x4f, 0x73, 0x53, 0x75, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x4f, 0x4e, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x4f, 0x57, 0x4e, 0x4c, - 0x4f, 0x41, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, - 0x12, 0x15, 0x0a, 0x11, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x5f, 0x49, 0x4e, 0x50, 0x52, 0x4f, - 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x50, 0x44, 0x41, 0x54, - 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x03, - 0x12, 0x14, 0x0a, 0x10, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x42, 0x4f, 0x4f, - 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, - 0x5f, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x50, - 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, - 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x50, 0x44, 0x41, - 0x54, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x10, 0x07, 0x2a, 0x4b, 0x0a, - 0x0c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, - 0x19, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, - 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x50, - 0x50, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x01, 0x2a, 0xb8, 0x01, 0x0a, 0x16, 0x5a, - 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x26, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, - 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x24, 0x0a, 0x20, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, 0x53, + 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x04, 0x12, 0x28, + 0x0a, 0x24, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x45, 0x53, 0x43, 0x52, 0x4f, + 0x57, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x05, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x54, 0x54, 0x45, + 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, + 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x06, 0x12, 0x1e, 0x0a, 0x1a, + 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x07, 0x2a, 0x8b, 0x01, 0x0a, + 0x13, 0x41, 0x70, 0x70, 0x49, 0x6e, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, 0x54, + 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, + 0x53, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, 0x01, 0x12, + 0x29, 0x0a, 0x25, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, + 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x02, 0x2a, 0x61, 0x0a, 0x0c, 0x57, 0x69, + 0x72, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x57, 0x49, + 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x57, 0x49, 0x52, + 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x46, 0x49, 0x10, + 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x57, 0x49, 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x02, 0x2a, 0x71, 0x0a, + 0x0c, 0x42, 0x61, 0x73, 0x65, 0x4f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x4f, 0x57, 0x4e, 0x4c, + 0x4f, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x4f, 0x57, 0x4e, + 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x55, + 0x50, 0x44, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, + 0x43, 0x4b, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x06, + 0x2a, 0xcb, 0x01, 0x0a, 0x0f, 0x42, 0x61, 0x73, 0x65, 0x4f, 0x73, 0x53, 0x75, 0x62, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x4f, 0x4e, 0x45, 0x5f, 0x53, 0x55, 0x42, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x4f, 0x57, 0x4e, + 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, + 0x01, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x5f, 0x49, 0x4e, 0x50, 0x52, + 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x50, 0x44, 0x41, + 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, + 0x03, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x42, 0x4f, + 0x4f, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x50, 0x44, 0x41, 0x54, + 0x45, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x55, + 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x10, 0x07, 0x2a, 0x4b, + 0x0a, 0x0c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, + 0x0a, 0x19, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, + 0x18, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, + 0x50, 0x50, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x01, 0x2a, 0xb8, 0x01, 0x0a, 0x16, + 0x5a, 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x26, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, + 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, + 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x5a, 0x5f, 0x49, 0x4e, + 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, + 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x5a, 0x5f, 0x49, 0x4e, 0x46, - 0x4f, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, - 0x12, 0x23, 0x0a, 0x1f, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, - 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, - 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x8f, 0x01, 0x0a, 0x0d, 0x5a, 0x49, 0x6e, 0x66, 0x6f, 0x56, - 0x70, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, - 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x56, 0x50, 0x4e, - 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, - 0x0f, 0x56, 0x50, 0x4e, 0x5f, 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x45, 0x44, - 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x56, 0x50, 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, - 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x52, 0x45, 0x4b, - 0x45, 0x59, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x0a, 0x2a, 0x85, 0x01, 0x0a, 0x15, 0x5a, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x17, 0x0a, 0x13, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x5a, 0x4e, - 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, - 0x49, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, - 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x2a, - 0x9e, 0x01, 0x0a, 0x0e, 0x4c, 0x6f, 0x63, 0x52, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, - 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, - 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, - 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, 0x49, - 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4c, 0x4f, - 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4d, 0x45, - 0x44, 0x49, 0x55, 0x4d, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, - 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x04, - 0x42, 0x39, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, - 0x76, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x65, 0x76, 0x65, 0x2d, - 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x8f, 0x01, 0x0a, 0x0d, 0x5a, 0x49, 0x6e, 0x66, 0x6f, + 0x56, 0x70, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, + 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x56, 0x50, + 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, + 0x0a, 0x0f, 0x56, 0x50, 0x4e, 0x5f, 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x45, + 0x44, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x56, 0x50, 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, + 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x52, 0x45, + 0x4b, 0x45, 0x59, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x44, + 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x0a, 0x2a, 0x85, 0x01, 0x0a, 0x15, 0x5a, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x5a, + 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x4e, + 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, + 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, + 0x2a, 0x9e, 0x01, 0x0a, 0x0e, 0x4c, 0x6f, 0x63, 0x52, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, + 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, + 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x4c, 0x4f, 0x57, + 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, + 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4c, + 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4d, + 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x43, 0x5f, 0x52, + 0x45, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, + 0x04, 0x42, 0x39, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, + 0x65, 0x76, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x65, 0x76, 0x65, + 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/metrics/metrics.pb.go b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/metrics/metrics.pb.go index 9dfba40bb7..22135f9d2f 100644 --- a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/metrics/metrics.pb.go +++ b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/metrics/metrics.pb.go @@ -4061,6 +4061,10 @@ type NewlogMetric struct { TooManyRequest uint32 `protobuf:"varint,21,opt,name=tooManyRequest,proto3" json:"tooManyRequest,omitempty"` // counter for gzip files bypassing the uploading to cloud SkipUploadAppFile uint32 `protobuf:"varint,22,opt,name=skipUploadAppFile,proto3" json:"skipUploadAppFile,omitempty"` + // total size of logs on device + TotalSizeLogs uint64 `protobuf:"varint,23,opt,name=total_size_logs,json=totalSizeLogs,proto3" json:"total_size_logs,omitempty"` + // timestamp of the latest device log saved on device + OldestSavedDeviceLog *timestamppb.Timestamp `protobuf:"bytes,24,opt,name=oldest_saved_device_log,json=oldestSavedDeviceLog,proto3" json:"oldest_saved_device_log,omitempty"` } func (x *NewlogMetric) Reset() { @@ -4249,6 +4253,20 @@ func (x *NewlogMetric) GetSkipUploadAppFile() uint32 { return 0 } +func (x *NewlogMetric) GetTotalSizeLogs() uint64 { + if x != nil { + return x.TotalSizeLogs + } + return 0 +} + +func (x *NewlogMetric) GetOldestSavedDeviceLog() *timestamppb.Timestamp { + if x != nil { + return x.OldestSavedDeviceLog + } + return nil +} + // logfileMetrics - is shared for both device log and application log type LogfileMetrics struct { state protoimpl.MessageState @@ -5742,7 +5760,7 @@ var file_metrics_metrics_proto_rawDesc = []byte{ 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x02, 0x63, 0x6d, 0x42, 0x0f, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xa1, 0x09, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x6c, 0x6f, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x9c, 0x0a, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x6c, 0x6f, 0x67, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x48, 0x0a, 0x11, 0x66, @@ -5812,143 +5830,151 @@ var file_metrics_metrics_proto_rawDesc = []byte{ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x6b, 0x69, 0x70, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x70, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x73, 0x6b, 0x69, 0x70, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x70, 0x70, - 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x44, 0x0a, 0x16, 0x54, 0x6f, 0x70, 0x31, 0x30, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdc, 0x03, 0x0a, 0x0e, 0x6c, - 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x0a, - 0x0f, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x46, - 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x47, 0x7a, - 0x69, 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6e, 0x75, - 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x6e, - 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x44, 0x69, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, - 0x6c, 0x65, 0x49, 0x6e, 0x44, 0x69, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x6e, 0x75, 0x6d, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, - 0x10, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x74, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x14, 0x6e, 0x75, 0x6d, - 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x70, 0x74, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, - 0x46, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x70, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x4a, 0x0a, - 0x12, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x47, 0x7a, 0x69, - 0x70, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x14, 0x6c, 0x61, 0x73, - 0x74, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, - 0x65, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x33, 0x0a, 0x0b, 0x7a, 0x65, 0x64, - 0x62, 0x6f, 0x78, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x47, - 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0d, 0x6e, 0x75, 0x6d, 0x47, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x22, 0xc4, - 0x01, 0x0a, 0x08, 0x76, 0x6c, 0x61, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0f, 0x6e, - 0x75, 0x6d, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x6b, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x75, 0x6e, 0x6b, 0x50, 0x6f, - 0x72, 0x74, 0x73, 0x12, 0x51, 0x0a, 0x0b, 0x76, 0x6c, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, - 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x2e, 0x76, 0x6c, 0x61, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x6c, 0x61, 0x6e, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x6c, 0x61, 0x6e, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x56, 0x6c, 0x61, 0x6e, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x17, + 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x14, 0x6f, 0x6c, 0x64, 0x65, 0x73, + 0x74, 0x53, 0x61, 0x76, 0x65, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x6f, 0x67, 0x1a, + 0x44, 0x0a, 0x16, 0x54, 0x6f, 0x70, 0x31, 0x30, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdf, 0x01, 0x0a, 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, - 0x67, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x72, 0x67, 0x2e, - 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, - 0x72, 0x73, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x05, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x72, - 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x65, 0x72, 0x73, 0x52, 0x05, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x4a, 0x0a, 0x0c, 0x64, - 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, - 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x6c, - 0x6f, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0b, 0x64, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x6a, 0x0a, 0x0f, 0x46, 0x6c, 0x6f, 0x77, 0x6c, - 0x6f, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x72, 0x6f, 0x70, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x64, 0x72, 0x6f, 0x70, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x0f, 0x4b, 0x75, 0x62, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x63, 0x70, 0x75, 0x43, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x63, 0x70, 0x75, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x22, 0x64, 0x0a, 0x0e, 0x4b, 0x75, 0x62, 0x65, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdc, 0x03, 0x0a, 0x0e, 0x6c, 0x6f, 0x67, 0x66, 0x69, 0x6c, + 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x47, + 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, + 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x6e, + 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, + 0x70, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x44, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x44, + 0x69, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x47, + 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x74, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x74, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x46, + 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x70, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x14, 0x6e, 0x75, 0x6d, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x4b, + 0x65, 0x70, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x4a, 0x0a, 0x12, 0x72, 0x65, 0x63, 0x65, + 0x6e, 0x74, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x12, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x47, 0x7a, 0x69, 0x70, + 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x14, + 0x6c, 0x61, 0x73, 0x74, 0x47, 0x7a, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6e, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x22, 0x33, 0x0a, 0x0b, 0x7a, 0x65, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x47, 0x6f, 0x52, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x47, + 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x22, 0xc4, 0x01, 0x0a, 0x08, 0x76, 0x6c, + 0x61, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x72, + 0x75, 0x6e, 0x6b, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0d, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x75, 0x6e, 0x6b, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x51, + 0x0a, 0x0b, 0x76, 0x6c, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, + 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x76, 0x6c, 0x61, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x56, 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xdf, 0x01, 0x0a, 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, + 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x46, 0x6c, + 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x08, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x05, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, + 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, + 0x46, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x05, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x4a, 0x0a, 0x0c, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, + 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0b, 0x64, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x73, 0x22, 0x6a, 0x0a, 0x0f, 0x46, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x64, 0x72, 0x6f, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x64, 0x72, 0x6f, 0x70, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x22, 0xba, + 0x01, 0x0a, 0x0f, 0x4b, 0x75, 0x62, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, - 0x72, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x86, 0x02, 0x0a, 0x12, 0x4b, 0x75, 0x62, 0x65, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1d, 0x0a, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x72, - 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0c, 0x65, - 0x76, 0x65, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, - 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x41, - 0x70, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x50, 0x6f, - 0x64, 0x41, 0x70, 0x70, 0x73, 0x12, 0x48, 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x5f, 0x76, 0x6d, 0x69, - 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x72, - 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x56, 0x6d, 0x69, 0x41, 0x70, 0x70, 0x73, 0x2a, - 0x32, 0x0a, 0x0c, 0x5a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x09, 0x0a, 0x05, 0x5a, 0x6d, 0x4e, 0x6f, 0x70, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x5a, 0x6d, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x5a, 0x6d, 0x41, 0x70, - 0x70, 0x10, 0x03, 0x2a, 0x85, 0x02, 0x0a, 0x0b, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, - 0x16, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, - 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x49, 0x50, - 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x44, 0x45, 0x43, 0x52, 0x59, 0x50, - 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x49, - 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x4d, 0x41, 0x52, - 0x53, 0x48, 0x41, 0x4c, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x23, 0x0a, - 0x1f, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4c, - 0x45, 0x41, 0x52, 0x54, 0x45, 0x58, 0x54, 0x5f, 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, - 0x10, 0x04, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x41, 0x4c, 0x4c, 0x42, - 0x41, 0x43, 0x4b, 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x10, - 0x06, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x07, 0x2a, 0x66, 0x0a, 0x0e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, - 0x0f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, - 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, - 0x47, 0x61, 0x75, 0x67, 0x65, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x49, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x10, 0x02, 0x12, 0x13, - 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x10, 0x03, 0x42, 0x3f, 0x0a, 0x16, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, - 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5a, 0x25, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, - 0x65, 0x2f, 0x65, 0x76, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0x64, 0x0a, 0x0e, 0x4b, + 0x75, 0x62, 0x65, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x21, + 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x22, 0x86, 0x02, 0x0a, 0x12, 0x4b, 0x75, 0x62, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, + 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, + 0x4b, 0x75, 0x62, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x5f, 0x70, 0x6f, + 0x64, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, + 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x41, 0x70, 0x70, 0x73, + 0x12, 0x48, 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x5f, 0x76, 0x6d, 0x69, 0x5f, 0x61, 0x70, 0x70, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, + 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, + 0x4b, 0x75, 0x62, 0x65, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0a, + 0x65, 0x76, 0x65, 0x56, 0x6d, 0x69, 0x41, 0x70, 0x70, 0x73, 0x2a, 0x32, 0x0a, 0x0c, 0x5a, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x09, 0x0a, 0x05, 0x5a, 0x6d, + 0x4e, 0x6f, 0x70, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x5a, 0x6d, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x5a, 0x6d, 0x41, 0x70, 0x70, 0x10, 0x03, 0x2a, 0x85, + 0x02, 0x0a, 0x0b, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, + 0x0a, 0x14, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, + 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x49, 0x50, 0x48, + 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, + 0x44, 0x59, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x44, 0x45, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x46, 0x41, 0x49, + 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x4d, 0x41, 0x52, 0x53, 0x48, 0x41, 0x4c, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x49, 0x50, 0x48, + 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4c, 0x45, 0x41, 0x52, 0x54, 0x45, + 0x58, 0x54, 0x5f, 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, 0x12, 0x21, 0x0a, + 0x1d, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, + 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x05, + 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x4e, 0x4f, 0x5f, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, + 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, + 0x44, 0x41, 0x54, 0x41, 0x10, 0x07, 0x2a, 0x66, 0x0a, 0x0e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x10, 0x00, 0x12, 0x13, 0x0a, + 0x0f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x47, 0x61, 0x75, 0x67, 0x65, + 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x10, 0x03, 0x42, 0x3f, + 0x0a, 0x16, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, + 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x65, 0x76, 0x65, + 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6117,20 +6143,21 @@ var file_metrics_metrics_proto_depIdxs = []int32{ 43, // 89: org.lfedge.eve.metrics.newlogMetric.deviceMetrics:type_name -> org.lfedge.eve.metrics.logfileMetrics 43, // 90: org.lfedge.eve.metrics.newlogMetric.appMetrics:type_name -> org.lfedge.eve.metrics.logfileMetrics 53, // 91: org.lfedge.eve.metrics.newlogMetric.top10_input_sources:type_name -> org.lfedge.eve.metrics.newlogMetric.Top10InputSourcesEntry - 55, // 92: org.lfedge.eve.metrics.logfileMetrics.recentGzipFileTime:type_name -> google.protobuf.Timestamp - 55, // 93: org.lfedge.eve.metrics.logfileMetrics.lastGzipFileSendTime:type_name -> google.protobuf.Timestamp - 54, // 94: org.lfedge.eve.metrics.vlanInfo.vlan_counts:type_name -> org.lfedge.eve.metrics.vlanInfo.VlanCountsEntry - 47, // 95: org.lfedge.eve.metrics.FlowlogMetric.messages:type_name -> org.lfedge.eve.metrics.FlowlogCounters - 47, // 96: org.lfedge.eve.metrics.FlowlogMetric.flows:type_name -> org.lfedge.eve.metrics.FlowlogCounters - 47, // 97: org.lfedge.eve.metrics.FlowlogMetric.dns_requests:type_name -> org.lfedge.eve.metrics.FlowlogCounters - 48, // 98: org.lfedge.eve.metrics.KubeClusterMetrics.nodes:type_name -> org.lfedge.eve.metrics.KubeNodeMetrics - 49, // 99: org.lfedge.eve.metrics.KubeClusterMetrics.eve_pod_apps:type_name -> org.lfedge.eve.metrics.KubeAppMetrics - 49, // 100: org.lfedge.eve.metrics.KubeClusterMetrics.eve_vmi_apps:type_name -> org.lfedge.eve.metrics.KubeAppMetrics - 101, // [101:101] is the sub-list for method output_type - 101, // [101:101] is the sub-list for method input_type - 101, // [101:101] is the sub-list for extension type_name - 101, // [101:101] is the sub-list for extension extendee - 0, // [0:101] is the sub-list for field type_name + 55, // 92: org.lfedge.eve.metrics.newlogMetric.oldest_saved_device_log:type_name -> google.protobuf.Timestamp + 55, // 93: org.lfedge.eve.metrics.logfileMetrics.recentGzipFileTime:type_name -> google.protobuf.Timestamp + 55, // 94: org.lfedge.eve.metrics.logfileMetrics.lastGzipFileSendTime:type_name -> google.protobuf.Timestamp + 54, // 95: org.lfedge.eve.metrics.vlanInfo.vlan_counts:type_name -> org.lfedge.eve.metrics.vlanInfo.VlanCountsEntry + 47, // 96: org.lfedge.eve.metrics.FlowlogMetric.messages:type_name -> org.lfedge.eve.metrics.FlowlogCounters + 47, // 97: org.lfedge.eve.metrics.FlowlogMetric.flows:type_name -> org.lfedge.eve.metrics.FlowlogCounters + 47, // 98: org.lfedge.eve.metrics.FlowlogMetric.dns_requests:type_name -> org.lfedge.eve.metrics.FlowlogCounters + 48, // 99: org.lfedge.eve.metrics.KubeClusterMetrics.nodes:type_name -> org.lfedge.eve.metrics.KubeNodeMetrics + 49, // 100: org.lfedge.eve.metrics.KubeClusterMetrics.eve_pod_apps:type_name -> org.lfedge.eve.metrics.KubeAppMetrics + 49, // 101: org.lfedge.eve.metrics.KubeClusterMetrics.eve_vmi_apps:type_name -> org.lfedge.eve.metrics.KubeAppMetrics + 102, // [102:102] is the sub-list for method output_type + 102, // [102:102] is the sub-list for method input_type + 102, // [102:102] is the sub-list for extension type_name + 102, // [102:102] is the sub-list for extension extendee + 0, // [0:102] is the sub-list for field type_name } func init() { file_metrics_metrics_proto_init() } diff --git a/pkg/pillar/vendor/modules.txt b/pkg/pillar/vendor/modules.txt index b9c75fa5c6..f33c26f66e 100644 --- a/pkg/pillar/vendor/modules.txt +++ b/pkg/pillar/vendor/modules.txt @@ -638,7 +638,7 @@ github.com/leodido/go-urn github.com/lf-edge/edge-containers/pkg/registry github.com/lf-edge/edge-containers/pkg/resolver github.com/lf-edge/edge-containers/pkg/tgz -# github.com/lf-edge/eve-api/go v0.0.0-20241125213346-b026f21b3e75 +# github.com/lf-edge/eve-api/go v0.0.0-20241202084032-46c0a58dc84c ## explicit; go 1.20 github.com/lf-edge/eve-api/go/attest github.com/lf-edge/eve-api/go/auth From bb7ed22e93e7fd5dd6067cf342bd520b3f5a16f3 Mon Sep 17 00:00:00 2001 From: Milan Lenco Date: Wed, 27 Nov 2024 12:04:11 +0100 Subject: [PATCH 2/5] Cleanup Go templates used for generating Qemu config Move parsing of the templates into the init function (we only need to do it once) and declare contexts for templates as proper (not inline) types for better readability. Signed-off-by: Milan Lenco --- pkg/pillar/hypervisor/kvm.go | 287 +++++++++++++++++++----------- pkg/pillar/hypervisor/kvm_test.go | 12 +- 2 files changed, 192 insertions(+), 107 deletions(-) diff --git a/pkg/pillar/hypervisor/kvm.go b/pkg/pillar/hypervisor/kvm.go index 510c2528e1..33961e4972 100644 --- a/pkg/pillar/hypervisor/kvm.go +++ b/pkg/pillar/hypervisor/kvm.go @@ -77,7 +77,7 @@ type vtpmRequestResult struct { // we adjust max_sectors option (16384) to run Windows VM with vhost-scsi-pci and avoid errors like // [ 259.573575] vhost_scsi_calc_sgls: requested sgl_count: 2649 exceeds pre-allocated max_sgls: 2048 -const qemuConfTemplate = `# This file is automatically generated by domainmgr +const qemuGlobalConfTemplate = `# This file is automatically generated by domainmgr [msg] timestamp = "on" @@ -387,7 +387,7 @@ const qemuNetTemplate = ` {{- end}} ` -const qemuRootPortPciPassthruTemplate = ` +const qemuPCIeRootPortTemplate = ` [device "pci.{{.PCIId}}"] driver = "pcie-root-port" port = "1{{.PCIId}}" @@ -397,14 +397,14 @@ const qemuRootPortPciPassthruTemplate = ` addr = "{{printf "0x%x" .PCIId}}" ` -const qemuPCIPassthruBridgeTemplate = ` +const qemuPCIeBridgeTemplate = ` [device "pcie-bridge.{{.Bus}}"] driver = "pcie-pci-bridge" bus = "pci.{{.Bus}}" addr = "{{printf "0x%x" .PCIId}}" ` -const qemuPciPassthruTemplate = ` +const qemuPCIPassthruTemplate = ` [device] driver = "vfio-pci" host = "{{.PciShortAddr}}" @@ -415,7 +415,7 @@ const qemuPciPassthruTemplate = ` {{- end -}} {{- if .Xopregion }} x-igd-opregion = "on" -{{- end -}} +{{- end}} ` const qemuSerialTemplate = ` @@ -474,6 +474,132 @@ const qemuSwtpmTemplate = ` tpmdev = "tpm0" ` +// Context for qemuGlobalConfTemplate. +type tQemuGlobalConfContext struct { + Machine string + VirtualizationMode string + BootLoaderSettingsFile string + types.DomainConfig + types.DomainStatus +} + +// Context for qemuSwtpmTemplate. +type tQemuSwtpmContext struct { + Machine string + CtrlSocket string +} + +// Context for qemuPCIPassthruTemplate. +type tQemuPCIPassthruContext struct { + PciShortAddr string + Xvga bool + Xopregion bool + Bus string + Addr string +} + +// Context for qemuPCIeRootPortTemplate. +type tQemuPCIeRootPortContext struct { + PCIId int +} + +// Context for qemuPCIeBridgeTemplate. +type tQemuPCIeBridgeContext struct { + PCIId int + Bus int +} + +// Context for qemuNetTemplate. +type tQemuNetContext struct { + PCIId, NetID int + Driver string + Mac, Bridge, Vif string + MTU uint16 +} + +// Context for qemuSerialTemplate. +type tQemuSerialContext struct { + Machine string + SerialPortName string + ID int +} + +// Context for qemuCANBusTemplate. +type tQemuCANBusContext struct { + Machine string + IfName string + HostIfName string + ID int +} + +// Context for qemuDiskTemplate. +type tQemuDiskContext struct { + Machine string + PCIId, DiskID, SATAId, NumQueues int + AioType string + types.DiskStatus +} + +// Context for qemuVsockTemplate. +type tQemuVsockContext struct { + GuestCID string +} + +var ( + tQemuGlobalConf, tQemuSwtmp, tQemuVsock *template.Template + tQemuPCIeBridge, tQemuPCIPassthru, tQemuPCIeRootPort *template.Template + tQemuDisk, tQemuNet, tQemuSerial, tQemuCANBus *template.Template +) + +// Initialize all Go templates used to generate qemu config file. +func init() { + var err error + tQemuGlobalConf, err = template.New("qemuGlobalConf").Parse(qemuGlobalConfTemplate) + if err != nil { + panic(fmt.Errorf("parsing qemuGlobalConfTemplate failed: %w", err)) + } + tQemuSwtmp, err = template.New("qemuSwtpm").Parse(qemuSwtpmTemplate) + if err != nil { + panic(fmt.Errorf("parsing qemuSwtpmTemplate failed: %w", err)) + } + tQemuVsock, err = template.New("qemuVsock").Parse(qemuVsockTemplate) + if err != nil { + panic(fmt.Errorf("parsing qemuVsockTemplate failed: %w", err)) + } + tQemuPCIeBridge, err = template.New("qemuPCIeBridge").Parse(qemuPCIeBridgeTemplate) + if err != nil { + panic(fmt.Errorf("parsing qemuPCIeBridgeTemplate failed: %w", err)) + } + tQemuPCIPassthru, err = template.New("qemuPCIPassthru").Parse(qemuPCIPassthruTemplate) + if err != nil { + panic(fmt.Errorf("parsing qemuPCIPassthruTemplate failed: %w", err)) + } + tQemuPCIeRootPort, err = template.New("qemuPCIeRootPort").Parse(qemuPCIeRootPortTemplate) + if err != nil { + panic(fmt.Errorf("parsing qemuPCIeRootPortTemplate failed: %w", err)) + } + tQemuDisk, err = template.New("qemuDisk"). + Funcs(template.FuncMap{"Fmt": func(f zconfig.Format) string { + return strings.ToLower(f.String()) + }}). + Parse(qemuDiskTemplate) + if err != nil { + panic(fmt.Errorf("parsing qemuDiskTemplate failed: %w", err)) + } + tQemuNet, err = template.New("qemuNet").Parse(qemuNetTemplate) + if err != nil { + panic(fmt.Errorf("parsing qemuNetTemplate failed: %w", err)) + } + tQemuSerial, err = template.New("qemuSerial").Parse(qemuSerialTemplate) + if err != nil { + panic(fmt.Errorf("parsing qemuSerialTemplate failed: %w", err)) + } + tQemuCANBus, err = template.New("qemuCANBus").Parse(qemuCANBusTemplate) + if err != nil { + panic(fmt.Errorf("parsing qemuCANBusTemplate failed: %w", err)) + } +} + const kvmStateDir = "/run/hypervisor/kvm/" const sysfsPciDriversProbe = "/sys/bus/pci/drivers_probe" const vfioDriverPath = "/sys/bus/pci/drivers/vfio-pci" @@ -1017,19 +1143,8 @@ type pciAssignmentsTemplateFiller struct { } func (f *pciAssignmentsTemplateFiller) pciEBridge(pciID int, pciWOFunction string) error { - pciChildTemplateVars := struct { - PCIId int - Bus int - }{ - PCIId: 0, - Bus: pciID, - } - - tPCIeBridge, err := template.New("qemuPCIeBridge").Parse(qemuPCIPassthruBridgeTemplate) - if err != nil { - return fmt.Errorf("parsing qemuPCIPassthruBridgeTemplate failed: %w", err) - } - if err := tPCIeBridge.Execute(f.file, pciChildTemplateVars); err != nil { + pcieBridgeContext := tQemuPCIeBridgeContext{Bus: pciID} + if err := tQemuPCIeBridge.Execute(f.file, pcieBridgeContext); err != nil { return fmt.Errorf("can't write PCIe bridge Passthrough to config file (%w)", err) } f.multifunctionDevices[pciWOFunction].bridgeBus = fmt.Sprintf("pcie-bridge.%d", pciID) @@ -1042,22 +1157,13 @@ func (f *pciAssignmentsTemplateFiller) do(file io.Writer, pciAssignments []pciDe return nil } - pciPTContext := struct { - PCIId int - PciShortAddr string - Xvga bool - Xopregion bool - Bus string - Addr string - }{PCIId: pciID, PciShortAddr: "", Xvga: false, Xopregion: false} - - tPCI, _ := template.New("qemuPCI").Parse(qemuPciPassthruTemplate) - + var pcieRPContext tQemuPCIeRootPortContext + var pciPTContext tQemuPCIPassthruContext pciEBridgeForMultiFuncDevCreated := make(map[string]struct{}) // key: pci long without function number for i, pa := range pciAssignments { + pcieRPContext.PCIId = pciID + i pciPTContext.Xopregion = false pciPTContext.Xvga = pa.isVGA() - pciPTContext.Bus = fmt.Sprintf("pci.%d", pciPTContext.PCIId) pciPTContext.PciShortAddr = types.PCILongToShort(pa.pciLong) if vendor, err := pa.vid(); err == nil { @@ -1081,33 +1187,31 @@ func (f *pciAssignmentsTemplateFiller) do(file io.Writer, pciAssignments []pciDe // for non-multifunction devices, every pci device gets a "pcie-root-port" if !f.multifunctionDevices.isMultiFunction(pa) || !pciEBridgeCreated { - tRootPortPCI, _ := template.New("qemuRootPortPCI").Parse(qemuRootPortPciPassthruTemplate) - if err := tRootPortPCI.Execute(file, pciPTContext); err != nil { + if err := tQemuPCIeRootPort.Execute(file, pcieRPContext); err != nil { return logError("can't write Root Port PCI Passthrough to config file (%v)", err) } } if f.multifunctionDevices.isMultiFunction(pa) { if !pciEBridgeCreated { - err := f.pciEBridge(pciPTContext.PCIId, pciLongWoFunc) + err := f.pciEBridge(pcieRPContext.PCIId, pciLongWoFunc) if err != nil { logrus.Warnf("could not write template: %v, skipping", err) } } pciPTContext.Bus = f.multifunctionDevices[pciLongWoFunc].bridgeBus - pciPTContext.PCIId = f.multifunctionDevices.index(pa) - if pciPTContext.PCIId < 0 { - logrus.Warn("PCIId is less than 0 - skipping") + funcIndex := f.multifunctionDevices.index(pa) + if funcIndex < 0 { + logrus.Warn("PCI function index is less than 0 - skipping") } - pciPTContext.Addr = fmt.Sprintf("0x%x", pciPTContext.PCIId+1) // Unsupported PCI slot 0 for standard hotplug controller + pciPTContext.Addr = fmt.Sprintf("0x%x", funcIndex+1) // Unsupported PCI slot 0 for standard hotplug controller } else { - pciPTContext.Bus = fmt.Sprintf("pci.%d", pciPTContext.PCIId) + pciPTContext.Bus = fmt.Sprintf("pci.%d", pcieRPContext.PCIId) pciPTContext.Addr = "0x0" } - if err := tPCI.Execute(file, pciPTContext); err != nil { + if err := tQemuPCIPassthru.Execute(file, pciPTContext); err != nil { return logError("can't write PCI Passthrough to config file (%v)", err) } - pciPTContext.PCIId = pciID + i + 1 } return nil @@ -1128,47 +1232,41 @@ func (ctx KvmContext) CreateDomConfig(domainName string, if config.VirtualizationMode == types.FML { virtualizationMode = "FML" } - tmplCtx := struct { - Machine string - VirtualizationMode string - BootLoaderSettingsFile string - types.DomainConfig - types.DomainStatus - }{ctx.devicemodel, virtualizationMode, bootLoaderSettingsFile, config, status} - tmplCtx.DomainConfig.Memory = (config.Memory + 1023) / 1024 - tmplCtx.DomainConfig.EnableVncShimVM = + qemuConfContext := tQemuGlobalConfContext{ + Machine: ctx.devicemodel, + VirtualizationMode: virtualizationMode, + BootLoaderSettingsFile: bootLoaderSettingsFile, + DomainConfig: config, + DomainStatus: status, + } + qemuConfContext.DomainConfig.Memory = (config.Memory + 1023) / 1024 + qemuConfContext.DomainConfig.EnableVncShimVM = isVncShimVMEnabled(globalConfig, config) - tmplCtx.DomainConfig.DisplayName = domainName + qemuConfContext.DomainConfig.DisplayName = domainName // render global device model settings - t, _ := template.New("qemu").Parse(qemuConfTemplate) - if err := t.Execute(file, tmplCtx); err != nil { + if err := tQemuGlobalConf.Execute(file, qemuConfContext); err != nil { return logError("can't write to config file %s (%v)", file.Name(), err) } // render swtpm settings if swtpmCtrlSock != "" { - swtpmContext := struct { - Machine string - CtrlSocket string - }{ctx.devicemodel, swtpmCtrlSock} - t, _ = template.New("qemuSwtpm").Parse(qemuSwtpmTemplate) - if err := t.Execute(file, swtpmContext); err != nil { + swtpmContext := tQemuSwtpmContext{ + Machine: ctx.devicemodel, + CtrlSocket: swtpmCtrlSock, + } + if err := tQemuSwtmp.Execute(file, swtpmContext); err != nil { return logError("can't write to config file %s (%v)", file.Name(), err) } } // render disk device model settings - diskContext := struct { - Machine string - PCIId, DiskID, SATAId, NumQueues int - AioType string - types.DiskStatus - }{Machine: ctx.devicemodel, PCIId: 4, DiskID: 0, SATAId: 0, AioType: "io_uring", NumQueues: config.VCpus} - - t, _ = template.New("qemuDisk"). - Funcs(template.FuncMap{"Fmt": func(f zconfig.Format) string { return strings.ToLower(f.String()) }}). - Parse(qemuDiskTemplate) + diskContext := tQemuDiskContext{ + Machine: ctx.devicemodel, + PCIId: 4, + AioType: "io_uring", + NumQueues: config.VCpus, + } for _, ds := range diskStatusList { if ds.Devtype == "" { continue @@ -1179,7 +1277,7 @@ func (ctx KvmContext) CreateDomConfig(domainName string, continue } diskContext.DiskStatus = ds - if err := t.Execute(file, diskContext); err != nil { + if err := tQemuDisk.Execute(file, diskContext); err != nil { return logError("can't write to config file %s (%v)", file.Name(), err) } if diskContext.Devtype == "cdrom" { @@ -1191,13 +1289,7 @@ func (ctx KvmContext) CreateDomConfig(domainName string, } // render network device model settings - netContext := struct { - PCIId, NetID int - Driver string - Mac, Bridge, Vif string - MTU uint16 - }{PCIId: diskContext.PCIId, NetID: 0} - t, _ = template.New("qemuNet").Parse(qemuNetTemplate) + netContext := tQemuNetContext{PCIId: diskContext.PCIId} for _, net := range config.VifList { netContext.Mac = net.Mac.String() netContext.Bridge = net.Bridge @@ -1208,7 +1300,7 @@ func (ctx KvmContext) CreateDomConfig(domainName string, netContext.Driver = "virtio-net-pci" } netContext.MTU = net.MTU - if err := t.Execute(file, netContext); err != nil { + if err := tQemuNet.Execute(file, netContext); err != nil { return logError("can't write to config file %s (%v)", file.Name(), err) } netContext.PCIId = netContext.PCIId + 1 @@ -1275,34 +1367,18 @@ func (ctx KvmContext) CreateDomConfig(domainName string, return fmt.Errorf("writing to template file %s failed: %w", file.Name(), err) } if len(serialAssignments) != 0 { - serialPortContext := struct { - Machine string - SerialPortName string - ID int - }{Machine: ctx.devicemodel, SerialPortName: "", ID: 0} - - t, _ = template.New("qemuSerial").Parse(qemuSerialTemplate) + serialPortContext := tQemuSerialContext{Machine: ctx.devicemodel} for id, serial := range serialAssignments { serialPortContext.SerialPortName = serial - fmt.Printf("id for serial is %d\n", id) serialPortContext.ID = id - if err := t.Execute(file, serialPortContext); err != nil { - return logError("can't write serial assignment to config file %s (%v)", file.Name(), err) + if err := tQemuSerial.Execute(file, serialPortContext); err != nil { + return logError("can't write serial assignment to config file %s (%v)", + file.Name(), err) } } } if len(canBusAssignments) != 0 { - canIfContext := struct { - Machine string - IfName string - HostIfName string - ID int - }{Machine: ctx.devicemodel, IfName: "", HostIfName: "", ID: 0} - - t, err := template.New("qemuCANBus").Parse(qemuCANBusTemplate) - if err != nil { - return logError("can't create CAN Bus configuration template: %v", err) - } + canIfContext := tQemuCANBusContext{Machine: ctx.devicemodel} id := 0 for canIf, canHostIf := range canBusAssignments { logrus.Infof("CAN interface %s connected to host CAN %s\n", canIf, canHostIf) @@ -1310,17 +1386,16 @@ func (ctx KvmContext) CreateDomConfig(domainName string, canIfContext.HostIfName = canHostIf canIfContext.ID = id id++ - if err := t.Execute(file, canIfContext); err != nil { - return logError("can't write CAN Bus assignment to config file %s (%v)", file.Name(), err) + if err := tQemuCANBus.Execute(file, canIfContext); err != nil { + return logError("can't write CAN Bus assignment to config file %s (%v)", + file.Name(), err) } } } // render vsock settings, this should go last to avoid // PCI ID conflicts, let qemu assign PCI ID for vsock. - vsockContext := struct { - GuestCID string - }{ + vsockContext := tQemuVsockContext{ // currently we don't save the clientCid/AppUUID pair since // we there is no need for it, but in the future when wen // we add channels for vms to report things like CPU/Mem usage @@ -1329,9 +1404,9 @@ func (ctx KvmContext) CreateDomConfig(domainName string, // clientCid needs atomic add to avoid race condition // in case CreateDomConfig is called concurrently, which // happens at least in unit tests. - atomic.AddUint32(&clientCid, 1))} - t, _ = template.New("qemuVsock").Parse(qemuVsockTemplate) - if err := t.Execute(file, vsockContext); err != nil { + atomic.AddUint32(&clientCid, 1)), + } + if err := tQemuVsock.Execute(file, vsockContext); err != nil { return logError("can't write to config file %s (%v)", file.Name(), err) } diff --git a/pkg/pillar/hypervisor/kvm_test.go b/pkg/pillar/hypervisor/kvm_test.go index 35b01aa73c..b23a431e1e 100644 --- a/pkg/pillar/hypervisor/kvm_test.go +++ b/pkg/pillar/hypervisor/kvm_test.go @@ -1403,6 +1403,7 @@ func domConfigArm64() string { host = "f3:00.0" bus = "pci.10" addr = "0x0" + [chardev "charserial-usr0"] backend = "serial" path = "/dev/ttyS0" @@ -1702,6 +1703,7 @@ func domConfigAmd64FML() string { host = "f3:00.0" bus = "pci.10" addr = "0x0" + [device "pci.11"] driver = "pcie-root-port" port = "111" @@ -1715,6 +1717,7 @@ func domConfigAmd64FML() string { host = "f4:00.0" bus = "pci.11" addr = "0x0" + [chardev "charserial-usr0"] backend = "serial" path = "/dev/ttyS0" @@ -2003,6 +2006,7 @@ func domConfigAmd64Legacy() string { host = "f3:00.0" bus = "pci.10" addr = "0x0" + [chardev "charserial-usr0"] backend = "serial" path = "/dev/ttyS0" @@ -2289,6 +2293,7 @@ func domConfigAmd64() string { host = "f3:00.0" bus = "pci.10" addr = "0x0" + [chardev "charserial-usr0"] backend = "serial" path = "/dev/ttyS0" @@ -2577,6 +2582,7 @@ func domConfigContainerVNC() string { host = "f3:00.0" bus = "pci.9" addr = "0x0" + [chardev "charserial-usr0"] backend = "serial" path = "/dev/ttyS0" @@ -2788,6 +2794,7 @@ func expectedMultifunctionDevice() string { host = "00:0a.0" bus = "pci.0" addr = "0x0" + [device "pci.1"] driver = "pcie-root-port" port = "11" @@ -2806,6 +2813,7 @@ func expectedMultifunctionDevice() string { host = "00:0d.0" bus = "pcie-bridge.1" addr = "0x1" + [device "pci.2"] driver = "pcie-root-port" port = "12" @@ -2819,11 +2827,13 @@ func expectedMultifunctionDevice() string { host = "00:0b.0" bus = "pci.2" addr = "0x0" + [device] driver = "vfio-pci" host = "00:0d.2" bus = "pcie-bridge.1" - addr = "0x2"` + addr = "0x2" +` } func TestPCIAssignmentsTemplateFillMultifunctionDevice(t *testing.T) { From 842e04992c0bea094bbb1cdc2bb814ef3234003c Mon Sep 17 00:00:00 2001 From: Milan Lenco Date: Wed, 27 Nov 2024 12:24:54 +0100 Subject: [PATCH 3/5] Parse application interface order fields Parse newly added interface order fields and the EnforceNetworkInterfaceOrder boolean option. Signed-off-by: Milan Lenco --- pkg/pillar/cmd/zedagent/parseconfig.go | 65 ++++++++++++++++++++----- pkg/pillar/cmd/zedagent/reportinfo.go | 6 ++- pkg/pillar/cmd/zedmanager/zedmanager.go | 2 +- pkg/pillar/cmd/zedrouter/appnetwork.go | 3 ++ pkg/pillar/types/domainmgrtypes.go | 6 +++ pkg/pillar/types/zedmanagertypes.go | 7 +-- pkg/pillar/types/zedroutertypes.go | 2 +- 7 files changed, 72 insertions(+), 19 deletions(-) diff --git a/pkg/pillar/cmd/zedagent/parseconfig.go b/pkg/pillar/cmd/zedagent/parseconfig.go index 77b6789921..be8ccad25e 100644 --- a/pkg/pillar/cmd/zedagent/parseconfig.go +++ b/pkg/pillar/cmd/zedagent/parseconfig.go @@ -689,6 +689,8 @@ func parseAppInstanceConfig(getconfigCtx *getconfigContext, appInstance.FixedResources.EnableVncShimVM = cfgApp.Fixedresources.EnableVncShimVm appInstance.FixedResources.VncDisplay = cfgApp.Fixedresources.VncDisplay appInstance.FixedResources.VncPasswd = cfgApp.Fixedresources.VncPasswd + appInstance.FixedResources.EnforceNetworkInterfaceOrder = + cfgApp.Fixedresources.EnforceNetworkInterfaceOrder appInstance.DisableLogs = cfgApp.Fixedresources.DisableLogs appInstance.MetaDataType = types.MetaDataType(cfgApp.MetaDataType) appInstance.Delay = time.Duration(cfgApp.StartDelayInSeconds) * time.Second @@ -734,6 +736,9 @@ func parseAppInstanceConfig(getconfigCtx *getconfigContext, } else if ioa.Type == types.IoCAN || ioa.Type == types.IoVCAN || ioa.Type == types.IoLCAN { log.Functionf("Got CAN adapter") } + if ioa.Type.IsNet() && appInstance.FixedResources.EnforceNetworkInterfaceOrder { + ioa.IntfOrder = adapter.GetInterfaceOrder() + } appInstance.IoAdapterList = append(appInstance.IoAdapterList, ioa) } log.Functionf("Got adapters %v", appInstance.IoAdapterList) @@ -2439,11 +2444,12 @@ func parseAppNetAdapterConfig(appInstance *types.AppInstanceConfig, intfEnt.Name, adapterCfg.Error) } } - // sort based on intfOrder - // XXX remove? Debug? - if len(appInstance.AppNetAdapterList) > 1 { - log.Functionf("XXX pre sort %+v", appInstance.AppNetAdapterList) - } + + // Sort based on IntfOrder. When EnforceNetworkInterfaceOrder is enabled, this is done + // only for troubleshooting purposes to make the pubsub messages containing application + // interface list easier to read. Interface order is still determined by the IntfOrder + // attribute, and that includes direct attachments, not based on the order of items + // inside AppNetAdapterList. sort.Slice(appInstance.AppNetAdapterList[:], func(i, j int) bool { return appInstance.AppNetAdapterList[i].IntfOrder < @@ -2490,8 +2496,6 @@ func parseAppNetAdapterConfigEntry( adapterCfg := new(types.AppNetAdapterConfig) adapterCfg.Name = intfEnt.Name - // XXX set adapterCfg.IntfOrder from API once available - var intfOrder int32 // Lookup NetworkInstance ID networkInstanceEntry := lookupNetworkInstanceId(intfEnt.NetworkId, cfgNetworkInstances) @@ -2553,6 +2557,7 @@ func parseAppNetAdapterConfigEntry( } } + var aclIntfOrder uint32 adapterCfg.ACLs = make([]types.ACE, len(intfEnt.Acls)) for aclIdx, acl := range intfEnt.Acls { aclCfg := new(types.ACE) @@ -2561,9 +2566,11 @@ func parseAppNetAdapterConfigEntry( aclCfg.Actions = make([]types.ACEAction, len(acl.Actions)) aclCfg.RuleID = acl.Id - // XXX temporary until we get an intfOrder in the API - if intfOrder == 0 { - intfOrder = acl.Id + // When EnforceNetworkInterfaceOrder is disabled, we fall back to the previous + // interface ordering method, where virtual interfaces are ordered according to ACL + // IDs and direct attachments come after virtual interfaces. + if aclIntfOrder == 0 && acl.Id > 0 { + aclIntfOrder = uint32(acl.Id) } aclCfg.Name = acl.Name aclCfg.Dir = types.ACEDirection(acl.Dir) @@ -2587,8 +2594,11 @@ func parseAppNetAdapterConfigEntry( } adapterCfg.ACLs[aclIdx] = *aclCfg } - // XXX set adapterCfg.IntfOrder from API once available - adapterCfg.IntfOrder = intfOrder + if cfgApp.Fixedresources.EnforceNetworkInterfaceOrder { + adapterCfg.IntfOrder = intfEnt.GetInterfaceOrder() + } else { + adapterCfg.IntfOrder = aclIntfOrder + } adapterCfg.AccessVlanID = intfEnt.AccessVlanId adapterCfg.AllowToDiscover = intfEnt.AllowToDiscover @@ -2822,6 +2832,37 @@ func checkAndPublishAppInstanceConfig(getconfigCtx *getconfigContext, config.Errors = append(config.Errors, err.Error()) } + // If EnforceNetworkInterfaceOrder is enabled, check that every network interface + // has unique order number. + if config.FixedResources.EnforceNetworkInterfaceOrder { + intfOrderMap := make(map[uint32]string) + for _, adapter := range config.AppNetAdapterList { + if adapter2, duplicate := intfOrderMap[adapter.IntfOrder]; duplicate { + err := fmt.Errorf("virtual network adapter %s has the same interface "+ + "order (%d) configured as adapter %s", adapter.Name, adapter.IntfOrder, + adapter2) + log.Error(err) + config.Errors = append(config.Errors, err.Error()) + continue + } + intfOrderMap[adapter.IntfOrder] = adapter.Name + } + for _, adapter := range config.IoAdapterList { + if !adapter.Type.IsNet() { + continue + } + if adapter2, duplicate := intfOrderMap[adapter.IntfOrder]; duplicate { + err := fmt.Errorf("directly attached network adapter %s has the same "+ + "interface order (%d) configured as adapter %s", adapter.Name, + adapter.IntfOrder, adapter2) + log.Error(err) + config.Errors = append(config.Errors, err.Error()) + continue + } + intfOrderMap[adapter.IntfOrder] = adapter.Name + } + } + pub.Publish(key, config) } diff --git a/pkg/pillar/cmd/zedagent/reportinfo.go b/pkg/pillar/cmd/zedagent/reportinfo.go index a5ad028146..08d6222764 100644 --- a/pkg/pillar/cmd/zedagent/reportinfo.go +++ b/pkg/pillar/cmd/zedagent/reportinfo.go @@ -644,8 +644,10 @@ func PublishDeviceInfoToZedCloud(ctx *zedagentContext, dest destinationBitset) { // TODO: Enhance capability reporting with a bitmap-like approach for increased granularity. // We report the snapshot capability despite the fact that we support snapshots only // for file-based volumes. If a controller tries to make a snapshot of ZFS-based volume - // device returns a runtime error. - ReportDeviceInfo.ApiCapability = info.APICapability_API_CAPABILITY_ADAPTER_USER_LABELS + // device returns a runtime error. Similarly, we only support enforced application network + // interface order for the KVM hypervisor. If enabled for application deployed under Xen + // or Kubevirt hypervisor, EVE returns error and the application will not be started. + ReportDeviceInfo.ApiCapability = info.APICapability_API_CAPABILITY_ENFORCED_NET_INTERFACE_ORDER // Report if there is a local override of profile if ctx.getconfigCtx.sideController.currentProfile != diff --git a/pkg/pillar/cmd/zedmanager/zedmanager.go b/pkg/pillar/cmd/zedmanager/zedmanager.go index 20787a6896..1fc2e6b661 100644 --- a/pkg/pillar/cmd/zedmanager/zedmanager.go +++ b/pkg/pillar/cmd/zedmanager/zedmanager.go @@ -1095,7 +1095,7 @@ func handleCreate(ctxArg interface{}, key string, if len(config.Errors) > 0 { // Combine all errors from Config parsing state and send them in Status for i, errStr := range config.Errors { - allErrors += errStr + allErrors += errStr + "\n" log.Errorf("App Instance %s-%s: Error(%d): %s", config.DisplayName, config.UUIDandVersion.UUID, i, errStr) } diff --git a/pkg/pillar/cmd/zedrouter/appnetwork.go b/pkg/pillar/cmd/zedrouter/appnetwork.go index 305b83900c..76a748c5b4 100644 --- a/pkg/pillar/cmd/zedrouter/appnetwork.go +++ b/pkg/pillar/cmd/zedrouter/appnetwork.go @@ -102,6 +102,9 @@ func (z *zedrouter) prepareConfigForVIFs(config types.AppNetworkConfig, } adapterStatus.HostName = config.Key() adapterStatus.MTU = netInstStatus.MTU + // Propagate IntfOrder from adapter down to VifConfig, which zedmanager then passes + // to domainmgr. + adapterStatus.VifConfig.VifOrder = adapterStatus.IntfOrder guestIP, err := z.lookupOrAllocateIPv4ForVIF( netInstStatus, *adapterStatus, status.UUIDandVersion.UUID) if err != nil { diff --git a/pkg/pillar/types/domainmgrtypes.go b/pkg/pillar/types/domainmgrtypes.go index 33c494aa01..cdcb5c3d9f 100644 --- a/pkg/pillar/types/domainmgrtypes.go +++ b/pkg/pillar/types/domainmgrtypes.go @@ -261,6 +261,8 @@ type VmConfig struct { CPUsPinned bool VMMMaxMem int // in kbytes EnableVncShimVM bool + // Enables enforcement of user-defined ordering for network interfaces. + EnforceNetworkInterfaceOrder bool } // VmMode is the type for the virtualization mode @@ -425,6 +427,10 @@ type VifConfig struct { MTU uint16 // PodVif is only valid in the Kubernetes mode. PodVif PodVIF + // Interface order across both VIFs and directly attached network devices. + // Note that we cannot use attribute name "IntfOrder" here, otherwise it would + // overlap with IntfOrder from AppNetAdapterConfig inside AppNetAdapterStatus. + VifOrder uint32 } // PodVIF : configuration parameters for VIF connecting Kubernetes pod with the host. diff --git a/pkg/pillar/types/zedmanagertypes.go b/pkg/pillar/types/zedmanagertypes.go index b86faf4101..fb46b5aacb 100644 --- a/pkg/pillar/types/zedmanagertypes.go +++ b/pkg/pillar/types/zedmanagertypes.go @@ -156,9 +156,10 @@ type AppInstanceOpsCmd struct { // IoAdapter specifies that a group of ports should be assigned type IoAdapter struct { - Type IoType - Name string // Short hand name such as "COM1" or "eth1-2" - EthVf sriov.EthVF // Applies only to the VF IoType + Type IoType + Name string // Short hand name such as "COM1" or "eth1-2" + EthVf sriov.EthVF // Applies only to the VF IoType + IntfOrder uint32 // Interface order across both virtual and passthrough network devices. } // LogCreate : diff --git a/pkg/pillar/types/zedroutertypes.go b/pkg/pillar/types/zedroutertypes.go index a696c91663..93b6868b99 100644 --- a/pkg/pillar/types/zedroutertypes.go +++ b/pkg/pillar/types/zedroutertypes.go @@ -282,7 +282,7 @@ type AppNetAdapterConfig struct { Name string // From proto message AppMacAddr net.HardwareAddr // If set use it for vif AppIPAddr net.IP // If set use DHCP to assign to app - IntfOrder int32 // XXX need to get from API + IntfOrder uint32 // Order wrt. other virtual and also directly assigned network adapters // XXX Shouldn't we use ErrorAndTime here // Error From aced85e23e512412d9a57d0abe1712b0f2caec12 Mon Sep 17 00:00:00 2001 From: Milan Lenco Date: Wed, 27 Nov 2024 12:27:19 +0100 Subject: [PATCH 4/5] Add support for user-defined network interface order to domainmgr/kvm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, when application has both virtual network interfaces configured and some network devices directly assigned, EVE will first attach virtual interfaces in the order that follows ACL IDs (a historical workaround for missing interface order field), followed by directly assigned network adapters, in the order of the AppInstanceConfig.adapters list. To allow the user to specify the order between all application network interfaces (across both virtual and passthrough devices), we introduced a new boolean flag EnforceNetworkInterfaceOrder inside the application instance config and allow the controller to pass the order requirements for all the application network adapters. For the KVM hypervisor, and depending on the application’s operating system, we can influence the interface order through the PCI topology. A network device that should appear earlier in the interface list is assigned a lower PCI address. This ensures the desired network interface order, at least for Linux-based operating systems with systemd (see [1]). However, there are limitations when assigning multifunction PCI devices to applications. Specifically, the functions of a multifunction device cannot be interleaved with other virtual or passthrough devices. If the user configures a network interface order that violates this constraint, EVE will report an error for the application, and it will not be started. [1] https://www.freedesktop.org/software/systemd/man/latest/systemd.net-naming-scheme.html Signed-off-by: Milan Lenco --- pkg/pillar/hypervisor/kubevirt.go | 6 + pkg/pillar/hypervisor/kvm.go | 466 ++++++++++++++++++++++++------ pkg/pillar/hypervisor/kvm_test.go | 393 ++++++++++++++++++++++++- pkg/pillar/hypervisor/pci.go | 27 ++ pkg/pillar/hypervisor/xen.go | 6 + 5 files changed, 810 insertions(+), 88 deletions(-) diff --git a/pkg/pillar/hypervisor/kubevirt.go b/pkg/pillar/hypervisor/kubevirt.go index ae3c3e128f..378584edbc 100644 --- a/pkg/pillar/hypervisor/kubevirt.go +++ b/pkg/pillar/hypervisor/kubevirt.go @@ -191,6 +191,12 @@ func (ctx kubevirtContext) Setup(status types.DomainStatus, config types.DomainC logrus.Debugf("Setup called for Domain: %s, vmmode %v", domainName, config.VirtualizationMode) + if config.EnforceNetworkInterfaceOrder { + logrus.Errorf("Enforcing user-defined network interface order is not supported "+ + "with the KubeVirt hypervisor. Ignoring EnforceNetworkInterfaceOrder flag "+ + "for app %s", config.DisplayName) + } + if config.VirtualizationMode == types.NOHYPER { if err := ctx.CreatePodConfig(domainName, config, status, diskStatusList, aa, file); err != nil { return logError("failed to build kube pod config: %v", err) diff --git a/pkg/pillar/hypervisor/kvm.go b/pkg/pillar/hypervisor/kvm.go index 33961e4972..750bbed5fe 100644 --- a/pkg/pillar/hypervisor/kvm.go +++ b/pkg/pillar/hypervisor/kvm.go @@ -398,10 +398,10 @@ const qemuPCIeRootPortTemplate = ` ` const qemuPCIeBridgeTemplate = ` -[device "pcie-bridge.{{.Bus}}"] +[device "pcie-bridge.{{.PCIId}}"] driver = "pcie-pci-bridge" - bus = "pci.{{.Bus}}" - addr = "{{printf "0x%x" .PCIId}}" + bus = "pci.{{.PCIId}}" + addr = "0x0" ` const qemuPCIPassthruTemplate = ` @@ -506,7 +506,6 @@ type tQemuPCIeRootPortContext struct { // Context for qemuPCIeBridgeTemplate. type tQemuPCIeBridgeContext struct { PCIId int - Bus int } // Context for qemuNetTemplate. @@ -1068,40 +1067,297 @@ func getFmlCustomResolution(status *types.DomainStatus, globalConfig *types.Conf return "", fmt.Errorf("invalid fml resolution %s", fmlResolutions) } +type virtualNetwork struct { + types.VifConfig + networkID int + pciDeviceID int +} + +type pciAddressAllocator struct { + pciAssignments []pciDevice + virtualNetworks []virtualNetwork + multifunctionDevices multifunctionDevs + firstFreePCIID int + enforceNetInterfaceOrder bool +} + +// allocate sets pciDeviceID and pciBridgeID for every pciDevice and virtualNetwork +// based on user-configured ordering requirements. +func (a *pciAddressAllocator) allocate() error { + if !a.enforceNetInterfaceOrder { + // Fallback to legacy ordering of PCI devices. + return a.allocateLegacy() + } + + // Determine PCI addresses for virtual network interfaces, which are connected + // to the root bus using root ports. + for i := range a.virtualNetworks { + pciDeviceID := a.firstFreePCIID + // Increment pciDeviceID by 1 for every (virtual or assigned) PCI device + // which should have lower PCI address. + // For a multifunction PCI device, we increment by 1 for the entire group of + // functions, as they share a single address on the root bus through their bridge. + for j := range a.virtualNetworks { + if i == j { + continue + } + if a.virtualNetworks[j].VifOrder < a.virtualNetworks[i].VifOrder { + pciDeviceID++ + } + } + for pciAddr, md := range a.multifunctionDevices { + isBefore, isAfter := md.compareOrderWithVirtNet(a.virtualNetworks[i]) + invalidOrder := isBefore && isAfter + if invalidOrder { + return logError("Invalid VIF %s configuration: user-defined network "+ + "interface order disrupts the function sequence of the multifunction "+ + "PCI device %s. Interleaving PCI device functions with other devices "+ + "is not allowed.", a.virtualNetworks[i].Vif, pciAddr) + } + if isBefore { + pciDeviceID++ + } + } + a.virtualNetworks[i].pciDeviceID = pciDeviceID + } + + // Determine PCI addresses for direct PCI assignments. + for i := range a.pciAssignments { + pciLongWoFunc, err := a.pciAssignments[i].pciLongWOFunction() + if err != nil { + logrus.Warnf("retrieving pci address without function failed: %v", err) + continue + } + md := a.multifunctionDevices[pciLongWoFunc] + if md == nil { + // Even when device is not multifunction, it still should have entry + // in the multifunctionDevices map. + logrus.Warnf("missing multifunctionDevices entry for pci address: %s", + pciLongWoFunc) + continue + } + // Increment pciDeviceOrBridgeID by 1 for every (virtual or assigned) PCI device + // which should have lower PCI address. + // For a multifunction PCI device, we increment by 1 for the entire group of + // functions, as they share a single address on the root bus through their bridge. + pciDeviceOrBridgeID := a.firstFreePCIID + for _, virtNet := range a.virtualNetworks { + // Order validity already checked when addresses for virtual networks + // were determined. + if isBefore, _ := md.compareOrderWithVirtNet(virtNet); !isBefore { + // Also increased when order is undefined, i.e. this PCI device + // does not have network function. Non-networking PCI devices + // are placed after virtual network interfaces. + pciDeviceOrBridgeID++ + } + } + thisHasNetFunc := md.hasNetworkFunction() + for pciAddr2, md2 := range a.multifunctionDevices { + if pciLongWoFunc == pciAddr2 { + continue + } + theOtherHasNetFunc := md2.hasNetworkFunction() + if !thisHasNetFunc { + if theOtherHasNetFunc { + // Network functions take priority in the order. + pciDeviceOrBridgeID++ + } else { + // Between non-networking devices, order by PCI addresses + // lexicographically. + if pciLongWoFunc > pciAddr2 { + pciDeviceOrBridgeID++ + } + } + continue + } + if !theOtherHasNetFunc { + // The other non-network device is ordered after this network device. + continue + } + // Both devices have at least one network function. + theOtherIsBefore, theOtherIsAfter := md2.compareOrder(*md) + invalidOrder := theOtherIsBefore && theOtherIsAfter + if invalidOrder { + return logError("User-defined network interface order disrupts "+ + "the function sequence of the multifunction PCI devices %s and %s. "+ + "Interleaving PCI device functions with other devices/functions "+ + "is not allowed.", pciLongWoFunc, pciAddr2) + } + if theOtherIsBefore { + pciDeviceOrBridgeID++ + } + } + if len(md.devs) > 1 { + // pciDeviceOrBridgeID is for the bridge wrt. the root bus. + a.pciAssignments[i].pciBridgeID = pciDeviceOrBridgeID + // Determine device address on the secondary bus provided by the bridge. + // Skip PCI address 0 which is unsupported for standard hotplug controller. + pciDeviceID := 1 + devIndex := md.index(a.pciAssignments[i]) + thisIsNetDev := a.pciAssignments[i].ioType.IsNet() + for dev2Index, dev2 := range md.devs { + theOtherIsNetDev := dev2.ioType.IsNet() + if !thisIsNetDev { + if theOtherIsNetDev { + // Network functions take priority in the order. + pciDeviceID++ + } else { + // Between non-networking functions, preserve the order received + // from zedagent. + if devIndex > dev2Index { + pciDeviceID++ + } + } + continue + } + if !theOtherIsNetDev { + // The other non-network device is ordered after this network device. + continue + } + // Both devices are of the networking type. + if dev2.netIntfOrder < a.pciAssignments[i].netIntfOrder { + pciDeviceID++ + } + } + a.pciAssignments[i].pciDeviceID = pciDeviceID + } else { + // Not multifunction PCI device. + a.pciAssignments[i].pciBridgeID = 0 + a.pciAssignments[i].pciDeviceID = pciDeviceOrBridgeID + } + } + return nil +} + +func (a *pciAddressAllocator) allocateLegacy() error { + // Virtual network interfaces precede PCI-passthrough devices in the PCI topology. + // Among virtual interfaces, the order received from zedagent is preserved. + pciDeviceID := a.firstFreePCIID + for i := range a.virtualNetworks { + a.virtualNetworks[i].pciDeviceID = pciDeviceID + pciDeviceID++ + } + + // Preserve order of PCI assignments as received from zedagent, but group + // functions of the same multifunction PCI device under the same bridge. + pciBridgeIDs := make(map[string]int) // key = PCI address without function suffix + for i := range a.pciAssignments { + pciLongWoFunc, err := a.pciAssignments[i].pciLongWOFunction() + if err != nil { + logrus.Warnf("retrieving pci address without function failed: %v", err) + continue + } + md := a.multifunctionDevices[pciLongWoFunc] + if md == nil { + // Even when device is not multifunction, it still should have entry + // in the a.multifunctionDevices map. + logrus.Warnf("missing multifunctionDevices entry for pci address: %s", + pciLongWoFunc) + continue + } + if len(md.devs) > 1 { + // Multi-function PCI device. + pciBridgeID, bridgeIDAllocated := pciBridgeIDs[pciLongWoFunc] + if !bridgeIDAllocated { + pciBridgeID = pciDeviceID + pciBridgeIDs[pciLongWoFunc] = pciBridgeID + pciDeviceID++ + } + a.pciAssignments[i].pciBridgeID = pciBridgeID + // Skip PCI address 0 which is unsupported for standard hotplug controller. + a.pciAssignments[i].pciDeviceID = md.index(a.pciAssignments[i]) + 1 + } else { + // Not multifunction PCI device. + a.pciAssignments[i].pciBridgeID = 0 + a.pciAssignments[i].pciDeviceID = pciDeviceID + pciDeviceID++ + } + } + return nil +} + type pciDevicesWithBridge struct { bridgeBus string devs []*pciDevice } -type multifunctionDevs map[string]*pciDevicesWithBridge // key: pci long without function number - -func (md multifunctionDevs) isMultiFunction(p pciDevice) bool { - pciLongWOFunc, err := p.pciLongWOFunction() - if err != nil { - return false +func (pd pciDevicesWithBridge) index(p pciDevice) int { + for i, dev := range pd.devs { + if p.sameDevice(*dev) { + return i + } } - devs, found := md[pciLongWOFunc] - return found && len(devs.devs) > 1 + return -1 } -func (md multifunctionDevs) index(p pciDevice) int { - pciLongWOFunc, err := p.pciLongWOFunction() - if err != nil { - logrus.Warnf("retrieving pci address without function failed: %v", err) - return -1 +// compareOrder determines if this (possibly multifunction) device should be ordered +// (in the PCI hierarchy) before the other given device. +// Please note that if both booleans are true, then the user-defined order is invalid +// and would break the (multifunction) device if applied. +// If both return values are false, the order is undefined. This occurs when one or both +// devices lack a network function (user only specifies order for network interfaces). +func (pd pciDevicesWithBridge) compareOrder( + pd2 pciDevicesWithBridge) (isBefore, isAfter bool) { + for _, dev := range pd.devs { + if !dev.ioType.IsNet() { + continue + } + for _, dev2 := range pd2.devs { + if !dev2.ioType.IsNet() { + continue + } + if dev.netIntfOrder < dev2.netIntfOrder { + isBefore = true + } + if dev.netIntfOrder > dev2.netIntfOrder { + isAfter = true + } + } } - pciDevices, found := md[pciLongWOFunc] - if !found { - return -1 + return isBefore, isAfter +} + +// compareOrderWithVirtNet determines if this (possibly multifunction) device should be +// ordered (in the PCI hierarchy) before or after the given virtual network device. +// Please note that if both booleans are true, then the user-defined order is invalid +// and would break the (multifunction) device if applied. +// If both return values are false, the order is undefined. This occurs when this device +// lacks a network function (user only specifies order for network interfaces). +func (pd pciDevicesWithBridge) compareOrderWithVirtNet( + virtNet virtualNetwork) (isBefore, isAfter bool) { + for _, dev := range pd.devs { + if !dev.ioType.IsNet() { + continue + } + if dev.netIntfOrder < virtNet.VifOrder { + isBefore = true + } + if dev.netIntfOrder > virtNet.VifOrder { + isAfter = true + } } + return isBefore, isAfter +} - for i, dev := range pciDevices.devs { - if p.ioType == dev.ioType && p.pciLong == dev.pciLong { - return i +// Return true if device has at least one network function. +func (pd pciDevicesWithBridge) hasNetworkFunction() bool { + for _, dev := range pd.devs { + if dev.ioType.IsNet() { + return true } } + return false +} - return -1 +type multifunctionDevs map[string]*pciDevicesWithBridge // key: pci long without function number + +func (md multifunctionDevs) isMultiFunction(p pciDevice) bool { + pciLongWOFunc, err := p.pciLongWOFunction() + if err != nil { + return false + } + devs, found := md[pciLongWOFunc] + return found && len(devs.devs) > 1 } func multifunctionDevGroup(pcis []pciDevice) multifunctionDevs { @@ -1127,45 +1383,32 @@ func multifunctionDevGroup(pcis []pciDevice) multifunctionDevs { return mds } -func (p pciDevice) pciLongWOFunction() (string, error) { - pciLongSplit := strings.Split(p.pciLong, ".") - if len(pciLongSplit) == 0 { - return "", fmt.Errorf("could not split %s", p.pciLong) - } - pciWithoutFunction := strings.Join(pciLongSplit[0:len(pciLongSplit)-1], ".") - - return pciWithoutFunction, nil -} - type pciAssignmentsTemplateFiller struct { multifunctionDevices multifunctionDevs file io.Writer } func (f *pciAssignmentsTemplateFiller) pciEBridge(pciID int, pciWOFunction string) error { - pcieBridgeContext := tQemuPCIeBridgeContext{Bus: pciID} + pcieBridgeContext := tQemuPCIeBridgeContext{PCIId: pciID} if err := tQemuPCIeBridge.Execute(f.file, pcieBridgeContext); err != nil { return fmt.Errorf("can't write PCIe bridge Passthrough to config file (%w)", err) } f.multifunctionDevices[pciWOFunction].bridgeBus = fmt.Sprintf("pcie-bridge.%d", pciID) - return nil } -func (f *pciAssignmentsTemplateFiller) do(file io.Writer, pciAssignments []pciDevice, pciID int) error { +func (f *pciAssignmentsTemplateFiller) do(pciAssignments []pciDevice) error { if len(pciAssignments) == 0 { return nil } - var pcieRPContext tQemuPCIeRootPortContext - var pciPTContext tQemuPCIPassthruContext pciEBridgeForMultiFuncDevCreated := make(map[string]struct{}) // key: pci long without function number - for i, pa := range pciAssignments { - pcieRPContext.PCIId = pciID + i - pciPTContext.Xopregion = false - pciPTContext.Xvga = pa.isVGA() - pciPTContext.PciShortAddr = types.PCILongToShort(pa.pciLong) - + for _, pa := range pciAssignments { + pciPTContext := tQemuPCIPassthruContext{ + PciShortAddr: types.PCILongToShort(pa.pciLong), + Xvga: pa.isVGA(), + Xopregion: false, + } if vendor, err := pa.vid(); err == nil { // check for Intel vendor if vendor == "0x8086" { @@ -1184,32 +1427,35 @@ func (f *pciAssignmentsTemplateFiller) do(file io.Writer, pciAssignments []pciDe } _, pciEBridgeCreated := pciEBridgeForMultiFuncDevCreated[pciLongWoFunc] pciEBridgeForMultiFuncDevCreated[pciLongWoFunc] = struct{}{} - - // for non-multifunction devices, every pci device gets a "pcie-root-port" - if !f.multifunctionDevices.isMultiFunction(pa) || !pciEBridgeCreated { - if err := tQemuPCIeRootPort.Execute(file, pcieRPContext); err != nil { - return logError("can't write Root Port PCI Passthrough to config file (%v)", err) + isMultifunctionDev := f.multifunctionDevices.isMultiFunction(pa) + + // Connect device using PCI Express Root Port either directly or via bridge if it + // has multiple functions. + if !isMultifunctionDev || !pciEBridgeCreated { + var pcieRPContext tQemuPCIeRootPortContext + if isMultifunctionDev { + pcieRPContext.PCIId = pa.pciBridgeID + } else { + pcieRPContext.PCIId = pa.pciDeviceID + } + if err := tQemuPCIeRootPort.Execute(f.file, pcieRPContext); err != nil { + return logError("can't write PCIe Root Port to config file (%v)", err) } } - if f.multifunctionDevices.isMultiFunction(pa) { + if isMultifunctionDev { if !pciEBridgeCreated { - err := f.pciEBridge(pcieRPContext.PCIId, pciLongWoFunc) + err := f.pciEBridge(pa.pciBridgeID, pciLongWoFunc) if err != nil { logrus.Warnf("could not write template: %v, skipping", err) } } - pciPTContext.Bus = f.multifunctionDevices[pciLongWoFunc].bridgeBus - funcIndex := f.multifunctionDevices.index(pa) - if funcIndex < 0 { - logrus.Warn("PCI function index is less than 0 - skipping") - } - pciPTContext.Addr = fmt.Sprintf("0x%x", funcIndex+1) // Unsupported PCI slot 0 for standard hotplug controller + pciPTContext.Addr = fmt.Sprintf("0x%x", pa.pciDeviceID) } else { - pciPTContext.Bus = fmt.Sprintf("pci.%d", pcieRPContext.PCIId) + pciPTContext.Bus = fmt.Sprintf("pci.%d", pa.pciDeviceID) pciPTContext.Addr = "0x0" } - if err := tQemuPCIPassthru.Execute(file, pciPTContext); err != nil { + if err := tQemuPCIPassthru.Execute(f.file, pciPTContext); err != nil { return logError("can't write PCI Passthrough to config file (%v)", err) } } @@ -1217,6 +1463,33 @@ func (f *pciAssignmentsTemplateFiller) do(file io.Writer, pciAssignments []pciDe return nil } +type virtNetworkTemplateFiller struct { + file io.Writer +} + +func (f *virtNetworkTemplateFiller) do(virtualNetworks []virtualNetwork, + virtMode types.VmMode) error { + for _, virtNet := range virtualNetworks { + netContext := tQemuNetContext{ + PCIId: virtNet.pciDeviceID, + NetID: virtNet.networkID, + Mac: virtNet.Mac.String(), + Bridge: virtNet.Bridge, + Vif: virtNet.Vif, + MTU: virtNet.MTU, + } + if virtMode == types.LEGACY { + netContext.Driver = "e1000" + } else { + netContext.Driver = "virtio-net-pci" + } + if err := tQemuNet.Execute(f.file, netContext); err != nil { + return logError("failed to write network template to config file: %v", err) + } + } + return nil +} + // CreateDomConfig creates a domain config (a qemu config file, // typically named something like xen-%d.cfg) func (ctx KvmContext) CreateDomConfig(domainName string, @@ -1288,32 +1561,9 @@ func (ctx KvmContext) CreateDomConfig(domainName string, diskContext.DiskID = diskContext.DiskID + 1 } - // render network device model settings - netContext := tQemuNetContext{PCIId: diskContext.PCIId} - for _, net := range config.VifList { - netContext.Mac = net.Mac.String() - netContext.Bridge = net.Bridge - netContext.Vif = net.Vif - if config.VirtualizationMode == types.LEGACY { - netContext.Driver = "e1000" - } else { - netContext.Driver = "virtio-net-pci" - } - netContext.MTU = net.MTU - if err := tQemuNet.Execute(file, netContext); err != nil { - return logError("can't write to config file %s (%v)", file.Name(), err) - } - netContext.PCIId = netContext.PCIId + 1 - netContext.NetID = netContext.NetID + 1 - } - - // Gather all PCI assignments into a single line var pciAssignments []pciDevice - // Gather all serial assignments into a single line var serialAssignments []string - // Gather all CAN Bus assignments into a single line canBusAssignments := make(map[string]string) - for _, adapter := range config.IoAdapterList { logrus.Debugf("processing adapter %d %s\n", adapter.Type, adapter.Name) list := aa.LookupIoBundleAny(adapter.Name) @@ -1334,6 +1584,9 @@ func (ctx KvmContext) CreateDomConfig(domainName string, if ib.PciLong != "" && ib.UsbAddr == "" { logrus.Infof("Adding PCI device <%v>\n", ib.PciLong) tap := pciDevice{pciLong: ib.PciLong, ioType: ib.Type} + if ib.Type.IsNet() { + tap.netIntfOrder = adapter.IntfOrder + } pciAssignments = addNoDuplicatePCI(pciAssignments, tap) } if ib.Serial != "" { @@ -1357,15 +1610,54 @@ func (ctx KvmContext) CreateDomConfig(domainName string, } } + // Group functions of the same multifunction PCI device together. + multifunctionDevices := multifunctionDevGroup(pciAssignments) + + // Prepare a list of virtual interfaces connecting the application with network + // instances. + var virtualNetworks []virtualNetwork + var networkID int + for _, vif := range config.VifList { + virtualNetworks = append(virtualNetworks, virtualNetwork{ + VifConfig: vif, + networkID: networkID, + }) + networkID++ + } + + // Determine PCI addresses for all virtual networks and direct PCI assignments. + addrAllocator := pciAddressAllocator{ + pciAssignments: pciAssignments, + virtualNetworks: virtualNetworks, + multifunctionDevices: multifunctionDevices, + firstFreePCIID: diskContext.PCIId, + enforceNetInterfaceOrder: config.EnforceNetworkInterfaceOrder, + } + // Set pciDeviceID and pciBridgeID for every item in pciAssignments and virtualNetworks. + if err = addrAllocator.allocate(); err != nil { + return logError(err.Error()) + } + + // Render virtual network interfaces. + virtNetworksFiller := virtNetworkTemplateFiller{ + file: file, + } + err = virtNetworksFiller.do(virtualNetworks, config.VirtualizationMode) + if err != nil { + return logError(err.Error()) + } + + // Render PCI assignments. pciAssignmentsFiller := pciAssignmentsTemplateFiller{ - multifunctionDevices: multifunctionDevGroup(pciAssignments), + multifunctionDevices: multifunctionDevices, file: file, } - - err = pciAssignmentsFiller.do(file, pciAssignments, netContext.PCIId) + err = pciAssignmentsFiller.do(pciAssignments) if err != nil { return fmt.Errorf("writing to template file %s failed: %w", file.Name(), err) } + + // Render serial assignments. if len(serialAssignments) != 0 { serialPortContext := tQemuSerialContext{Machine: ctx.devicemodel} for id, serial := range serialAssignments { @@ -1377,6 +1669,8 @@ func (ctx KvmContext) CreateDomConfig(domainName string, } } } + + // Render CANBus assignments. if len(canBusAssignments) != 0 { canIfContext := tQemuCANBusContext{Machine: ctx.devicemodel} id := 0 diff --git a/pkg/pillar/hypervisor/kvm_test.go b/pkg/pillar/hypervisor/kvm_test.go index b23a431e1e..f8c2e4517a 100644 --- a/pkg/pillar/hypervisor/kvm_test.go +++ b/pkg/pillar/hypervisor/kvm_test.go @@ -12,6 +12,7 @@ import ( "github.com/google/go-cmp/cmp" zconfig "github.com/lf-edge/eve-api/go/config" "github.com/lf-edge/eve/pkg/pillar/types" + . "github.com/onsi/gomega" uuid "github.com/satori/go.uuid" ) @@ -2857,11 +2858,20 @@ func TestPCIAssignmentsTemplateFillMultifunctionDevice(t *testing.T) { } wr := bytes.Buffer{} + multifunctionDevices := multifunctionDevGroup(pciAssignments) + addrAllocator := pciAddressAllocator{ + pciAssignments: pciAssignments, + multifunctionDevices: multifunctionDevices, + } + if err := addrAllocator.allocate(); err != nil { + t.Error(err) + } + p := pciAssignmentsTemplateFiller{ - multifunctionDevices: multifunctionDevGroup(pciAssignments), + multifunctionDevices: multifunctionDevices, file: &wr, } - p.do(&wr, pciAssignments, 0) + p.do(pciAssignments) if wr.String() != expectedMultifunctionDevice() { t.Fatalf("not equal, diff: \n%s\ncomplete:\n%s", cmp.Diff(wr.String(), expectedMultifunctionDevice()), wr.String()) @@ -2907,3 +2917,382 @@ func TestConvertToMultifunctionPCIDevices(t *testing.T) { t.Fatal("expected one device") } } + +func TestPCIAddressAllocator(t *testing.T) { + g := NewGomegaWithT(t) + virtualNetworks := []virtualNetwork{ + { + VifConfig: types.VifConfig{ + Bridge: "br1", + Vif: "nbu1x1", + Mac: net.HardwareAddr{0x02, 0x16, 0x3e, 0x00, 0x00, 0x01}, + MTU: 1500, + VifOrder: 1, + }, + networkID: 0, + }, + { + VifConfig: types.VifConfig{ + Bridge: "br2", + Vif: "nbu2x1", + Mac: net.HardwareAddr{0x02, 0x16, 0x3e, 0x00, 0x00, 0x02}, + MTU: 1500, + VifOrder: 4, + }, + networkID: 1, + }, + } + pciAssignments := []pciDevice{ + { + pciLong: "0000:06:00.0", + ioType: types.IoNetEth, + netIntfOrder: 2, + }, + { + pciLong: "0000:00:15.0", + ioType: types.IoUSB, + }, + { + pciLong: "0000:06:00.2", + ioType: types.IoOther, + }, + { + pciLong: "0000:06:00.1", + ioType: types.IoNetEth, + netIntfOrder: 3, + }, + { + pciLong: "0000:08:00.0", + ioType: types.IoNetWWAN, + netIntfOrder: 0, + }, + } + multifunctionDevices := multifunctionDevGroup(pciAssignments) + g.Expect(multifunctionDevices).To(HaveLen(3)) + addrAllocator := pciAddressAllocator{ + pciAssignments: pciAssignments, + virtualNetworks: virtualNetworks, + multifunctionDevices: multifunctionDevices, + firstFreePCIID: 5, + // First test the legacy order. + enforceNetInterfaceOrder: false, + } + err := addrAllocator.allocate() + g.Expect(err).ToNot(HaveOccurred()) + + g.Expect(virtualNetworks[0].pciDeviceID).To(Equal(5)) + g.Expect(virtualNetworks[1].pciDeviceID).To(Equal(6)) + g.Expect(pciAssignments[0].pciBridgeID).To(Equal(7)) + g.Expect(pciAssignments[0].pciDeviceID).To(Equal(1)) + g.Expect(pciAssignments[1].pciBridgeID).To(Equal(0)) + g.Expect(pciAssignments[1].pciDeviceID).To(Equal(8)) + g.Expect(pciAssignments[2].pciBridgeID).To(Equal(7)) + g.Expect(pciAssignments[2].pciDeviceID).To(Equal(2)) + g.Expect(pciAssignments[3].pciBridgeID).To(Equal(7)) + g.Expect(pciAssignments[3].pciDeviceID).To(Equal(3)) + g.Expect(pciAssignments[4].pciBridgeID).To(Equal(0)) + g.Expect(pciAssignments[4].pciDeviceID).To(Equal(9)) + + // Check generated config with the legacy order. + buffer := bytes.Buffer{} + vnFiller := virtNetworkTemplateFiller{ + file: &buffer, + } + err = vnFiller.do(virtualNetworks, types.HVM) + g.Expect(err).ToNot(HaveOccurred()) + paFiller := pciAssignmentsTemplateFiller{ + multifunctionDevices: multifunctionDevices, + file: &buffer, + } + err = paFiller.do(pciAssignments) + g.Expect(err).ToNot(HaveOccurred()) + expectedConfig := ` +[device "pci.5"] + driver = "pcie-root-port" + port = "15" + chassis = "5" + bus = "pcie.0" + multifunction = "on" + addr = "0x5" + +[netdev "hostnet0"] + type = "tap" + ifname = "nbu1x1" + br = "br1" + script = "/etc/xen/scripts/qemu-ifup" + downscript = "no" + vhost = "on" + +[device "net0"] + driver = "virtio-net-pci" + netdev = "hostnet0" + mac = "02:16:3e:00:00:01" + bus = "pci.5" + addr = "0x0" + host_mtu = "1500" + +[device "pci.6"] + driver = "pcie-root-port" + port = "16" + chassis = "6" + bus = "pcie.0" + multifunction = "on" + addr = "0x6" + +[netdev "hostnet1"] + type = "tap" + ifname = "nbu2x1" + br = "br2" + script = "/etc/xen/scripts/qemu-ifup" + downscript = "no" + vhost = "on" + +[device "net1"] + driver = "virtio-net-pci" + netdev = "hostnet1" + mac = "02:16:3e:00:00:02" + bus = "pci.6" + addr = "0x0" + host_mtu = "1500" + +[device "pci.7"] + driver = "pcie-root-port" + port = "17" + chassis = "7" + bus = "pcie.0" + multifunction = "on" + addr = "0x7" + +[device "pcie-bridge.7"] + driver = "pcie-pci-bridge" + bus = "pci.7" + addr = "0x0" + +[device] + driver = "vfio-pci" + host = "06:00.0" + bus = "pcie-bridge.7" + addr = "0x1" + +[device "pci.8"] + driver = "pcie-root-port" + port = "18" + chassis = "8" + bus = "pcie.0" + multifunction = "on" + addr = "0x8" + +[device] + driver = "vfio-pci" + host = "00:15.0" + bus = "pci.8" + addr = "0x0" + +[device] + driver = "vfio-pci" + host = "06:00.2" + bus = "pcie-bridge.7" + addr = "0x2" + +[device] + driver = "vfio-pci" + host = "06:00.1" + bus = "pcie-bridge.7" + addr = "0x3" + +[device "pci.9"] + driver = "pcie-root-port" + port = "19" + chassis = "9" + bus = "pcie.0" + multifunction = "on" + addr = "0x9" + +[device] + driver = "vfio-pci" + host = "08:00.0" + bus = "pci.9" + addr = "0x0" +` + g.Expect(buffer.String()).To(Equal(expectedConfig)) + + // Test enforced user-defined network interface order. + addrAllocator.enforceNetInterfaceOrder = true + err = addrAllocator.allocate() + g.Expect(err).ToNot(HaveOccurred()) + + g.Expect(virtualNetworks[0].pciDeviceID).To(Equal(6)) + g.Expect(virtualNetworks[1].pciDeviceID).To(Equal(8)) + g.Expect(pciAssignments[0].pciBridgeID).To(Equal(7)) + g.Expect(pciAssignments[0].pciDeviceID).To(Equal(1)) + g.Expect(pciAssignments[1].pciBridgeID).To(Equal(0)) + g.Expect(pciAssignments[1].pciDeviceID).To(Equal(9)) + g.Expect(pciAssignments[2].pciBridgeID).To(Equal(7)) + g.Expect(pciAssignments[2].pciDeviceID).To(Equal(3)) + g.Expect(pciAssignments[3].pciBridgeID).To(Equal(7)) + g.Expect(pciAssignments[3].pciDeviceID).To(Equal(2)) + g.Expect(pciAssignments[4].pciBridgeID).To(Equal(0)) + g.Expect(pciAssignments[4].pciDeviceID).To(Equal(5)) + + // Check generated config with the user-defined order. + buffer.Reset() + err = vnFiller.do(virtualNetworks, types.HVM) + g.Expect(err).ToNot(HaveOccurred()) + err = paFiller.do(pciAssignments) + g.Expect(err).ToNot(HaveOccurred()) + expectedConfig = ` +[device "pci.6"] + driver = "pcie-root-port" + port = "16" + chassis = "6" + bus = "pcie.0" + multifunction = "on" + addr = "0x6" + +[netdev "hostnet0"] + type = "tap" + ifname = "nbu1x1" + br = "br1" + script = "/etc/xen/scripts/qemu-ifup" + downscript = "no" + vhost = "on" + +[device "net0"] + driver = "virtio-net-pci" + netdev = "hostnet0" + mac = "02:16:3e:00:00:01" + bus = "pci.6" + addr = "0x0" + host_mtu = "1500" + +[device "pci.8"] + driver = "pcie-root-port" + port = "18" + chassis = "8" + bus = "pcie.0" + multifunction = "on" + addr = "0x8" + +[netdev "hostnet1"] + type = "tap" + ifname = "nbu2x1" + br = "br2" + script = "/etc/xen/scripts/qemu-ifup" + downscript = "no" + vhost = "on" + +[device "net1"] + driver = "virtio-net-pci" + netdev = "hostnet1" + mac = "02:16:3e:00:00:02" + bus = "pci.8" + addr = "0x0" + host_mtu = "1500" + +[device "pci.7"] + driver = "pcie-root-port" + port = "17" + chassis = "7" + bus = "pcie.0" + multifunction = "on" + addr = "0x7" + +[device "pcie-bridge.7"] + driver = "pcie-pci-bridge" + bus = "pci.7" + addr = "0x0" + +[device] + driver = "vfio-pci" + host = "06:00.0" + bus = "pcie-bridge.7" + addr = "0x1" + +[device "pci.9"] + driver = "pcie-root-port" + port = "19" + chassis = "9" + bus = "pcie.0" + multifunction = "on" + addr = "0x9" + +[device] + driver = "vfio-pci" + host = "00:15.0" + bus = "pci.9" + addr = "0x0" + +[device] + driver = "vfio-pci" + host = "06:00.2" + bus = "pcie-bridge.7" + addr = "0x3" + +[device] + driver = "vfio-pci" + host = "06:00.1" + bus = "pcie-bridge.7" + addr = "0x2" + +[device "pci.5"] + driver = "pcie-root-port" + port = "15" + chassis = "5" + bus = "pcie.0" + multifunction = "on" + addr = "0x5" + +[device] + driver = "vfio-pci" + host = "08:00.0" + bus = "pci.5" + addr = "0x0" +` + g.Expect(buffer.String()).To(Equal(expectedConfig)) + + // Try re-ordering functions of a multifunction device. This should be allowed. + pciAssignments[0].netIntfOrder = 3 + pciAssignments[3].netIntfOrder = 2 + err = addrAllocator.allocate() + g.Expect(err).ToNot(HaveOccurred()) + + g.Expect(virtualNetworks[0].pciDeviceID).To(Equal(6)) + g.Expect(virtualNetworks[1].pciDeviceID).To(Equal(8)) + g.Expect(pciAssignments[0].pciBridgeID).To(Equal(7)) + g.Expect(pciAssignments[0].pciDeviceID).To(Equal(2)) // 1 -> 2 + g.Expect(pciAssignments[1].pciBridgeID).To(Equal(0)) + g.Expect(pciAssignments[1].pciDeviceID).To(Equal(9)) + g.Expect(pciAssignments[2].pciBridgeID).To(Equal(7)) + g.Expect(pciAssignments[2].pciDeviceID).To(Equal(3)) + g.Expect(pciAssignments[3].pciBridgeID).To(Equal(7)) + g.Expect(pciAssignments[3].pciDeviceID).To(Equal(1)) // 2 -> 1 + g.Expect(pciAssignments[4].pciBridgeID).To(Equal(0)) + g.Expect(pciAssignments[4].pciDeviceID).To(Equal(5)) + + // Try to put virtual interface in-between functions of a multifunction device. + // This should not be allowed. + virtualNetworks[1].VifOrder = 3 + pciAssignments[0].netIntfOrder = 4 + + err = addrAllocator.allocate() + g.Expect(err).To(HaveOccurred()) + g.Expect(err.Error()).To(ContainSubstring("Invalid VIF nbu2x1 configuration: " + + "user-defined network interface order disrupts the function sequence " + + "of the multifunction PCI device 0000:06:00")) + // Revert the invalid config change. + virtualNetworks[1].VifOrder = 4 + pciAssignments[0].netIntfOrder = 3 + err = addrAllocator.allocate() + g.Expect(err).ToNot(HaveOccurred()) + + // Try to put PCI-passthrough network device in-between functions of a multifunction + // device. This should not be allowed. + pciAssignments[4].netIntfOrder = 3 + pciAssignments[0].netIntfOrder = 4 + + err = addrAllocator.allocate() + g.Expect(err).To(HaveOccurred()) + fmt.Println(err.Error()) + g.Expect(err.Error()).To(ContainSubstring("User-defined network interface order " + + "disrupts the function sequence of the multifunction PCI devices 0000:06:00 and 0000:08:00")) +} diff --git a/pkg/pillar/hypervisor/pci.go b/pkg/pillar/hypervisor/pci.go index ba91826d1e..4a663dac46 100644 --- a/pkg/pillar/hypervisor/pci.go +++ b/pkg/pillar/hypervisor/pci.go @@ -75,6 +75,23 @@ func addNoDuplicatePCI(list []pciDevice, tap pciDevice) []pciDevice { type pciDevice struct { pciLong string ioType types.IoType + // netIntfOrder is only applied to network devices when EnforceNetworkInterfaceOrder + // is enabled. + netIntfOrder uint32 + + // pciBridgeID and pciDeviceID are set by pciAddressAllocator. + + // PCI bridge is only used for multifunction PCI devices. + // In that case pciBridgeID is address of the bridge on the root bus, while + // pciDeviceID is device address inside the secondary bus provided by the bridge. + // For single-function PCI devices, bridge is unused, pciBridgeID is unset + // and pciDeviceID points to device address on the root bus. + pciBridgeID int + pciDeviceID int +} + +func (d pciDevice) sameDevice(d2 pciDevice) bool { + return d.ioType == d2.ioType && d.pciLong == d2.pciLong } // check if the PCI device is a VGA device @@ -102,6 +119,16 @@ func (d pciDevice) devid() (string, error) { return strings.TrimSpace(strings.TrimSuffix(string(devID), "\n")), nil } +// Return PCI long address without the function suffix. +func (d pciDevice) pciLongWOFunction() (string, error) { + pciLongSplit := strings.Split(d.pciLong, ".") + if len(pciLongSplit) == 0 { + return "", fmt.Errorf("could not split %s", d.pciLong) + } + pciWithoutFunction := strings.Join(pciLongSplit[0:len(pciLongSplit)-1], ".") + return pciWithoutFunction, nil +} + // isBridge checks if the given PCI device is a bridge. // It reads the device's class from the sysfs filesystem and returns true if the class // starts with "0x06", which is the PCI base class code for bridges. diff --git a/pkg/pillar/hypervisor/xen.go b/pkg/pillar/hypervisor/xen.go index 565dca6f14..8c21c9b94f 100644 --- a/pkg/pillar/hypervisor/xen.go +++ b/pkg/pillar/hypervisor/xen.go @@ -163,6 +163,12 @@ func (ctx xenContext) CreateDomConfig(domainName string, xenGlobal := "" uuidStr := fmt.Sprintf("appuuid=%s ", config.UUIDandVersion.UUID) + if config.EnforceNetworkInterfaceOrder { + logrus.Errorf("Enforcing user-defined network interface order is not supported "+ + "with the Xen hypervisor. Ignoring EnforceNetworkInterfaceOrder flag "+ + "for app %s", config.DisplayName) + } + switch config.VirtualizationMode { case types.PV: xenType = "pv" From 3de69bd7006dbd81d7ee08cc41eb7e2d84aedf9c Mon Sep 17 00:00:00 2001 From: Milan Lenco Date: Mon, 2 Dec 2024 11:50:54 +0100 Subject: [PATCH 5/5] Document application network interface order Describe both the legacy and the user-enforced interface ordering with all its limitations. Signed-off-by: Milan Lenco --- docs/APP-CONNECTIVITY.md | 60 +++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/docs/APP-CONNECTIVITY.md b/docs/APP-CONNECTIVITY.md index b9906b407a..dce07389cf 100644 --- a/docs/APP-CONNECTIVITY.md +++ b/docs/APP-CONNECTIVITY.md @@ -10,13 +10,59 @@ Network connectivity is enabled for an application by configuring one or more ne These consists of [virtual network interfaces](#virtual-network-interfaces), connecting application with [network instances](#network-instances), and directly assigned [physical NIC](#physical-network-ports) or [SR-IOV virtual functions](#sr-iov-vfs). -The order of network adapter configurations inside `AppInstanceConfig` matters, because this -is the same order at which these network adapters will be presented to the application by the -Virtual Machine Manager (VMM). -This order is reflected in the PCI addresses of the adapters. It is important to note that VIFs -and direct assignments are configured in two separate lists. The VMM is configured to present -VIFs first, adhering to their configured order, followed by direct assignments in their respective -order. User cannot enforce direct assignment to appear before VIF. + +### Interface order + +To match an application's network interface with its logical representation from the configuration, +using MAC addresses is recommended. For virtual network interfaces, users can configure MAC +addresses for easier interface identification. Meanwhile, directly assigned NICs are passed +through to applications with their original MAC addresses unchanged. + +However, since MAC addresses differ across a fleet of devices, having a predictable application +network interface order provides a simpler and more scalable matching solution. +But there are two main challenges related to application interface ordering, which make this method +less recommended: + +#### 1. Interface Order Configuration Limitations + +Virtual and directly assigned NICs are configured in two separate lists within `AppInstanceConfig`: +`Interfaces` (VIFs) and `Adapters` (direct assignments, including physical NICs and SR-IOV virtual +functions). Until EVE version 13.8.0, it was not possible to configure the order between items +of these two lists. Consequently, EVE would configure the VMM to present the VIFs first, followed +by direct assignments. While directly assigned NICs adhered to the `Adapters` list order, virtual +interfaces were ordered based on the lowest ACL rule ID assigned to each VIF. This caused undesired +behavior when ACL rule IDs (assigned by the controller) did not align with the user-defined VIF order. +Furthermore, VIFs without ACLs (rather useless interfaces since all traffic is blocked) were +represented with an ACL ID of 0 and always placed first in the interface list. + +EVE version 13.8.0 addressed this by allowing users to define the desired position of each VIF and +directly assigned network devices. This is propagated from controller to EVE via the `InterfaceOrder` +fields with unique (integer) values across both the `Interfaces` and `Adapters` lists. To maintain +backward compatibility and avoid changing interface order in existing deployments, the user-defined +order is applied only if `VmConfig.EnforceNetworkInterfaceOrder` is set to true. Otherwise, EVE +defaults to the legacy behavior described above. + +#### 2. Hypervisor Limitations + +The second, more fundamental challenge lies in the hypervisor's limited ability to control the order +of network interfaces inside VM applications. The actual interface order depends on the application OS, +and EVE cannot guarantee the desired outcome. + +For the KVM hypervisor, EVE attempts to enforce legacy or user-defined orders via the virtualized +PCI topology. Devices expected to appear earlier in the interface list are assigned lower PCI +addresses. This generally works for Linux-based systems, especially those using +the [systemd's naming scheme](https://www.freedesktop.org/software/systemd/man/latest/systemd.net-naming-scheme.html). +However, some limitations persist: + +* Devices of different types (e.g., Wi-Fi adapters vs. Ethernet NICs) often receive distinct name + prefixes from the application OS, making reordering impossible. +* Multifunction PCI devices must have all functions connected to the same PCI bridge and cannot be + interleaved with other devices. If a user places a VIF or another NIC between functions + of a multifunction device (with `EnforceNetworkInterfaceOrder` enabled), EVE will return an error, + and the application will not be deployed. + +For Xen and KubeVirt hypervisors, application interface order is undefined, and +`EnforceNetworkInterfaceOrder` is not yet supported. ### Physical network ports