feat: implement PCI device bus enumeration

Fixes #8826

From the QEMU VM:

```shell
$ talosctl -n 172.20.0.5 get pcidevice
NODE         NAMESPACE   TYPE        ID             VERSION   CLASS                       SUBCLASS                    VENDOR              PRODUCT
172.20.0.5   hardware    PCIDevice   0000:00:00.0   1         Bridge                      Host bridge                 Intel Corporation   82G33/G31/P35/P31 Express DRAM Controller
172.20.0.5   hardware    PCIDevice   0000:00:01.0   1         Display controller          VGA compatible controller
172.20.0.5   hardware    PCIDevice   0000:00:02.0   1         Network controller          Ethernet controller         Red Hat, Inc.       Virtio network device
172.20.0.5   hardware    PCIDevice   0000:00:03.0   1         Unclassified device                                     Red Hat, Inc.       Virtio RNG
172.20.0.5   hardware    PCIDevice   0000:00:04.0   1         Unclassified device                                     Red Hat, Inc.       Virtio memory balloon
172.20.0.5   hardware    PCIDevice   0000:00:05.0   1         Communication controller    Communication controller    Red Hat, Inc.       Virtio console
172.20.0.5   hardware    PCIDevice   0000:00:06.0   1         Generic system peripheral   System peripheral           Intel Corporation   6300ESB Watchdog Timer
172.20.0.5   hardware    PCIDevice   0000:00:07.0   1         Mass storage controller     SCSI storage controller     Red Hat, Inc.       Virtio block device
172.20.0.5   hardware    PCIDevice   0000:00:1f.0   1         Bridge                      ISA bridge                  Intel Corporation   82801IB (ICH9) LPC Interface Controller
172.20.0.5   hardware    PCIDevice   0000:00:1f.2   1         Mass storage controller     SATA controller             Intel Corporation   82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode]
172.20.0.5   hardware    PCIDevice   0000:00:1f.3   1         Serial bus controller       SMBus                       Intel Corporation   82801I (ICH9 Family) SMBus Controller
```

```yaml
node: 172.20.0.5
metadata:
    namespace: hardware
    type: PCIDevices.hardware.talos.dev
    id: 0000:00:1f.3
    version: 1
    owner: hardware.PCIDevicesController
    phase: running
    created: 2024-05-30T12:09:05Z
    updated: 2024-05-30T12:09:05Z
spec:
    class: Serial bus controller
    subclass: SMBus
    vendor: Intel Corporation
    product: 82801I (ICH9 Family) SMBus Controller
    class_id: "0x0c"
    subclass_id: "0x05"
    vendor_id: "0x8086"
    product_id: "0x2930"
```

Signed-off-by: Andrey Smirnov <andrey.smirnov@siderolabs.com>
This commit is contained in:
Andrey Smirnov 2024-05-30 16:13:57 +04:00
parent b0466e0abf
commit 4dd0aa7120
No known key found for this signature in database
GPG Key ID: FE042E3D4085A811
15 changed files with 990 additions and 64 deletions

View File

@ -16,6 +16,18 @@ message MemoryModuleSpec {
string product_name = 8;
}
// PCIDeviceSpec represents a single processor.
message PCIDeviceSpec {
string class = 1;
string subclass = 2;
string vendor = 3;
string product = 4;
string class_id = 5;
string subclass_id = 6;
string vendor_id = 7;
string product_id = 8;
}
// ProcessorSpec represents a single processor.
message ProcessorSpec {
string socket = 1;

2
go.mod
View File

@ -137,7 +137,7 @@ require (
github.com/siderolabs/go-kubeconfig v0.1.0
github.com/siderolabs/go-kubernetes v0.2.9
github.com/siderolabs/go-loadbalancer v0.3.3
github.com/siderolabs/go-pcidb v0.2.0
github.com/siderolabs/go-pcidb v0.3.0
github.com/siderolabs/go-pointer v1.0.0
github.com/siderolabs/go-procfs v0.1.2
github.com/siderolabs/go-retry v0.3.3

4
go.sum
View File

@ -678,8 +678,8 @@ github.com/siderolabs/go-kubernetes v0.2.9 h1:EtaOcni9P0etJz+UDlIKQkgsTjCg2MWI2p
github.com/siderolabs/go-kubernetes v0.2.9/go.mod h1:AAydnLZrqG+MJrKTa82AszkWIytkqwDBt7PL+bfbupI=
github.com/siderolabs/go-loadbalancer v0.3.3 h1:D6ONnP9Erlh4TS6kV9L7ocnfrNYCA/58i6ZF0QweLJk=
github.com/siderolabs/go-loadbalancer v0.3.3/go.mod h1:7j4Q9peU/UFuTNSFfwhKLQ028CNkyMkAdGnSi1Dm7Jw=
github.com/siderolabs/go-pcidb v0.2.0 h1:ZCkF1cz6UjoEIHpP7+aeTI5BwmSxE627Jl1Wy2VZAwU=
github.com/siderolabs/go-pcidb v0.2.0/go.mod h1:XstZrp8xnganxzIc3UQKfCs1fQFgYWH2lqtWeqBwRok=
github.com/siderolabs/go-pcidb v0.3.0 h1:jR4w1YLNY8Cv1o5jnoQ2Q+pbxcosO2FVFrAAp1RURnw=
github.com/siderolabs/go-pcidb v0.3.0/go.mod h1:4XYdmnR/o9kSzMe8dKK17wLBhPNIsisjqmU3QD1FjRk=
github.com/siderolabs/go-pointer v1.0.0 h1:6TshPKep2doDQJAAtHUuHWXbca8ZfyRySjSBT/4GsMU=
github.com/siderolabs/go-pointer v1.0.0/go.mod h1:HTRFUNYa3R+k0FFKNv11zgkaCLzEkWVzoYZ433P3kHc=
github.com/siderolabs/go-procfs v0.1.2 h1:bDs9hHyYGE2HO1frpmUsD60yg80VIEDrx31fkbi4C8M=

View File

@ -49,6 +49,12 @@ machine:
```
Please note that on running cluster you will have to kill CoreDNS pods for this change to apply.
"""
[notes.lspci]
title = "PCI Devices"
description = """\
A list of PCI devices can now be obtained via `PCIDevices` resource, e.g. `talosctl get pcidevices`.
"""
[make_deps]

View File

@ -0,0 +1,138 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package hardware
import (
"bytes"
"context"
"fmt"
"os"
"path/filepath"
"strconv"
"github.com/cosi-project/runtime/pkg/controller"
"github.com/cosi-project/runtime/pkg/safe"
"github.com/siderolabs/go-pcidb/pkg/pcidb"
"go.uber.org/zap"
runtimetalos "github.com/siderolabs/talos/internal/app/machined/pkg/runtime"
"github.com/siderolabs/talos/pkg/machinery/resources/hardware"
)
// PCIDevicesController populates PCI device information.
type PCIDevicesController struct {
V1Alpha1Mode runtimetalos.Mode
}
// Name implements controller.Controller interface.
func (ctrl *PCIDevicesController) Name() string {
return "hardware.PCIDevicesController"
}
// Inputs implements controller.Controller interface.
func (ctrl *PCIDevicesController) Inputs() []controller.Input {
return nil
}
// Outputs implements controller.Controller interface.
func (ctrl *PCIDevicesController) Outputs() []controller.Output {
return []controller.Output{
{
Type: hardware.PCIDeviceType,
Kind: controller.OutputExclusive,
},
}
}
// Run implements controller.Controller interface.
//
//nolint:gocyclo
func (ctrl *PCIDevicesController) Run(ctx context.Context, r controller.Runtime, logger *zap.Logger) error {
// PCI device info doesn't make sense inside a container, so skip the controller
if ctrl.V1Alpha1Mode == runtimetalos.ModeContainer {
return nil
}
// [TODO]: a single run for now, need to figure out how to trigger rescan
for {
select {
case <-ctx.Done():
return nil
case <-r.EventCh():
}
deviceIDs, err := os.ReadDir("/sys/bus/pci/devices")
if err != nil {
return fmt.Errorf("error scanning devices: %w", err)
}
logger.Debug("found PCI devices", zap.Int("count", len(deviceIDs)))
r.StartTrackingOutputs()
for _, deviceID := range deviceIDs {
class, err := readHexPCIInfo(deviceID.Name(), "class")
if err != nil {
if os.IsNotExist(err) {
continue
}
return fmt.Errorf("error parsing device %s class: %w", deviceID.Name(), err)
}
vendor, err := readHexPCIInfo(deviceID.Name(), "vendor")
if err != nil {
if os.IsNotExist(err) {
continue
}
return fmt.Errorf("error parsing device %s vendor: %w", deviceID.Name(), err)
}
product, err := readHexPCIInfo(deviceID.Name(), "device")
if err != nil {
if os.IsNotExist(err) {
continue
}
return fmt.Errorf("error parsing device %s product: %w", deviceID.Name(), err)
}
classID := pcidb.Class((class >> 16) & 0xff)
subclassID := pcidb.Subclass((class >> 8) & 0xff)
vendorID := pcidb.Vendor(vendor)
productID := pcidb.Product(product)
if err := safe.WriterModify(ctx, r, hardware.NewPCIDeviceInfo(deviceID.Name()), func(r *hardware.PCIDevice) error {
r.TypedSpec().ClassID = fmt.Sprintf("0x%02x", classID)
r.TypedSpec().SubclassID = fmt.Sprintf("0x%02x", subclassID)
r.TypedSpec().VendorID = fmt.Sprintf("0x%04x", vendorID)
r.TypedSpec().ProductID = fmt.Sprintf("0x%04x", productID)
r.TypedSpec().Class, _ = pcidb.LookupClass(classID)
r.TypedSpec().Subclass, _ = pcidb.LookupSubclass(classID, subclassID)
r.TypedSpec().Vendor, _ = pcidb.LookupVendor(vendorID)
r.TypedSpec().Product, _ = pcidb.LookupProduct(vendorID, productID)
return nil
}); err != nil {
return fmt.Errorf("error modifying output resource: %w", err)
}
}
if err = safe.CleanupOutputs[*hardware.PCIDevice](ctx, r); err != nil {
return err
}
}
}
func readHexPCIInfo(deviceID, info string) (uint64, error) {
contents, err := os.ReadFile(filepath.Join("/sys/bus/pci/devices", deviceID, info))
if err != nil {
return 0, err
}
return strconv.ParseUint(string(bytes.TrimSpace(contents)), 0, 64)
}

View File

@ -133,6 +133,9 @@ func (ctrl *Controller) Run(ctx context.Context, drainer *runtime.Drainer) error
EtcPath: "/etc",
ShadowPath: constants.SystemEtcPath,
},
&hardware.PCIDevicesController{
V1Alpha1Mode: ctrl.v1alpha1Runtime.State().Platform().Mode(),
},
&hardware.SystemInfoController{
V1Alpha1Mode: ctrl.v1alpha1Runtime.State().Platform().Mode(),
},

View File

@ -111,8 +111,9 @@ func NewState() (*State, error) {
&etcd.Member{},
&files.EtcFileSpec{},
&files.EtcFileStatus{},
&hardware.Processor{},
&hardware.MemoryModule{},
&hardware.PCIDevice{},
&hardware.Processor{},
&hardware.SystemInformation{},
&k8s.AdmissionControlConfig{},
&k8s.AuditPolicyConfig{},

View File

@ -0,0 +1,80 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
//go:build integration_api
package api
import (
"context"
"time"
"github.com/cosi-project/runtime/pkg/resource"
"github.com/cosi-project/runtime/pkg/safe"
"github.com/google/uuid"
"github.com/siderolabs/talos/internal/integration/base"
"github.com/siderolabs/talos/pkg/machinery/client"
"github.com/siderolabs/talos/pkg/machinery/resources/hardware"
)
// HardwareSuite ...
type HardwareSuite struct {
base.APISuite
ctx context.Context //nolint:containedctx
ctxCancel context.CancelFunc
}
// SuiteName ...
func (suite *HardwareSuite) SuiteName() string {
return "api.HardwareSuite"
}
// SetupTest ...
func (suite *HardwareSuite) SetupTest() {
if !suite.Capabilities().RunsTalosKernel {
suite.T().Skipf("doesn't run Talos kernel, skipping")
}
suite.ctx, suite.ctxCancel = context.WithTimeout(context.Background(), 15*time.Second)
}
// TearDownTest ...
func (suite *HardwareSuite) TearDownTest() {
if suite.ctxCancel != nil {
suite.ctxCancel()
}
}
// TestSystemInformation tests that SystemInformation is populated.
func (suite *HardwareSuite) TestSystemInformation() {
node := suite.RandomDiscoveredNodeInternalIP()
sysInfo, err := safe.StateGetByID[*hardware.SystemInformation](client.WithNode(suite.ctx, node), suite.Client.COSI, hardware.SystemInformationID)
suite.Require().NoError(err)
suite.Assert().NotEmpty(sysInfo.TypedSpec().UUID)
suite.Assert().NotEqual((uuid.UUID{}).String(), sysInfo.TypedSpec().UUID)
}
// TestHardwareInfo tests that hardware info is populated.
func (suite *HardwareSuite) TestHardwareInfo() {
node := suite.RandomDiscoveredNodeInternalIP()
for _, resourceType := range []resource.Type{
hardware.MemoryModuleType,
hardware.ProcessorType,
hardware.PCIDeviceType,
} {
items, err := suite.Client.COSI.List(client.WithNode(suite.ctx, node), resource.NewMetadata(hardware.NamespaceName, resourceType, "", resource.VersionUndefined))
suite.Require().NoError(err)
suite.Assert().NotEmpty(items.Items, "resource type %s is not populated", resourceType)
}
}
func init() {
allSuites = append(allSuites, new(HardwareSuite))
}

View File

@ -125,6 +125,110 @@ func (x *MemoryModuleSpec) GetProductName() string {
return ""
}
// PCIDeviceSpec represents a single processor.
type PCIDeviceSpec struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Class string `protobuf:"bytes,1,opt,name=class,proto3" json:"class,omitempty"`
Subclass string `protobuf:"bytes,2,opt,name=subclass,proto3" json:"subclass,omitempty"`
Vendor string `protobuf:"bytes,3,opt,name=vendor,proto3" json:"vendor,omitempty"`
Product string `protobuf:"bytes,4,opt,name=product,proto3" json:"product,omitempty"`
ClassId string `protobuf:"bytes,5,opt,name=class_id,json=classId,proto3" json:"class_id,omitempty"`
SubclassId string `protobuf:"bytes,6,opt,name=subclass_id,json=subclassId,proto3" json:"subclass_id,omitempty"`
VendorId string `protobuf:"bytes,7,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
ProductId string `protobuf:"bytes,8,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"`
}
func (x *PCIDeviceSpec) Reset() {
*x = PCIDeviceSpec{}
if protoimpl.UnsafeEnabled {
mi := &file_resource_definitions_hardware_hardware_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *PCIDeviceSpec) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*PCIDeviceSpec) ProtoMessage() {}
func (x *PCIDeviceSpec) ProtoReflect() protoreflect.Message {
mi := &file_resource_definitions_hardware_hardware_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use PCIDeviceSpec.ProtoReflect.Descriptor instead.
func (*PCIDeviceSpec) Descriptor() ([]byte, []int) {
return file_resource_definitions_hardware_hardware_proto_rawDescGZIP(), []int{1}
}
func (x *PCIDeviceSpec) GetClass() string {
if x != nil {
return x.Class
}
return ""
}
func (x *PCIDeviceSpec) GetSubclass() string {
if x != nil {
return x.Subclass
}
return ""
}
func (x *PCIDeviceSpec) GetVendor() string {
if x != nil {
return x.Vendor
}
return ""
}
func (x *PCIDeviceSpec) GetProduct() string {
if x != nil {
return x.Product
}
return ""
}
func (x *PCIDeviceSpec) GetClassId() string {
if x != nil {
return x.ClassId
}
return ""
}
func (x *PCIDeviceSpec) GetSubclassId() string {
if x != nil {
return x.SubclassId
}
return ""
}
func (x *PCIDeviceSpec) GetVendorId() string {
if x != nil {
return x.VendorId
}
return ""
}
func (x *PCIDeviceSpec) GetProductId() string {
if x != nil {
return x.ProductId
}
return ""
}
// ProcessorSpec represents a single processor.
type ProcessorSpec struct {
state protoimpl.MessageState
@ -148,7 +252,7 @@ type ProcessorSpec struct {
func (x *ProcessorSpec) Reset() {
*x = ProcessorSpec{}
if protoimpl.UnsafeEnabled {
mi := &file_resource_definitions_hardware_hardware_proto_msgTypes[1]
mi := &file_resource_definitions_hardware_hardware_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -161,7 +265,7 @@ func (x *ProcessorSpec) String() string {
func (*ProcessorSpec) ProtoMessage() {}
func (x *ProcessorSpec) ProtoReflect() protoreflect.Message {
mi := &file_resource_definitions_hardware_hardware_proto_msgTypes[1]
mi := &file_resource_definitions_hardware_hardware_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -174,7 +278,7 @@ func (x *ProcessorSpec) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProcessorSpec.ProtoReflect.Descriptor instead.
func (*ProcessorSpec) Descriptor() ([]byte, []int) {
return file_resource_definitions_hardware_hardware_proto_rawDescGZIP(), []int{1}
return file_resource_definitions_hardware_hardware_proto_rawDescGZIP(), []int{2}
}
func (x *ProcessorSpec) GetSocket() string {
@ -279,7 +383,7 @@ type SystemInformationSpec struct {
func (x *SystemInformationSpec) Reset() {
*x = SystemInformationSpec{}
if protoimpl.UnsafeEnabled {
mi := &file_resource_definitions_hardware_hardware_proto_msgTypes[2]
mi := &file_resource_definitions_hardware_hardware_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -292,7 +396,7 @@ func (x *SystemInformationSpec) String() string {
func (*SystemInformationSpec) ProtoMessage() {}
func (x *SystemInformationSpec) ProtoReflect() protoreflect.Message {
mi := &file_resource_definitions_hardware_hardware_proto_msgTypes[2]
mi := &file_resource_definitions_hardware_hardware_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -305,7 +409,7 @@ func (x *SystemInformationSpec) ProtoReflect() protoreflect.Message {
// Deprecated: Use SystemInformationSpec.ProtoReflect.Descriptor instead.
func (*SystemInformationSpec) Descriptor() ([]byte, []int) {
return file_resource_definitions_hardware_hardware_proto_rawDescGZIP(), []int{2}
return file_resource_definitions_hardware_hardware_proto_rawDescGZIP(), []int{3}
}
func (x *SystemInformationSpec) GetManufacturer() string {
@ -382,52 +486,67 @@ var file_resource_definitions_hardware_hardware_proto_rawDesc = []byte{
0x61, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54,
0x61, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x61,
0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,
0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x8a, 0x03, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,
0x73, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65,
0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12,
0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18,
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75,
0x72, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e,
0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75,
0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70,
0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70,
0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x65,
0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x53, 0x70, 0x65,
0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01,
0x28, 0x0d, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65,
0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28,
0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12,
0x1b, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x08, 0x20, 0x01,
0x28, 0x09, 0x52, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x61, 0x67, 0x12, 0x1f, 0x0a, 0x0b,
0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28,
0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a,
0x0a, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28,
0x0d, 0x52, 0x09, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c,
0x63, 0x6f, 0x72, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01,
0x28, 0x0d, 0x52, 0x0b, 0x63, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12,
0x21, 0x0a, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75,
0x6e, 0x74, 0x22, 0xf2, 0x01, 0x0a, 0x15, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66,
0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x22, 0x0a, 0x0c,
0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72,
0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e,
0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03,
0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a,
0x0d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04,
0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62,
0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x77, 0x61, 0x6b, 0x65, 0x5f, 0x75,
0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x61,
0x6b, 0x65, 0x55, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6b, 0x75, 0x5f,
0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6b,
0x75, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75,
0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73,
0x2f, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69,
0x6e, 0x65, 0x72, 0x79, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
0x65, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x68, 0x61,
0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x0d, 0x50, 0x43, 0x49, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a,
0x08, 0x73, 0x75, 0x62, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
0x08, 0x73, 0x75, 0x62, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65, 0x6e,
0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f,
0x72, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01,
0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63,
0x6c, 0x61, 0x73, 0x73, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x63, 0x6c, 0x61,
0x73, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62,
0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x65, 0x6e, 0x64, 0x6f,
0x72, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x6e, 0x64,
0x6f, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f,
0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,
0x74, 0x49, 0x64, 0x22, 0x8a, 0x03, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x22, 0x0a,
0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x02, 0x20,
0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65,
0x72, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d,
0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, 0x65, 0x65,
0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x65, 0x65,
0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18,
0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x53, 0x70, 0x65, 0x65, 0x64,
0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d,
0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x69,
0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,
0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a,
0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
0x52, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x61, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61,
0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,
0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63,
0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52,
0x09, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f,
0x72, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d,
0x52, 0x0b, 0x63, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x21, 0x0a,
0x0c, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20,
0x01, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74,
0x22, 0xf2, 0x01, 0x0a, 0x15, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72,
0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61,
0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x12, 0x21,
0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d,
0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,
0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73,
0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01,
0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72,
0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
0x75, 0x75, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x77, 0x61, 0x6b, 0x65, 0x5f, 0x75, 0x70, 0x5f,
0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x61, 0x6b, 0x65,
0x55, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6b, 0x75, 0x5f, 0x6e, 0x75,
0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6b, 0x75, 0x4e,
0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74,
0x61, 0x6c, 0x6f, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
0x72, 0x79, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f,
0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x68, 0x61, 0x72, 0x64,
0x77, 0x61, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@ -442,11 +561,12 @@ func file_resource_definitions_hardware_hardware_proto_rawDescGZIP() []byte {
return file_resource_definitions_hardware_hardware_proto_rawDescData
}
var file_resource_definitions_hardware_hardware_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_resource_definitions_hardware_hardware_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_resource_definitions_hardware_hardware_proto_goTypes = []interface{}{
(*MemoryModuleSpec)(nil), // 0: talos.resource.definitions.hardware.MemoryModuleSpec
(*ProcessorSpec)(nil), // 1: talos.resource.definitions.hardware.ProcessorSpec
(*SystemInformationSpec)(nil), // 2: talos.resource.definitions.hardware.SystemInformationSpec
(*PCIDeviceSpec)(nil), // 1: talos.resource.definitions.hardware.PCIDeviceSpec
(*ProcessorSpec)(nil), // 2: talos.resource.definitions.hardware.ProcessorSpec
(*SystemInformationSpec)(nil), // 3: talos.resource.definitions.hardware.SystemInformationSpec
}
var file_resource_definitions_hardware_hardware_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
@ -475,7 +595,7 @@ func file_resource_definitions_hardware_hardware_proto_init() {
}
}
file_resource_definitions_hardware_hardware_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProcessorSpec); i {
switch v := v.(*PCIDeviceSpec); i {
case 0:
return &v.state
case 1:
@ -487,6 +607,18 @@ func file_resource_definitions_hardware_hardware_proto_init() {
}
}
file_resource_definitions_hardware_hardware_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProcessorSpec); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_resource_definitions_hardware_hardware_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SystemInformationSpec); i {
case 0:
return &v.state
@ -505,7 +637,7 @@ func file_resource_definitions_hardware_hardware_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_resource_definitions_hardware_hardware_proto_rawDesc,
NumEnums: 0,
NumMessages: 3,
NumMessages: 4,
NumExtensions: 0,
NumServices: 0,
},

View File

@ -104,6 +104,95 @@ func (m *MemoryModuleSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *PCIDeviceSpec) MarshalVT() (dAtA []byte, err error) {
if m == nil {
return nil, nil
}
size := m.SizeVT()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBufferVT(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *PCIDeviceSpec) MarshalToVT(dAtA []byte) (int, error) {
size := m.SizeVT()
return m.MarshalToSizedBufferVT(dAtA[:size])
}
func (m *PCIDeviceSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
if m == nil {
return 0, nil
}
i := len(dAtA)
_ = i
var l int
_ = l
if m.unknownFields != nil {
i -= len(m.unknownFields)
copy(dAtA[i:], m.unknownFields)
}
if len(m.ProductId) > 0 {
i -= len(m.ProductId)
copy(dAtA[i:], m.ProductId)
i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ProductId)))
i--
dAtA[i] = 0x42
}
if len(m.VendorId) > 0 {
i -= len(m.VendorId)
copy(dAtA[i:], m.VendorId)
i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.VendorId)))
i--
dAtA[i] = 0x3a
}
if len(m.SubclassId) > 0 {
i -= len(m.SubclassId)
copy(dAtA[i:], m.SubclassId)
i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SubclassId)))
i--
dAtA[i] = 0x32
}
if len(m.ClassId) > 0 {
i -= len(m.ClassId)
copy(dAtA[i:], m.ClassId)
i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClassId)))
i--
dAtA[i] = 0x2a
}
if len(m.Product) > 0 {
i -= len(m.Product)
copy(dAtA[i:], m.Product)
i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Product)))
i--
dAtA[i] = 0x22
}
if len(m.Vendor) > 0 {
i -= len(m.Vendor)
copy(dAtA[i:], m.Vendor)
i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Vendor)))
i--
dAtA[i] = 0x1a
}
if len(m.Subclass) > 0 {
i -= len(m.Subclass)
copy(dAtA[i:], m.Subclass)
i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Subclass)))
i--
dAtA[i] = 0x12
}
if len(m.Class) > 0 {
i -= len(m.Class)
copy(dAtA[i:], m.Class)
i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Class)))
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func (m *ProcessorSpec) MarshalVT() (dAtA []byte, err error) {
if m == nil {
return nil, nil
@ -331,6 +420,48 @@ func (m *MemoryModuleSpec) SizeVT() (n int) {
return n
}
func (m *PCIDeviceSpec) SizeVT() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Class)
if l > 0 {
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
l = len(m.Subclass)
if l > 0 {
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
l = len(m.Vendor)
if l > 0 {
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
l = len(m.Product)
if l > 0 {
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
l = len(m.ClassId)
if l > 0 {
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
l = len(m.SubclassId)
if l > 0 {
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
l = len(m.VendorId)
if l > 0 {
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
l = len(m.ProductId)
if l > 0 {
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
n += len(m.unknownFields)
return n
}
func (m *ProcessorSpec) SizeVT() (n int) {
if m == nil {
return 0
@ -702,6 +833,313 @@ func (m *MemoryModuleSpec) UnmarshalVT(dAtA []byte) error {
}
return nil
}
func (m *PCIDeviceSpec) UnmarshalVT(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: PCIDeviceSpec: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: PCIDeviceSpec: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Class", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protohelpers.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protohelpers.ErrInvalidLength
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Class = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Subclass", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protohelpers.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protohelpers.ErrInvalidLength
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Subclass = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Vendor", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protohelpers.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protohelpers.ErrInvalidLength
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Vendor = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Product", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protohelpers.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protohelpers.ErrInvalidLength
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Product = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 5:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ClassId", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protohelpers.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protohelpers.ErrInvalidLength
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ClassId = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 6:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field SubclassId", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protohelpers.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protohelpers.ErrInvalidLength
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.SubclassId = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 7:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field VendorId", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protohelpers.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protohelpers.ErrInvalidLength
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.VendorId = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 8:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ProductId", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protohelpers.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protohelpers.ErrInvalidLength
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ProductId = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := protohelpers.Skip(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return protohelpers.ErrInvalidLength
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *ProcessorSpec) UnmarshalVT(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0

View File

@ -2,7 +2,7 @@
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Code generated by "deep-copy -type MemoryModuleSpec -type ProcessorSpec -type SystemInformationSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go ."; DO NOT EDIT.
// Code generated by "deep-copy -type MemoryModuleSpec -type PCIDeviceSpec -type ProcessorSpec -type SystemInformationSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go ."; DO NOT EDIT.
package hardware
@ -12,6 +12,12 @@ func (o MemoryModuleSpec) DeepCopy() MemoryModuleSpec {
return cp
}
// DeepCopy generates a deep copy of PCIDeviceSpec.
func (o PCIDeviceSpec) DeepCopy() PCIDeviceSpec {
var cp PCIDeviceSpec = o
return cp
}
// DeepCopy generates a deep copy of ProcessorSpec.
func (o ProcessorSpec) DeepCopy() ProcessorSpec {
var cp ProcessorSpec = o

View File

@ -8,7 +8,7 @@ import (
"github.com/cosi-project/runtime/pkg/resource"
)
//go:generate deep-copy -type MemoryModuleSpec -type ProcessorSpec -type SystemInformationSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go .
//go:generate deep-copy -type MemoryModuleSpec -type PCIDeviceSpec -type ProcessorSpec -type SystemInformationSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go .
// NamespaceName contains resources related to hardware as a whole.
const NamespaceName resource.Namespace = "hardware"

View File

@ -25,8 +25,10 @@ func TestRegisterResource(t *testing.T) {
resourceRegistry := registry.NewResourceRegistry(resources)
for _, resource := range []meta.ResourceWithRD{
&hardware.Processor{},
&hardware.MemoryModule{},
&hardware.PCIDevice{},
&hardware.Processor{},
&hardware.SystemInformation{},
} {
assert.NoError(t, resourceRegistry.Register(ctx, resource))
}

View File

@ -0,0 +1,85 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package hardware
import (
"github.com/cosi-project/runtime/pkg/resource"
"github.com/cosi-project/runtime/pkg/resource/meta"
"github.com/cosi-project/runtime/pkg/resource/protobuf"
"github.com/cosi-project/runtime/pkg/resource/typed"
"github.com/siderolabs/talos/pkg/machinery/proto"
)
// PCIDeviceType is type of PCIDevice resource.
const PCIDeviceType = resource.Type("PCIDevices.hardware.talos.dev")
// PCIDevice resource holds node PCIDevice information.
type PCIDevice = typed.Resource[PCIDeviceSpec, PCIDeviceExtension]
// PCIDeviceSpec represents a single processor.
//
//gotagsrewrite:gen
type PCIDeviceSpec struct {
Class string `yaml:"class,omitempty" protobuf:"1"`
Subclass string `yaml:"subclass,omitempty" protobuf:"2"`
Vendor string `yaml:"vendor,omitempty" protobuf:"3"`
Product string `yaml:"product,omitempty" protobuf:"4"`
ClassID string `yaml:"class_id" protobuf:"5"`
SubclassID string `yaml:"subclass_id" protobuf:"6"`
VendorID string `yaml:"vendor_id" protobuf:"7"`
ProductID string `yaml:"product_id" protobuf:"8"`
}
// NewPCIDeviceInfo initializes a PCIDeviceInfo resource.
func NewPCIDeviceInfo(id string) *PCIDevice {
return typed.NewResource[PCIDeviceSpec, PCIDeviceExtension](
resource.NewMetadata(NamespaceName, PCIDeviceType, id, resource.VersionUndefined),
PCIDeviceSpec{},
)
}
// PCIDeviceExtension provides auxiliary methods for PCIDevice info.
type PCIDeviceExtension struct{}
// ResourceDefinition implements [typed.Extension] interface.
func (PCIDeviceExtension) ResourceDefinition() meta.ResourceDefinitionSpec {
return meta.ResourceDefinitionSpec{
Type: PCIDeviceType,
Aliases: []resource.Type{
"cpus",
"cpu",
},
DefaultNamespace: NamespaceName,
PrintColumns: []meta.PrintColumn{
{
Name: "Class",
JSONPath: `{.class}`,
},
{
Name: "Subclass",
JSONPath: `{.subclass}`,
},
{
Name: "Vendor",
JSONPath: `{.vendor}`,
},
{
Name: "Product",
JSONPath: `{.product}`,
},
},
}
}
func init() {
proto.RegisterDefaultTypes()
err := protobuf.RegisterDynamic[PCIDeviceSpec](PCIDeviceType, &PCIDevice{})
if err != nil {
panic(err)
}
}

View File

@ -95,6 +95,7 @@ description: Talos gRPC API reference.
- [resource/definitions/hardware/hardware.proto](#resource/definitions/hardware/hardware.proto)
- [MemoryModuleSpec](#talos.resource.definitions.hardware.MemoryModuleSpec)
- [PCIDeviceSpec](#talos.resource.definitions.hardware.PCIDeviceSpec)
- [ProcessorSpec](#talos.resource.definitions.hardware.ProcessorSpec)
- [SystemInformationSpec](#talos.resource.definitions.hardware.SystemInformationSpec)
@ -1854,6 +1855,28 @@ MemoryModuleSpec represents a single Memory.
<a name="talos.resource.definitions.hardware.PCIDeviceSpec"></a>
### PCIDeviceSpec
PCIDeviceSpec represents a single processor.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| class | [string](#string) | | |
| subclass | [string](#string) | | |
| vendor | [string](#string) | | |
| product | [string](#string) | | |
| class_id | [string](#string) | | |
| subclass_id | [string](#string) | | |
| vendor_id | [string](#string) | | |
| product_id | [string](#string) | | |
<a name="talos.resource.definitions.hardware.ProcessorSpec"></a>
### ProcessorSpec