diff --git a/cmd/metal-api/internal/datastore/machine_integration_test.go b/cmd/metal-api/internal/datastore/machine_integration_test.go index 0fe9d6cfb..4c49f4174 100644 --- a/cmd/metal-api/internal/datastore/machine_integration_test.go +++ b/cmd/metal-api/internal/datastore/machine_integration_test.go @@ -82,6 +82,12 @@ func (_ *machineTestable) defaultBody(m *metal.Machine) *metal.Machine { if m.Hardware.Disks == nil { m.Hardware.Disks = []metal.BlockDevice{} } + if m.Hardware.MetalCPUs == nil { + m.Hardware.MetalCPUs = []metal.MetalCPU{} + } + if m.Hardware.MetalGPUs == nil { + m.Hardware.MetalGPUs = []metal.MetalGPU{} + } if m.Tags == nil { m.Tags = []string{} } @@ -935,7 +941,7 @@ func TestRethinkStore_UpdateMachine(t *testing.T) { }, want: &metal.Machine{ Base: metal.Base{ID: "1"}, - Hardware: metal.MachineHardware{Nics: metal.Nics{}, Disks: []metal.BlockDevice{}}, + Hardware: metal.MachineHardware{Nics: metal.Nics{}, Disks: []metal.BlockDevice{}, MetalCPUs: []metal.MetalCPU{}, MetalGPUs: []metal.MetalGPU{}}, Tags: []string{"a=b"}, }, }, diff --git a/cmd/metal-api/internal/grpc/boot-service.go b/cmd/metal-api/internal/grpc/boot-service.go index d6c9dd644..508eaceaa 100644 --- a/cmd/metal-api/internal/grpc/boot-service.go +++ b/cmd/metal-api/internal/grpc/boot-service.go @@ -124,11 +124,31 @@ func (b *BootService) Register(ctx context.Context, req *v1.BootServiceRegisterR }) } + cpus := []metal.MetalCPU{} + for _, cpu := range req.Hardware.Cpus { + cpus = append(cpus, metal.MetalCPU{ + Vendor: cpu.Vendor, + Model: cpu.Model, + Cores: cpu.Cores, + Threads: cpu.Threads, + }) + } + + gpus := []metal.MetalGPU{} + for _, gpu := range req.Hardware.Gpus { + gpus = append(gpus, metal.MetalGPU{ + Vendor: gpu.Vendor, + Model: gpu.Model, + }) + } + machineHardware := metal.MachineHardware{ - Memory: req.Hardware.Memory, - CPUCores: int(req.Hardware.CpuCores), - Disks: disks, - Nics: nics, + Memory: req.Hardware.Memory, + CPUCores: int(req.Hardware.CpuCores), + Disks: disks, + Nics: nics, + MetalCPUs: cpus, + MetalGPUs: gpus, } size, _, err := b.ds.FromHardware(machineHardware) diff --git a/cmd/metal-api/internal/metal/machine.go b/cmd/metal-api/internal/metal/machine.go index 654f5e266..28276ac6b 100644 --- a/cmd/metal-api/internal/metal/machine.go +++ b/cmd/metal-api/internal/metal/machine.go @@ -457,10 +457,24 @@ func (n NetworkType) String() string { // MachineHardware stores the data which is collected by our system on the hardware when it registers itself. type MachineHardware struct { - Memory uint64 `rethinkdb:"memory" json:"memory"` - CPUCores int `rethinkdb:"cpu_cores" json:"cpu_cores"` - Nics Nics `rethinkdb:"network_interfaces" json:"network_interfaces"` - Disks []BlockDevice `rethinkdb:"block_devices" json:"block_devices"` + Memory uint64 `rethinkdb:"memory" json:"memory"` + CPUCores int `rethinkdb:"cpu_cores" json:"cpu_cores"` + Nics Nics `rethinkdb:"network_interfaces" json:"network_interfaces"` + Disks []BlockDevice `rethinkdb:"block_devices" json:"block_devices"` + MetalCPUs []MetalCPU `rethinkdb:"cpus" json:"cpus"` + MetalGPUs []MetalGPU `rethinkdb:"gpus" json:"gpus"` +} + +type MetalCPU struct { + Vendor string `rethinkdb:"vendor" json:"vendor"` + Model string `rethinkdb:"model" json:"model"` + Cores uint32 `rethinkdb:"cores" json:"cores"` + Threads uint32 `rethinkdb:"threads" json:"threads"` +} + +type MetalGPU struct { + Vendor string `rethinkdb:"vendor" json:"vendor"` + Model string `rethinkdb:"model" json:"model"` } // MachineLiveliness indicates the liveliness of a machine @@ -484,9 +498,22 @@ func (hw *MachineHardware) DiskCapacity() uint64 { return c } +func (hw *MachineHardware) GPUModels() map[string]uint64 { + models := make(map[string]uint64) + for _, gpu := range hw.MetalGPUs { + _, ok := models[gpu.Model] + if !ok { + models[gpu.Model] = 1 + } else { + models[gpu.Model]++ + } + } + return models +} + // ReadableSpec returns a human readable string for the hardware. func (hw *MachineHardware) ReadableSpec() string { - return fmt.Sprintf("Cores: %d, Memory: %s, Storage: %s", hw.CPUCores, humanize.Bytes(hw.Memory), humanize.Bytes(hw.DiskCapacity())) + return fmt.Sprintf("Cores: %d, Memory: %s, Storage: %s GPUs:%s", hw.CPUCores, humanize.Bytes(hw.Memory), humanize.Bytes(hw.DiskCapacity()), hw.MetalGPUs) } // BlockDevice information. @@ -621,10 +648,14 @@ func NewIPMISuperUser(log *slog.Logger, path string) MachineIPMISuperUser { password := "" if raw, err := os.ReadFile(path); err == nil { - log.Info("ipmi superuser password found, feature is enabled") password = strings.TrimSpace(string(raw)) + if password != "" { + log.Info("ipmi superuser password found, feature is enabled") + } else { + log.Warn("ipmi superuser password file found, but password is empty, feature is disabled") + } } else { - log.Info("ipmi superuser password could not be read, feature is disabled", "error", err) + log.Warn("ipmi superuser password could not be read, feature is disabled", "error", err) } return MachineIPMISuperUser{ diff --git a/cmd/metal-api/internal/metal/size.go b/cmd/metal-api/internal/metal/size.go index 704c045c0..430ea8546 100644 --- a/cmd/metal-api/internal/metal/size.go +++ b/cmd/metal-api/internal/metal/size.go @@ -2,9 +2,11 @@ package metal import ( "fmt" + "path/filepath" "slices" mdmv1 "github.com/metal-stack/masterdata-api/api/v1" + "github.com/samber/lo" ) // A Size represents a supported machine size. @@ -33,14 +35,16 @@ const ( CoreConstraint ConstraintType = "cores" MemoryConstraint ConstraintType = "memory" StorageConstraint ConstraintType = "storage" + GPUConstraint ConstraintType = "gpu" ) // A Constraint describes the hardware constraints for a given size. At the moment we only // consider the cpu cores and the memory. type Constraint struct { - Type ConstraintType `rethinkdb:"type" json:"type"` - Min uint64 `rethinkdb:"min" json:"min"` - Max uint64 `rethinkdb:"max" json:"max"` + Type ConstraintType `rethinkdb:"type" json:"type"` + Min uint64 `rethinkdb:"min" json:"min"` + Max uint64 `rethinkdb:"max" json:"max"` + Identifier string `rethinkdb:"identifier" json:"identifier" description:"glob of the identifier of this type"` } // Sizes is a list of sizes. @@ -84,6 +88,20 @@ func (c *Constraint) Matches(hw MachineHardware) (ConstraintMatchingLog, bool) { case StorageConstraint: res = hw.DiskCapacity() >= c.Min && hw.DiskCapacity() <= c.Max cml.Log = fmt.Sprintf(logentryFmt, hw.DiskCapacity(), hw.DiskCapacity()) + case GPUConstraint: + for model, count := range hw.GPUModels() { + idMatches, err := filepath.Match(c.Identifier, model) + if err != nil { + cml.Log = fmt.Sprintf("cannot match gpu model:%v", err) + return cml, false + } + res = count >= c.Min && count <= c.Max && idMatches + if res { + break + } + } + + cml.Log = fmt.Sprintf("existing gpus:%#v required gpus:%s count %d-%d", hw.MetalGPUs, c.Identifier, c.Min, c.Max) } cml.Match = res return cml, res @@ -121,25 +139,71 @@ nextsize: } func (s *Size) overlaps(so *Size) bool { - if len(so.Constraints) == 0 { + if len(lo.FromPtr(so).Constraints) == 0 { return false } - for _, c := range s.Constraints { - for _, co := range so.Constraints { - if c.Type == co.Type && ((c.Min < co.Min && c.Max < co.Min) || (c.Min > co.Min && c.Min > co.Max)) { - return false + srcTypes := lo.GroupBy(s.Constraints, func(item Constraint) ConstraintType { + return item.Type + }) + destTypes := lo.GroupBy(so.Constraints, func(item Constraint) ConstraintType { + return item.Type + }) + for t, srcConstraints := range srcTypes { + constraints, ok := destTypes[t] + if !ok { + return false + } + for _, sc := range srcConstraints { + for _, c := range constraints { + if !c.overlaps(sc) { + return false + } } } } + + return true +} + +// overlaps is proven correct, requires that constraint are validated before that max is not smaller than min +func (c *Constraint) overlaps(other Constraint) bool { + if c.Type != other.Type { + return false + } + + if c.Identifier != other.Identifier { + return false + } + + if c.Min > other.Max { + return false + } + + if c.Max < other.Min { + return false + } return true } // Validate a size, returns error if a invalid size is passed func (s *Size) Validate(partitions PartitionMap, projects map[string]*mdmv1.Project) error { + constraintTypes := map[ConstraintType]bool{} for _, c := range s.Constraints { if c.Max < c.Min { return fmt.Errorf("size:%q type:%q max:%d is smaller than min:%d", s.ID, c.Type, c.Max, c.Min) } + + _, ok := constraintTypes[c.Type] + if ok { + return fmt.Errorf("size:%q type:%q min:%d max:%d has duplicate constraint type", s.ID, c.Type, c.Min, c.Max) + } + + // Ensure GPU Constraints always have identifier specified + if c.Type == GPUConstraint && c.Identifier == "" { + return fmt.Errorf("size:%q type:%q min:%d max:%d is a gpu size but has no identifier specified", s.ID, c.Type, c.Min, c.Max) + } + + constraintTypes[c.Type] = true } if err := s.Reservations.Validate(partitions, projects); err != nil { @@ -151,9 +215,12 @@ func (s *Size) Validate(partitions PartitionMap, projects map[string]*mdmv1.Proj // Overlaps returns nil if Size does not overlap with any other size, otherwise returns overlapping Size func (s *Size) Overlaps(ss *Sizes) *Size { - for i := range *ss { - so := (*ss)[i] - if s.Name != so.Name && s.overlaps(&so) { + for _, so := range *ss { + so := so + if s.ID == so.ID { + continue + } + if s.overlaps(&so) { return &so } } diff --git a/cmd/metal-api/internal/metal/size_test.go b/cmd/metal-api/internal/metal/size_test.go index 113799420..f5b896fa9 100644 --- a/cmd/metal-api/internal/metal/size_test.go +++ b/cmd/metal-api/internal/metal/size_test.go @@ -15,7 +15,7 @@ import ( var ( microSize = Size{ Base: Base{ - Name: "micro", + ID: "micro", }, Constraints: []Constraint{ { @@ -37,7 +37,7 @@ var ( } microOverlappingSize = Size{ Base: Base{ - Name: "microOverlapping", + ID: "microOverlapping", }, Constraints: []Constraint{ { @@ -59,7 +59,7 @@ var ( } tinySize = Size{ Base: Base{ - Name: "tiny", + ID: "tiny", }, Constraints: []Constraint{ { @@ -79,6 +79,90 @@ var ( }, }, } + tinyGPUSize = Size{ + Base: Base{ + ID: "tiny gpu", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 1, + Max: 1, + }, + { + Type: MemoryConstraint, + Min: 1025, + Max: 1077838336, + }, + { + Type: StorageConstraint, + Min: 1024, + Max: 2048, + }, + { + Type: GPUConstraint, + Max: 1, + Min: 1, + Identifier: "AD102GL*", + }, + }, + } + miniGPUSize = Size{ + Base: Base{ + ID: "mini gpu", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 1, + Max: 1, + }, + { + Type: MemoryConstraint, + Min: 1025, + Max: 1077838336, + }, + { + Type: StorageConstraint, + Min: 1024, + Max: 2048, + }, + { + Type: GPUConstraint, + Max: 2, + Min: 2, + Identifier: "AD102GL*", + }, + }, + } + maxGPUSize = Size{ + Base: Base{ + ID: "max gpu", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 1, + Max: 1, + }, + { + Type: MemoryConstraint, + Min: 1025, + Max: 1077838336, + }, + { + Type: StorageConstraint, + Min: 1024, + Max: 2048, + }, + { + Type: GPUConstraint, + Max: 4, + Min: 4, + Identifier: "H100*", + }, + }, + } // Sizes sz1 = Size{ Base: Base{ @@ -226,6 +310,106 @@ func TestSizes_FromHardware(t *testing.T) { want: &sz999, wantErr: false, }, + { + name: "real gpu data", + sz: Sizes{ + sz1, + sz999, + tinyGPUSize, + }, + args: args{ + hardware: MachineHardware{ + CPUCores: 1, + Memory: 1026, + Disks: []BlockDevice{ + { + Size: 1026, + }, + }, + MetalGPUs: []MetalGPU{ + { + Vendor: "NVIDIA Corporation", + Model: "AD102GL [RTX 6000 Ada Generation]", + }, + }, + }, + }, + want: &tinyGPUSize, + wantErr: false, + }, + { + name: "real larger gpu data", + sz: Sizes{ + sz1, + sz999, + tinyGPUSize, + miniGPUSize, + }, + args: args{ + hardware: MachineHardware{ + CPUCores: 1, + Memory: 1026, + Disks: []BlockDevice{ + { + Size: 1026, + }, + }, + MetalGPUs: []MetalGPU{ + { + Vendor: "NVIDIA Corporation", + Model: "AD102GL [RTX 6000 Ada Generation]", + }, + { + Vendor: "NVIDIA Corporation", + Model: "AD102GL [RTX 6000 Ada Generation]", + }, + }, + }, + }, + want: &miniGPUSize, + wantErr: false, + }, + { + name: "real max gpu data", + sz: Sizes{ + sz1, + sz999, + tinyGPUSize, + miniGPUSize, + maxGPUSize, + }, + args: args{ + hardware: MachineHardware{ + CPUCores: 1, + Memory: 1026, + Disks: []BlockDevice{ + { + Size: 1026, + }, + }, + MetalGPUs: []MetalGPU{ + { + Vendor: "NVIDIA Corporation", + Model: "H100", + }, + { + Vendor: "NVIDIA Corporation", + Model: "H100", + }, + { + Vendor: "NVIDIA Corporation", + Model: "H100", + }, + { + Vendor: "NVIDIA Corporation", + Model: "H100", + }, + }, + }, + }, + want: &maxGPUSize, + wantErr: false, + }, } for i := range tests { @@ -273,22 +457,17 @@ func TestSizes_ByID(t *testing.T) { } func TestSizes_Overlaps(t *testing.T) { - type args struct { - sizes Sizes - } - tests := []struct { - name string - sz Size - args args - want *Size + name string + sz Size + sizes Sizes + want *Size }{ - // Test Data Array: { name: "non-overlapping size", sz: Size{ Base: Base{ - Name: "micro", + ID: "micro", }, Constraints: []Constraint{ { @@ -308,50 +487,27 @@ func TestSizes_Overlaps(t *testing.T) { }, }, }, - args: args{ - sizes: Sizes{ - Size{ - Base: Base{ - Name: "tiny", - }, - Constraints: []Constraint{ - { - Type: CoreConstraint, - Min: 1, - Max: 1, - }, - { - Type: MemoryConstraint, - Min: 1025, - Max: 1077838336, - }, - { - Type: StorageConstraint, - Min: 1024, - Max: 2048, - }, - }, - }, - Size{ - Base: Base{ - Name: "large", - }, - Constraints: []Constraint{ - { - Type: CoreConstraint, - Min: 8, - Max: 16, - }, - { - Type: MemoryConstraint, - Min: 1024, - Max: 1077838336, - }, - { - Type: StorageConstraint, - Min: 1024, - Max: 2048, - }, + sizes: Sizes{ + tinySize, + Size{ + Base: Base{ + ID: "large", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 8, + Max: 16, + }, + { + Type: MemoryConstraint, + Min: 1024, + Max: 1077838336, + }, + { + Type: StorageConstraint, + Min: 1024, + Max: 2048, }, }, }, @@ -362,7 +518,7 @@ func TestSizes_Overlaps(t *testing.T) { name: "overlapping size", sz: Size{ Base: Base{ - Name: "microOverlapping", + ID: "microOverlapping", }, Constraints: []Constraint{ { @@ -382,72 +538,70 @@ func TestSizes_Overlaps(t *testing.T) { }, }, }, - args: args{ - sizes: Sizes{ - Size{ - Base: Base{ - Name: "micro", - }, - Constraints: []Constraint{ - { - Type: CoreConstraint, - Min: 1, - Max: 1, - }, - { - Type: MemoryConstraint, - Min: 1024, - Max: 1024, - }, - { - Type: StorageConstraint, - Min: 0, - Max: 1024, - }, - }, - }, - Size{ - Base: Base{ - Name: "tiny", - }, - Constraints: []Constraint{ - { - Type: CoreConstraint, - Min: 1, - Max: 1, - }, - { - Type: MemoryConstraint, - Min: 1025, - Max: 1077838336, - }, - { - Type: StorageConstraint, - Min: 1024, - Max: 2048, - }, - }, - }, - Size{ - Base: Base{ - Name: "large", - }, - Constraints: []Constraint{ - { - Type: CoreConstraint, - Min: 8, - Max: 16, - }, - { - Type: MemoryConstraint, - Min: 1024, - Max: 1077838336, - }, - { - Type: StorageConstraint, - Min: 1024, - Max: 2048, - }, + sizes: Sizes{ + { + Base: Base{ + ID: "micro", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 1, + Max: 1, + }, + { + Type: MemoryConstraint, + Min: 1024, + Max: 1024, + }, + { + Type: StorageConstraint, + Min: 0, + Max: 1024, + }, + }, + }, + { + Base: Base{ + ID: "tiny", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 1, + Max: 1, + }, + { + Type: MemoryConstraint, + Min: 1025, + Max: 1077838336, + }, + { + Type: StorageConstraint, + Min: 1024, + Max: 2048, + }, + }, + }, + Size{ + Base: Base{ + ID: "large", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 8, + Max: 16, + }, + { + Type: MemoryConstraint, + Min: 1024, + Max: 1077838336, + }, + { + Type: StorageConstraint, + Min: 1024, + Max: 2048, }, }, }, @@ -458,7 +612,7 @@ func TestSizes_Overlaps(t *testing.T) { name: "add incomplete size", sz: Size{ Base: Base{ - Name: "microIncomplete", + ID: "microIncomplete", }, Constraints: []Constraint{ { @@ -468,78 +622,107 @@ func TestSizes_Overlaps(t *testing.T) { }, }, }, - args: args{ - sizes: Sizes{ - Size{ - Base: Base{ - Name: "micro", - }, - Constraints: []Constraint{ - { - Type: CoreConstraint, - Min: 1, - Max: 1, - }, - { - Type: MemoryConstraint, - Min: 1024, - Max: 1024, - }, - { - Type: StorageConstraint, - Min: 0, - Max: 1024, - }, - }, - }, - Size{ - Base: Base{ - Name: "tiny", - }, - Constraints: []Constraint{ - { - Type: CoreConstraint, - Min: 1, - Max: 1, - }, - { - Type: MemoryConstraint, - Min: 1025, - Max: 1077838336, - }, - { - Type: StorageConstraint, - Min: 1024, - Max: 2048, - }, - }, - }, - Size{ - Base: Base{ - Name: "large", - }, - Constraints: []Constraint{ - { - Type: CoreConstraint, - Min: 8, - Max: 16, - }, - { - Type: MemoryConstraint, - Min: 1024, - Max: 1077838336, - }, - { - Type: StorageConstraint, - Min: 1024, - Max: 2048, - }, + sizes: Sizes{ + Size{ + Base: Base{ + ID: "micro", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 1, + Max: 1, + }, + { + Type: MemoryConstraint, + Min: 1024, + Max: 1024, + }, + { + Type: StorageConstraint, + Min: 0, + Max: 1024, + }, + }, + }, + Size{ + Base: Base{ + ID: "tiny", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 1, + Max: 1, + }, + { + Type: MemoryConstraint, + Min: 1025, + Max: 1077838336, + }, + { + Type: StorageConstraint, + Min: 1024, + Max: 2048, + }, + }, + }, + Size{ + Base: Base{ + ID: "large", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 8, + Max: 16, + }, + { + Type: MemoryConstraint, + Min: 1024, + Max: 1077838336, + }, + { + Type: StorageConstraint, + Min: 1024, + Max: 2048, }, }, }, }, want: µSize, }, + + { + name: "two different sizes", + sz: Size{ + Base: Base{ + ID: "two different", + }, + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 1, + Max: 1, + }, + }, + }, + sizes: Sizes{ + Size{ + Base: Base{ + ID: "micro", + }, + Constraints: []Constraint{ + { + Type: MemoryConstraint, + Min: 1024, + Max: 1024, + }, + }, + }, + }, + want: nil, + }, } for i := range tests { @@ -547,9 +730,10 @@ func TestSizes_Overlaps(t *testing.T) { t.Run(tt.name, func(t *testing.T) { err := tt.sz.Validate(nil, nil) require.NoError(t, err) - got := tt.sz.Overlaps(&tt.args.sizes) - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("Sizes.Overlaps() = %v, want %v", got, tt.want) + got := tt.sz.Overlaps(&tt.sizes) + + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("(-want +got):\n%s", diff) } }) } @@ -609,6 +793,45 @@ func TestSize_Validate(t *testing.T) { }, wantErrMessage: nil, }, + { + name: "two constraints with same type", + size: Size{ + Base: Base{ + ID: "gpu-size", + }, + Constraints: []Constraint{ + { + Type: GPUConstraint, + Min: 1, + Max: 1, + Identifier: "A100*", + }, + { + Type: GPUConstraint, + Min: 2, + Max: 2, + Identifier: "H100*", + }, + }, + }, + wantErrMessage: pointer.Pointer("size:\"gpu-size\" type:\"gpu\" min:2 max:2 has duplicate constraint type"), + }, + { + name: "gpu size without identifier", + size: Size{ + Base: Base{ + ID: "invalid-gpu-size", + }, + Constraints: []Constraint{ + { + Type: GPUConstraint, + Min: 2, + Max: 8, + }, + }, + }, + wantErrMessage: pointer.Pointer("size:\"invalid-gpu-size\" type:\"gpu\" min:2 max:8 is a gpu size but has no identifier specified"), + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -891,3 +1114,250 @@ func TestReservations_Validate(t *testing.T) { }) } } + +func TestConstraint_overlaps(t *testing.T) { + tests := []struct { + name string + this Constraint + other Constraint + want bool + }{ + { + name: "no overlap, different types", + this: Constraint{ + Type: CoreConstraint, + }, + other: Constraint{ + Type: GPUConstraint, + }, + want: false, + }, + { + name: "no overlap, different identifiers", + this: Constraint{ + Type: CoreConstraint, + Identifier: "b", + }, + other: Constraint{ + Type: CoreConstraint, + Identifier: "a", + }, + want: false, + }, + + { + name: "no overlap, different range", + this: Constraint{ + Type: CoreConstraint, + Identifier: "a", + Min: 0, + Max: 2, + }, + other: Constraint{ + Type: CoreConstraint, + Identifier: "a", + Min: 3, + Max: 4, + }, + want: false, + }, + + { + name: "partial overlap, over range", + this: Constraint{ + Type: CoreConstraint, + Identifier: "a", + Min: 0, + Max: 4, + }, + other: Constraint{ + Type: CoreConstraint, + Identifier: "a", + Min: 3, + Max: 5, + }, + want: true, + }, + + { + name: "partial overlap, under range", + this: Constraint{ + Type: CoreConstraint, + Identifier: "a", + Min: 2, + Max: 4, + }, + other: Constraint{ + Type: CoreConstraint, + Identifier: "a", + Min: 1, + Max: 3, + }, + want: true, + }, + + { + name: "partial overlap, in range", + this: Constraint{ + Type: CoreConstraint, + Identifier: "a", + Min: 1, + Max: 5, + }, + other: Constraint{ + Type: CoreConstraint, + Identifier: "a", + Min: 2, + Max: 3, + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + if got := tt.this.overlaps(tt.other); got != tt.want { + t.Errorf("Constraint.overlaps() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestSize_overlaps(t *testing.T) { + tests := []struct { + name string + this *Size + other *Size + want bool + }{ + { + name: "no overlap, different types", + this: &Size{ + Constraints: []Constraint{ + {Type: MemoryConstraint}, + }, + }, + other: &Size{ + Constraints: []Constraint{ + {Type: CoreConstraint}, + }, + }, + want: false, + }, + + { + name: "no overlap, different identifiers", + this: &Size{ + Constraints: []Constraint{ + {Type: MemoryConstraint, Identifier: "a"}, + }, + }, + other: &Size{ + Constraints: []Constraint{ + {Type: MemoryConstraint, Identifier: "b"}, + }, + }, + want: false, + }, + + { + name: "no overlap, different range", + this: &Size{ + Constraints: []Constraint{ + {Type: MemoryConstraint, Identifier: "a", Min: 0, Max: 4}, + }, + }, + other: &Size{ + Constraints: []Constraint{ + {Type: MemoryConstraint, Identifier: "a", Min: 5, Max: 8}, + }, + }, + want: false, + }, + + { + name: "no overlap, different gpus", + this: &Size{ + Constraints: []Constraint{ + {Type: GPUConstraint, Identifier: "a", Min: 1, Max: 1}, + }, + }, + other: &Size{ + Constraints: []Constraint{ + {Type: GPUConstraint, Identifier: "a", Min: 1, Max: 1}, + {Type: GPUConstraint, Identifier: "b", Min: 2, Max: 2}, + }, + }, + want: false, + }, + + { + name: "overlapping size", + this: &Size{ + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 1, + Max: 1, + }, + { + Type: MemoryConstraint, + Min: 1024, + Max: 1024, + }, + { + Type: StorageConstraint, + Min: 0, + Max: 2048, + }, + }, + }, + other: &Size{ + Constraints: []Constraint{ + { + Type: CoreConstraint, + Min: 1, + Max: 1, + }, + { + Type: MemoryConstraint, + Min: 1024, + Max: 1024, + }, + { + Type: StorageConstraint, + Min: 0, + Max: 1024, + }, + }, + }, + want: true, + }, + + { + name: "overlap, all the same", + this: &Size{ + Constraints: []Constraint{ + {Type: MemoryConstraint, Identifier: "a", Min: 5, Max: 8}, + {Type: GPUConstraint, Identifier: "a", Min: 1, Max: 1}, + {Type: CoreConstraint, Min: 4, Max: 4}, + }, + }, + other: &Size{ + Constraints: []Constraint{ + {Type: CoreConstraint, Min: 4, Max: 4}, + {Type: GPUConstraint, Identifier: "a", Min: 1, Max: 1}, + {Type: MemoryConstraint, Identifier: "a", Min: 5, Max: 8}, + }, + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.this.overlaps(tt.other); !reflect.DeepEqual(got, tt.want) { + t.Errorf("Size.Overlaps() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/cmd/metal-api/internal/service/size-service.go b/cmd/metal-api/internal/service/size-service.go index 4bada642f..7d22a09b8 100644 --- a/cmd/metal-api/internal/service/size-service.go +++ b/cmd/metal-api/internal/service/size-service.go @@ -159,7 +159,28 @@ func (r *sizeResource) suggestSize(request *restful.Request, response *restful.R return } - r.send(request, response, http.StatusOK, []v1.SizeConstraint{ + var ( + gpus = make(map[string]uint64) + gpuconstraints []v1.SizeConstraint + ) + + for _, gpu := range m.Hardware.MetalGPUs { + _, ok := gpus[gpu.Model] + if !ok { + gpus[gpu.Model] = 1 + } else { + gpus[gpu.Model]++ + } + } + for model, count := range gpus { + gpuconstraints = append(gpuconstraints, v1.SizeConstraint{ + Type: metal.GPUConstraint, + Min: count, + Max: count, + Identifier: model, + }) + } + constraints := []v1.SizeConstraint{ { Type: metal.CoreConstraint, Min: uint64(m.Hardware.CPUCores), @@ -175,8 +196,13 @@ func (r *sizeResource) suggestSize(request *restful.Request, response *restful.R Min: m.Hardware.DiskCapacity(), Max: m.Hardware.DiskCapacity(), }, - }) + } + + if len(gpuconstraints) > 0 { + constraints = append(constraints, gpuconstraints...) + } + r.send(request, response, http.StatusOK, constraints) } func (r *sizeResource) listSizes(request *restful.Request, response *restful.Response) { @@ -227,9 +253,10 @@ func (r *sizeResource) createSize(request *restful.Request, response *restful.Re var constraints []metal.Constraint for _, c := range requestPayload.SizeConstraints { constraint := metal.Constraint{ - Type: c.Type, - Min: c.Min, - Max: c.Max, + Type: c.Type, + Min: c.Min, + Max: c.Max, + Identifier: c.Identifier, } constraints = append(constraints, constraint) } @@ -340,9 +367,10 @@ func (r *sizeResource) updateSize(request *restful.Request, response *restful.Re sizeConstraints := *requestPayload.SizeConstraints for i := range sizeConstraints { constraint := metal.Constraint{ - Type: sizeConstraints[i].Type, - Min: sizeConstraints[i].Min, - Max: sizeConstraints[i].Max, + Type: sizeConstraints[i].Type, + Min: sizeConstraints[i].Min, + Max: sizeConstraints[i].Max, + Identifier: sizeConstraints[i].Identifier, } constraints = append(constraints, constraint) } diff --git a/cmd/metal-api/internal/service/v1/machine.go b/cmd/metal-api/internal/service/v1/machine.go index 559471756..61f3eecca 100644 --- a/cmd/metal-api/internal/service/v1/machine.go +++ b/cmd/metal-api/internal/service/v1/machine.go @@ -83,15 +83,28 @@ type MachineNetwork struct { } type MachineHardwareBase struct { - Memory uint64 `json:"memory" description:"the total memory of the machine"` - CPUCores int `json:"cpu_cores" description:"the number of cpu cores"` - Disks []MachineBlockDevice `json:"disks" description:"the list of block devices of this machine"` + Memory uint64 `json:"memory" description:"the total memory of the machine"` + CPUCores int `json:"cpu_cores" description:"the number of cpu cores"` + Disks []MachineBlockDevice `json:"disks" description:"the list of block devices of this machine"` + MetalCPUs []MetalCPU `json:"cpus,omitempty" optional:"true" description:"the cpu details"` + MetalGPUs []MetalGPU `json:"gpus,omitempty" optional:"true" description:"the gpu details"` } type MachineHardware struct { MachineHardwareBase Nics MachineNics `json:"nics" description:"the list of network interfaces of this machine"` } +type MetalCPU struct { + Vendor string `json:"vendor" description:"the cpu vendor"` + Model string `json:"model" description:"the cpu model"` + Cores uint32 `json:"cores" description:"the cpu cores"` + Threads uint32 `json:"threads" description:"the cpu threads"` +} + +type MetalGPU struct { + Vendor string `json:"vendor" description:"the gpu vendor"` + Model string `json:"model" description:"the gpu model"` +} type MachineState struct { Value string `json:"value" enum:"RESERVED|LOCKED|" description:"the state of this machine. empty means available for all"` @@ -484,11 +497,31 @@ func NewMachineResponse(m *metal.Machine, s *metal.Size, p *metal.Partition, i * disks = append(disks, disk) } + cpus := []MetalCPU{} + for _, cpu := range m.Hardware.MetalCPUs { + cpus = append(cpus, MetalCPU{ + Vendor: cpu.Vendor, + Model: cpu.Model, + Cores: cpu.Cores, + Threads: cpu.Threads, + }) + } + + gpus := []MetalGPU{} + for _, gpu := range m.Hardware.MetalGPUs { + gpus = append(gpus, MetalGPU{ + Vendor: gpu.Vendor, + Model: gpu.Model, + }) + } + hardware = MachineHardware{ MachineHardwareBase: MachineHardwareBase{ - Memory: m.Hardware.Memory, - CPUCores: m.Hardware.CPUCores, - Disks: disks, + Memory: m.Hardware.Memory, + CPUCores: m.Hardware.CPUCores, + Disks: disks, + MetalCPUs: cpus, + MetalGPUs: gpus, }, Nics: nics, } diff --git a/cmd/metal-api/internal/service/v1/size.go b/cmd/metal-api/internal/service/v1/size.go index 845297f59..35d60ba7d 100644 --- a/cmd/metal-api/internal/service/v1/size.go +++ b/cmd/metal-api/internal/service/v1/size.go @@ -5,9 +5,10 @@ import ( ) type SizeConstraint struct { - Type metal.ConstraintType `json:"type" modelDescription:"a machine matches to a size in order to make them easier to categorize" enum:"cores|memory|storage" description:"the type of the constraint"` - Min uint64 `json:"min" description:"the minimum value of the constraint"` - Max uint64 `json:"max" description:"the maximum value of the constraint"` + Type metal.ConstraintType `json:"type" modelDescription:"a machine matches to a size in order to make them easier to categorize" enum:"cores|memory|storage|gpu" description:"the type of the constraint"` + Min uint64 `json:"min,omitempty" description:"the minimum value of the constraint"` + Max uint64 `json:"max,omitempty" description:"the maximum value of the constraint"` + Identifier string `json:"identifier,omitempty" description:"glob pattern which matches to the given type, for example gpu pci id"` } type SizeReservation struct { @@ -97,9 +98,10 @@ func NewSizeResponse(s *metal.Size) *SizeResponse { constraints := []SizeConstraint{} for _, c := range s.Constraints { constraint := SizeConstraint{ - Type: c.Type, - Min: c.Min, - Max: c.Max, + Type: c.Type, + Min: c.Min, + Max: c.Max, + Identifier: c.Identifier, } constraints = append(constraints, constraint) } diff --git a/go.mod b/go.mod index 2e917d468..6adaf6240 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22 require ( github.com/Masterminds/semver/v3 v3.2.1 github.com/avast/retry-go/v4 v4.5.1 - github.com/aws/aws-sdk-go v1.50.31 + github.com/aws/aws-sdk-go v1.51.1 github.com/dustin/go-humanize v1.0.1 github.com/emicklei/go-restful-openapi/v2 v2.9.1 github.com/emicklei/go-restful/v3 v3.12.0 @@ -13,6 +13,7 @@ require ( github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0 + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 github.com/juanfont/headscale v0.22.3 github.com/looplab/fsm v0.3.0 github.com/metal-stack/go-ipam v1.8.5 @@ -22,15 +23,16 @@ require ( github.com/metal-stack/v v1.0.3 github.com/nsqio/go-nsq v1.1.0 github.com/prometheus/client_golang v1.19.0 + github.com/samber/lo v1.39.0 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.18.2 github.com/stretchr/testify v1.9.0 - github.com/testcontainers/testcontainers-go v0.29.1 + github.com/testcontainers/testcontainers-go v0.30.0 github.com/undefinedlabs/go-mpatch v1.0.7 - golang.org/x/crypto v0.21.0 - golang.org/x/sync v0.6.0 - google.golang.org/grpc v1.62.1 - google.golang.org/protobuf v1.33.0 + golang.org/x/crypto v0.22.0 + golang.org/x/sync v0.7.0 + google.golang.org/grpc v1.63.2 + google.golang.org/protobuf v1.34.0 gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.2 ) @@ -57,7 +59,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/containerd/containerd v1.7.13 // indirect + github.com/containerd/containerd v1.7.14 // indirect github.com/containerd/log v0.1.0 // indirect github.com/coreos/go-oidc/v3 v3.10.0 // indirect github.com/cpuguy83/dockercfg v0.3.1 // indirect @@ -92,7 +94,6 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1 github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -124,7 +125,7 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mdlayher/netlink v1.7.2 // indirect - github.com/mdlayher/socket v0.5.0 // indirect + github.com/mdlayher/socket v0.5.1 // indirect github.com/meilisearch/meilisearch-go v0.26.2 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -147,14 +148,13 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/prometheus/client_model v0.6.0 // indirect - github.com/prometheus/common v0.50.0 // indirect + github.com/prometheus/common v0.51.1 // indirect github.com/prometheus/procfs v0.13.0 // indirect github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rs/zerolog v1.32.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/samber/lo v1.39.0 // indirect github.com/segmentio/asm v1.2.0 // indirect github.com/shirou/gopsutil/v3 v3.24.2 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect @@ -186,7 +186,7 @@ require ( golang.org/x/mod v0.16.0 // indirect golang.org/x/net v0.22.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect; indirecct golang.org/x/tools v0.19.0 // indirect diff --git a/go.sum b/go.sum index 9e89a650f..62e4b9513 100644 --- a/go.sum +++ b/go.sum @@ -89,8 +89,8 @@ github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevB github.com/avast/retry-go/v4 v4.5.1 h1:AxIx0HGi4VZ3I02jr78j5lZ3M6x1E0Ivxa6b0pUUh7o= github.com/avast/retry-go/v4 v4.5.1/go.mod h1:/sipNsvNB3RRuT5iNcb6h73nw3IBmXJ/H3XrCQYSOpc= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.50.31 h1:gx2NRLLEDUmQFC4YUsfMUKkGCwpXVO8ijUecq/nOQGA= -github.com/aws/aws-sdk-go v1.50.31/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.51.1 h1:AFvTihcDPanvptoKS09a4yYmNtPm3+pXlk6uYHmZiFk= +github.com/aws/aws-sdk-go v1.51.1/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -150,8 +150,8 @@ github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1: github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.7.13 h1:wPYKIeGMN8vaggSKuV1X0wZulpMz4CrgEsZdaCyB6Is= -github.com/containerd/containerd v1.7.13/go.mod h1:zT3up6yTRfEUa6+GsITYIJNgSVL9NQ4x4h1RPzk0Wu4= +github.com/containerd/containerd v1.7.14 h1:H/XLzbnGuenZEGK+v0RkwTdv2u1QFAruMe5N0GNPJwA= +github.com/containerd/containerd v1.7.14/go.mod h1:YMC9Qt5yzNqXx/fO4j/5yYVIHXSRrlB3H7sxkUTvspg= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -438,8 +438,8 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDa github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0 h1:f4tggROQKKcnh4eItay6z/HbHLqghBxS8g7pyMhmDio= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0/go.mod h1:hKAkSgNkL0FII46ZkJcpVEAai4KV+swlIWCKfekd1pA= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1 h1:HcUWd006luQPljE73d5sk+/VgYPGUReEVz2y1/qylwY= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1/go.mod h1:w9Y7gY31krpLmrVU5ZPG9H7l9fZuRu5/3R3S3FMtVQ4= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= @@ -579,8 +579,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g= github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= -github.com/mdlayher/socket v0.5.0 h1:ilICZmJcQz70vrWVes1MFera4jGiWNocSkykwwoy3XI= -github.com/mdlayher/socket v0.5.0/go.mod h1:WkcBFfvyG8QENs5+hfQPl1X6Jpd2yeLIYgrGFmJiJxI= +github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos= +github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ= github.com/meilisearch/meilisearch-go v0.26.2 h1:3gTlmiV1dHHumVUhYdJbvh3camiNiyqQ1hNveVsU2OE= github.com/meilisearch/meilisearch-go v0.26.2/go.mod h1:SxuSqDcPBIykjWz1PX+KzsYzArNLSCadQodWs8extS0= github.com/metal-stack/go-ipam v1.8.5 h1:XE1XfaU6Ck1Ucc7svTO25dlT7kEcE1oxOM3lBrWIQmE= @@ -715,8 +715,8 @@ github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7q github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57CPQ= -github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ= +github.com/prometheus/common v0.51.1 h1:eIjN50Bwglz6a/c3hAgSMcofL3nD+nFQkV6Dd4DsQCw= +github.com/prometheus/common v0.51.1/go.mod h1:lrWtQx+iDfn2mbH5GUzlH9TSHyfZpHkSiG1W7y3sF2Q= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -823,8 +823,8 @@ github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a h1:SJy1Pu0eH1C29X github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a/go.mod h1:DFSS3NAGHthKo1gTlmEcSBiZrRJXi28rLNd/1udP1c8= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/testcontainers/testcontainers-go v0.10.0/go.mod h1:zFYk0JndthnMHEwtVRHCpLwIP/Ik1G7mvIAQ2MdZ+Ig= -github.com/testcontainers/testcontainers-go v0.29.1 h1:z8kxdFlovA2y97RWx98v/TQ+tR+SXZm6p35M+xB92zk= -github.com/testcontainers/testcontainers-go v0.29.1/go.mod h1:SnKnKQav8UcgtKqjp/AD8bE1MqZm+3TDb/B8crE3XnI= +github.com/testcontainers/testcontainers-go v0.30.0 h1:jmn/XS22q4YRrcMwWg0pAwlClzs/abopbsBzrepyc4E= +github.com/testcontainers/testcontainers-go v0.30.0/go.mod h1:K+kHNGiM5zjklKjgTtcrEetF3uhWbMUyqAQoyoh8Pf0= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= @@ -928,8 +928,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1011,8 +1011,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1085,14 +1085,14 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1219,8 +1219,8 @@ google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= -google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1233,8 +1233,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.0 h1:Qo/qEd2RZPCf2nKuorzksSknv0d3ERwp1vFG38gSmH4= +google.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= diff --git a/pkg/api/v1/boot.pb.go b/pkg/api/v1/boot.pb.go index 1f5f6b601..2a913408a 100644 --- a/pkg/api/v1/boot.pb.go +++ b/pkg/api/v1/boot.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 +// protoc-gen-go v1.33.0 // protoc (unknown) // source: api/v1/boot.proto @@ -467,6 +467,8 @@ type MachineHardware struct { CpuCores uint32 `protobuf:"varint,2,opt,name=cpu_cores,json=cpuCores,proto3" json:"cpu_cores,omitempty"` Disks []*MachineBlockDevice `protobuf:"bytes,3,rep,name=disks,proto3" json:"disks,omitempty"` Nics []*MachineNic `protobuf:"bytes,4,rep,name=nics,proto3" json:"nics,omitempty"` + Cpus []*MachineCPU `protobuf:"bytes,5,rep,name=cpus,proto3" json:"cpus,omitempty"` + Gpus []*MachineGPU `protobuf:"bytes,6,rep,name=gpus,proto3" json:"gpus,omitempty"` } func (x *MachineHardware) Reset() { @@ -529,6 +531,146 @@ func (x *MachineHardware) GetNics() []*MachineNic { return nil } +func (x *MachineHardware) GetCpus() []*MachineCPU { + if x != nil { + return x.Cpus + } + return nil +} + +func (x *MachineHardware) GetGpus() []*MachineGPU { + if x != nil { + return x.Gpus + } + return nil +} + +type MachineCPU struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Vendor string `protobuf:"bytes,1,opt,name=vendor,proto3" json:"vendor,omitempty"` + Model string `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"` + Cores uint32 `protobuf:"varint,3,opt,name=cores,proto3" json:"cores,omitempty"` + Threads uint32 `protobuf:"varint,4,opt,name=threads,proto3" json:"threads,omitempty"` +} + +func (x *MachineCPU) Reset() { + *x = MachineCPU{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_boot_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineCPU) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineCPU) ProtoMessage() {} + +func (x *MachineCPU) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_boot_proto_msgTypes[9] + 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 MachineCPU.ProtoReflect.Descriptor instead. +func (*MachineCPU) Descriptor() ([]byte, []int) { + return file_api_v1_boot_proto_rawDescGZIP(), []int{9} +} + +func (x *MachineCPU) GetVendor() string { + if x != nil { + return x.Vendor + } + return "" +} + +func (x *MachineCPU) GetModel() string { + if x != nil { + return x.Model + } + return "" +} + +func (x *MachineCPU) GetCores() uint32 { + if x != nil { + return x.Cores + } + return 0 +} + +func (x *MachineCPU) GetThreads() uint32 { + if x != nil { + return x.Threads + } + return 0 +} + +type MachineGPU struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Vendor string `protobuf:"bytes,1,opt,name=vendor,proto3" json:"vendor,omitempty"` + Model string `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"` +} + +func (x *MachineGPU) Reset() { + *x = MachineGPU{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_boot_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineGPU) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineGPU) ProtoMessage() {} + +func (x *MachineGPU) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_boot_proto_msgTypes[10] + 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 MachineGPU.ProtoReflect.Descriptor instead. +func (*MachineGPU) Descriptor() ([]byte, []int) { + return file_api_v1_boot_proto_rawDescGZIP(), []int{10} +} + +func (x *MachineGPU) GetVendor() string { + if x != nil { + return x.Vendor + } + return "" +} + +func (x *MachineGPU) GetModel() string { + if x != nil { + return x.Model + } + return "" +} + type MachineNic struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -544,7 +686,7 @@ type MachineNic struct { func (x *MachineNic) Reset() { *x = MachineNic{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[9] + mi := &file_api_v1_boot_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -557,7 +699,7 @@ func (x *MachineNic) String() string { func (*MachineNic) ProtoMessage() {} func (x *MachineNic) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[9] + mi := &file_api_v1_boot_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -570,7 +712,7 @@ func (x *MachineNic) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineNic.ProtoReflect.Descriptor instead. func (*MachineNic) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{9} + return file_api_v1_boot_proto_rawDescGZIP(), []int{11} } func (x *MachineNic) GetMac() string { @@ -620,7 +762,7 @@ type MachineBlockDevice struct { func (x *MachineBlockDevice) Reset() { *x = MachineBlockDevice{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[10] + mi := &file_api_v1_boot_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -633,7 +775,7 @@ func (x *MachineBlockDevice) String() string { func (*MachineBlockDevice) ProtoMessage() {} func (x *MachineBlockDevice) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[10] + mi := &file_api_v1_boot_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -646,7 +788,7 @@ func (x *MachineBlockDevice) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineBlockDevice.ProtoReflect.Descriptor instead. func (*MachineBlockDevice) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{10} + return file_api_v1_boot_proto_rawDescGZIP(), []int{12} } func (x *MachineBlockDevice) GetName() string { @@ -676,7 +818,7 @@ type MachineBIOS struct { func (x *MachineBIOS) Reset() { *x = MachineBIOS{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[11] + mi := &file_api_v1_boot_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -689,7 +831,7 @@ func (x *MachineBIOS) String() string { func (*MachineBIOS) ProtoMessage() {} func (x *MachineBIOS) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[11] + mi := &file_api_v1_boot_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -702,7 +844,7 @@ func (x *MachineBIOS) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineBIOS.ProtoReflect.Descriptor instead. func (*MachineBIOS) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{11} + return file_api_v1_boot_proto_rawDescGZIP(), []int{13} } func (x *MachineBIOS) GetVersion() string { @@ -744,7 +886,7 @@ type MachineIPMI struct { func (x *MachineIPMI) Reset() { *x = MachineIPMI{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[12] + mi := &file_api_v1_boot_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -757,7 +899,7 @@ func (x *MachineIPMI) String() string { func (*MachineIPMI) ProtoMessage() {} func (x *MachineIPMI) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[12] + mi := &file_api_v1_boot_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -770,7 +912,7 @@ func (x *MachineIPMI) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineIPMI.ProtoReflect.Descriptor instead. func (*MachineIPMI) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{12} + return file_api_v1_boot_proto_rawDescGZIP(), []int{14} } func (x *MachineIPMI) GetAddress() string { @@ -847,7 +989,7 @@ type MachineFRU struct { func (x *MachineFRU) Reset() { *x = MachineFRU{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[13] + mi := &file_api_v1_boot_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -860,7 +1002,7 @@ func (x *MachineFRU) String() string { func (*MachineFRU) ProtoMessage() {} func (x *MachineFRU) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[13] + mi := &file_api_v1_boot_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -873,7 +1015,7 @@ func (x *MachineFRU) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineFRU.ProtoReflect.Descriptor instead. func (*MachineFRU) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{13} + return file_api_v1_boot_proto_rawDescGZIP(), []int{15} } func (x *MachineFRU) GetChassisPartNumber() string { @@ -947,7 +1089,7 @@ type BootServiceReportRequest struct { func (x *BootServiceReportRequest) Reset() { *x = BootServiceReportRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[14] + mi := &file_api_v1_boot_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -960,7 +1102,7 @@ func (x *BootServiceReportRequest) String() string { func (*BootServiceReportRequest) ProtoMessage() {} func (x *BootServiceReportRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[14] + mi := &file_api_v1_boot_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -973,7 +1115,7 @@ func (x *BootServiceReportRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BootServiceReportRequest.ProtoReflect.Descriptor instead. func (*BootServiceReportRequest) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{14} + return file_api_v1_boot_proto_rawDescGZIP(), []int{16} } func (x *BootServiceReportRequest) GetUuid() string { @@ -1020,7 +1162,7 @@ type BootServiceReportResponse struct { func (x *BootServiceReportResponse) Reset() { *x = BootServiceReportResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[15] + mi := &file_api_v1_boot_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1033,7 +1175,7 @@ func (x *BootServiceReportResponse) String() string { func (*BootServiceReportResponse) ProtoMessage() {} func (x *BootServiceReportResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[15] + mi := &file_api_v1_boot_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1046,7 +1188,7 @@ func (x *BootServiceReportResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BootServiceReportResponse.ProtoReflect.Descriptor instead. func (*BootServiceReportResponse) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{15} + return file_api_v1_boot_proto_rawDescGZIP(), []int{17} } type BootInfo struct { @@ -1066,7 +1208,7 @@ type BootInfo struct { func (x *BootInfo) Reset() { *x = BootInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[16] + mi := &file_api_v1_boot_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1079,7 +1221,7 @@ func (x *BootInfo) String() string { func (*BootInfo) ProtoMessage() {} func (x *BootInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[16] + mi := &file_api_v1_boot_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1092,7 +1234,7 @@ func (x *BootInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use BootInfo.ProtoReflect.Descriptor instead. func (*BootInfo) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{16} + return file_api_v1_boot_proto_rawDescGZIP(), []int{18} } func (x *BootInfo) GetImageId() string { @@ -1156,7 +1298,7 @@ type BootServiceAbortReinstallRequest struct { func (x *BootServiceAbortReinstallRequest) Reset() { *x = BootServiceAbortReinstallRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[17] + mi := &file_api_v1_boot_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1169,7 +1311,7 @@ func (x *BootServiceAbortReinstallRequest) String() string { func (*BootServiceAbortReinstallRequest) ProtoMessage() {} func (x *BootServiceAbortReinstallRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[17] + mi := &file_api_v1_boot_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1182,7 +1324,7 @@ func (x *BootServiceAbortReinstallRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BootServiceAbortReinstallRequest.ProtoReflect.Descriptor instead. func (*BootServiceAbortReinstallRequest) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{17} + return file_api_v1_boot_proto_rawDescGZIP(), []int{19} } func (x *BootServiceAbortReinstallRequest) GetUuid() string { @@ -1210,7 +1352,7 @@ type BootServiceAbortReinstallResponse struct { func (x *BootServiceAbortReinstallResponse) Reset() { *x = BootServiceAbortReinstallResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[18] + mi := &file_api_v1_boot_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1223,7 +1365,7 @@ func (x *BootServiceAbortReinstallResponse) String() string { func (*BootServiceAbortReinstallResponse) ProtoMessage() {} func (x *BootServiceAbortReinstallResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[18] + mi := &file_api_v1_boot_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1236,7 +1378,7 @@ func (x *BootServiceAbortReinstallResponse) ProtoReflect() protoreflect.Message // Deprecated: Use BootServiceAbortReinstallResponse.ProtoReflect.Descriptor instead. func (*BootServiceAbortReinstallResponse) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{18} + return file_api_v1_boot_proto_rawDescGZIP(), []int{20} } func (x *BootServiceAbortReinstallResponse) GetBootInfo() *BootInfo { @@ -1255,7 +1397,7 @@ type BootServiceSuperUserPasswordRequest struct { func (x *BootServiceSuperUserPasswordRequest) Reset() { *x = BootServiceSuperUserPasswordRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[19] + mi := &file_api_v1_boot_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1268,7 +1410,7 @@ func (x *BootServiceSuperUserPasswordRequest) String() string { func (*BootServiceSuperUserPasswordRequest) ProtoMessage() {} func (x *BootServiceSuperUserPasswordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[19] + mi := &file_api_v1_boot_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1281,7 +1423,7 @@ func (x *BootServiceSuperUserPasswordRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use BootServiceSuperUserPasswordRequest.ProtoReflect.Descriptor instead. func (*BootServiceSuperUserPasswordRequest) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{19} + return file_api_v1_boot_proto_rawDescGZIP(), []int{21} } type BootServiceSuperUserPasswordResponse struct { @@ -1296,7 +1438,7 @@ type BootServiceSuperUserPasswordResponse struct { func (x *BootServiceSuperUserPasswordResponse) Reset() { *x = BootServiceSuperUserPasswordResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_boot_proto_msgTypes[20] + mi := &file_api_v1_boot_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1309,7 +1451,7 @@ func (x *BootServiceSuperUserPasswordResponse) String() string { func (*BootServiceSuperUserPasswordResponse) ProtoMessage() {} func (x *BootServiceSuperUserPasswordResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_boot_proto_msgTypes[20] + mi := &file_api_v1_boot_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1322,7 +1464,7 @@ func (x *BootServiceSuperUserPasswordResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use BootServiceSuperUserPasswordResponse.ProtoReflect.Descriptor instead. func (*BootServiceSuperUserPasswordResponse) Descriptor() ([]byte, []int) { - return file_api_v1_boot_proto_rawDescGZIP(), []int{20} + return file_api_v1_boot_proto_rawDescGZIP(), []int{22} } func (x *BootServiceSuperUserPasswordResponse) GetFeatureDisabled() bool { @@ -1389,7 +1531,7 @@ var file_api_v1_boot_proto_rawDesc = []byte{ 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x57, 0x61, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, @@ -1399,168 +1541,183 @@ var file_api_v1_boot_proto_rawDesc = []byte{ 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x6e, 0x69, 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x4e, 0x69, 0x63, 0x52, 0x04, 0x6e, 0x69, 0x63, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0a, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4e, 0x69, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x61, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, - 0x0a, 0x09, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x4e, 0x69, 0x63, 0x52, 0x09, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x3c, 0x0a, 0x12, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x53, 0x0a, 0x0b, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x42, 0x49, 0x4f, 0x53, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x22, - 0xef, 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x50, 0x4d, 0x49, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x61, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x66, 0x72, 0x75, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x46, 0x52, 0x55, 0x52, 0x03, 0x66, 0x72, 0x75, 0x12, - 0x1f, 0x0a, 0x0b, 0x62, 0x6d, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6d, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x22, 0xbe, 0x04, 0x0a, 0x0a, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x46, 0x52, 0x55, - 0x12, 0x33, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x11, 0x63, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x01, 0x52, 0x11, 0x63, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73, 0x50, 0x61, 0x72, - 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x66, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, - 0x08, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4d, 0x66, 0x67, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, + 0x4e, 0x69, 0x63, 0x52, 0x04, 0x6e, 0x69, 0x63, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x63, 0x70, 0x75, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x50, 0x55, 0x52, 0x04, 0x63, 0x70, 0x75, + 0x73, 0x12, 0x26, 0x0a, 0x04, 0x67, 0x70, 0x75, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x47, 0x50, 0x55, 0x52, 0x04, 0x67, 0x70, 0x75, 0x73, 0x22, 0x6a, 0x0a, 0x0a, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x43, 0x50, 0x55, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x3a, 0x0a, 0x0a, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x47, 0x50, 0x55, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x22, 0xa0, 0x01, 0x0a, 0x0a, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4e, 0x69, 0x63, + 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, + 0x61, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, + 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4e, 0x69, 0x63, 0x52, 0x09, 0x6e, + 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x22, 0x3c, 0x0a, 0x12, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x53, 0x0a, 0x0b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x42, 0x49, 0x4f, + 0x53, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x76, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x22, 0xef, 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x49, 0x50, 0x4d, 0x49, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6d, 0x61, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, + 0x65, 0x12, 0x24, 0x0a, 0x03, 0x66, 0x72, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x46, + 0x52, 0x55, 0x52, 0x03, 0x66, 0x72, 0x75, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6d, 0x63, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6d, + 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, + 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbe, 0x04, 0x0a, 0x0a, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x46, 0x52, 0x55, 0x12, 0x33, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x73, + 0x73, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x11, 0x63, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73, + 0x50, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, + 0x13, 0x63, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x11, 0x63, 0x68, + 0x61, 0x73, 0x73, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x88, + 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x66, 0x67, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4d, 0x66, + 0x67, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x66, + 0x67, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, + 0x52, 0x0e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4d, 0x66, 0x67, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, + 0x52, 0x0f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, + 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x05, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4d, 0x61, 0x6e, + 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x11, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x50, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0d, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, + 0x14, 0x5f, 0x63, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x63, 0x68, 0x61, 0x73, 0x73, 0x69, + 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x66, 0x67, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x66, 0x67, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4d, - 0x66, 0x67, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x50, - 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x14, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x13, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x72, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x06, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x07, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x63, 0x68, 0x61, 0x73, 0x73, 0x69, - 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x16, 0x0a, - 0x14, 0x5f, 0x63, 0x68, 0x61, 0x73, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x73, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, - 0x6d, 0x66, 0x67, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x66, - 0x67, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x17, - 0x0a, 0x15, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x75, 0x66, - 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, - 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x22, 0xbc, 0x01, 0x0a, 0x18, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x75, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x5f, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2d, - 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xda, - 0x01, 0x0a, 0x08, 0x42, 0x6f, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x69, 0x73, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x73, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x6f, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x69, 0x6e, 0x69, 0x74, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6e, - 0x69, 0x74, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6d, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6d, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x74, 0x6c, 0x6f, - 0x61, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, - 0x6f, 0x6f, 0x74, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x49, 0x64, 0x22, 0x64, 0x0a, 0x20, 0x42, - 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x52, - 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x75, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x64, - 0x69, 0x73, 0x6b, 0x5f, 0x77, 0x69, 0x70, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x69, 0x73, 0x6b, 0x57, 0x69, 0x70, 0x65, - 0x64, 0x22, 0x52, 0x0a, 0x21, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x42, + 0x16, 0x0a, 0x14, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0xbc, 0x01, 0x0a, 0x18, 0x42, + 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2d, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x6f, 0x6f, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x25, 0x0a, 0x23, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x42, 0x6f, 0x6f, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xda, 0x01, 0x0a, 0x08, 0x42, 0x6f, 0x6f, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x21, + 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x69, 0x73, + 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x69, 0x74, 0x72, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6e, 0x69, 0x74, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6d, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6d, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x12, 0x23, + 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x74, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x6f, 0x6f, 0x74, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x72, 0x49, 0x64, 0x22, 0x64, 0x0a, 0x20, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x77, 0x69, 0x70, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x44, 0x69, 0x73, 0x6b, 0x57, 0x69, 0x70, 0x65, 0x64, 0x22, 0x52, 0x0a, 0x21, 0x42, 0x6f, 0x6f, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, + 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x25, 0x0a, + 0x23, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x70, 0x65, + 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x24, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x70, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x81, 0x01, 0x0a, - 0x24, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x70, 0x65, - 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x75, 0x70, 0x65, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, - 0x75, 0x70, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x32, 0xef, 0x04, 0x0a, 0x0b, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x49, 0x0a, 0x04, 0x44, 0x68, 0x63, 0x70, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x68, 0x63, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x68, 0x63, - 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x04, 0x42, - 0x6f, 0x6f, 0x74, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x11, 0x53, 0x75, 0x70, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2b, 0x2e, 0x61, 0x70, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, + 0x10, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x75, 0x70, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x32, 0xef, 0x04, 0x0a, 0x0b, 0x42, 0x6f, 0x6f, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x04, 0x44, 0x68, 0x63, 0x70, + 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x68, 0x63, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x68, 0x63, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x04, 0x42, 0x6f, 0x6f, 0x74, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x75, 0x70, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x70, - 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, - 0x04, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x57, 0x61, 0x69, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x57, 0x61, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, - 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0e, 0x41, 0x62, 0x6f, - 0x72, 0x74, 0x52, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x28, 0x2e, 0x61, 0x70, + 0x42, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x52, - 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x42, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, + 0x0a, 0x11, 0x53, 0x75, 0x70, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x70, 0x65, 0x72, 0x55, 0x73, 0x65, + 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x70, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, + 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x04, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x57, 0x61, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x57, 0x61, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, + 0x12, 0x4f, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x67, 0x0a, 0x0e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, + 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1575,7 +1732,7 @@ func file_api_v1_boot_proto_rawDescGZIP() []byte { return file_api_v1_boot_proto_rawDescData } -var file_api_v1_boot_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_api_v1_boot_proto_msgTypes = make([]protoimpl.MessageInfo, 23) var file_api_v1_boot_proto_goTypes = []interface{}{ (*BootServiceDhcpRequest)(nil), // 0: api.v1.BootServiceDhcpRequest (*BootServiceDhcpResponse)(nil), // 1: api.v1.BootServiceDhcpResponse @@ -1586,48 +1743,52 @@ var file_api_v1_boot_proto_goTypes = []interface{}{ (*BootServiceWaitRequest)(nil), // 6: api.v1.BootServiceWaitRequest (*BootServiceWaitResponse)(nil), // 7: api.v1.BootServiceWaitResponse (*MachineHardware)(nil), // 8: api.v1.MachineHardware - (*MachineNic)(nil), // 9: api.v1.MachineNic - (*MachineBlockDevice)(nil), // 10: api.v1.MachineBlockDevice - (*MachineBIOS)(nil), // 11: api.v1.MachineBIOS - (*MachineIPMI)(nil), // 12: api.v1.MachineIPMI - (*MachineFRU)(nil), // 13: api.v1.MachineFRU - (*BootServiceReportRequest)(nil), // 14: api.v1.BootServiceReportRequest - (*BootServiceReportResponse)(nil), // 15: api.v1.BootServiceReportResponse - (*BootInfo)(nil), // 16: api.v1.BootInfo - (*BootServiceAbortReinstallRequest)(nil), // 17: api.v1.BootServiceAbortReinstallRequest - (*BootServiceAbortReinstallResponse)(nil), // 18: api.v1.BootServiceAbortReinstallResponse - (*BootServiceSuperUserPasswordRequest)(nil), // 19: api.v1.BootServiceSuperUserPasswordRequest - (*BootServiceSuperUserPasswordResponse)(nil), // 20: api.v1.BootServiceSuperUserPasswordResponse + (*MachineCPU)(nil), // 9: api.v1.MachineCPU + (*MachineGPU)(nil), // 10: api.v1.MachineGPU + (*MachineNic)(nil), // 11: api.v1.MachineNic + (*MachineBlockDevice)(nil), // 12: api.v1.MachineBlockDevice + (*MachineBIOS)(nil), // 13: api.v1.MachineBIOS + (*MachineIPMI)(nil), // 14: api.v1.MachineIPMI + (*MachineFRU)(nil), // 15: api.v1.MachineFRU + (*BootServiceReportRequest)(nil), // 16: api.v1.BootServiceReportRequest + (*BootServiceReportResponse)(nil), // 17: api.v1.BootServiceReportResponse + (*BootInfo)(nil), // 18: api.v1.BootInfo + (*BootServiceAbortReinstallRequest)(nil), // 19: api.v1.BootServiceAbortReinstallRequest + (*BootServiceAbortReinstallResponse)(nil), // 20: api.v1.BootServiceAbortReinstallResponse + (*BootServiceSuperUserPasswordRequest)(nil), // 21: api.v1.BootServiceSuperUserPasswordRequest + (*BootServiceSuperUserPasswordResponse)(nil), // 22: api.v1.BootServiceSuperUserPasswordResponse } var file_api_v1_boot_proto_depIdxs = []int32{ 8, // 0: api.v1.BootServiceRegisterRequest.hardware:type_name -> api.v1.MachineHardware - 11, // 1: api.v1.BootServiceRegisterRequest.bios:type_name -> api.v1.MachineBIOS - 12, // 2: api.v1.BootServiceRegisterRequest.ipmi:type_name -> api.v1.MachineIPMI - 10, // 3: api.v1.MachineHardware.disks:type_name -> api.v1.MachineBlockDevice - 9, // 4: api.v1.MachineHardware.nics:type_name -> api.v1.MachineNic - 9, // 5: api.v1.MachineNic.neighbors:type_name -> api.v1.MachineNic - 13, // 6: api.v1.MachineIPMI.fru:type_name -> api.v1.MachineFRU - 16, // 7: api.v1.BootServiceReportRequest.boot_info:type_name -> api.v1.BootInfo - 16, // 8: api.v1.BootServiceAbortReinstallResponse.boot_info:type_name -> api.v1.BootInfo - 0, // 9: api.v1.BootService.Dhcp:input_type -> api.v1.BootServiceDhcpRequest - 2, // 10: api.v1.BootService.Boot:input_type -> api.v1.BootServiceBootRequest - 19, // 11: api.v1.BootService.SuperUserPassword:input_type -> api.v1.BootServiceSuperUserPasswordRequest - 4, // 12: api.v1.BootService.Register:input_type -> api.v1.BootServiceRegisterRequest - 6, // 13: api.v1.BootService.Wait:input_type -> api.v1.BootServiceWaitRequest - 14, // 14: api.v1.BootService.Report:input_type -> api.v1.BootServiceReportRequest - 17, // 15: api.v1.BootService.AbortReinstall:input_type -> api.v1.BootServiceAbortReinstallRequest - 1, // 16: api.v1.BootService.Dhcp:output_type -> api.v1.BootServiceDhcpResponse - 3, // 17: api.v1.BootService.Boot:output_type -> api.v1.BootServiceBootResponse - 20, // 18: api.v1.BootService.SuperUserPassword:output_type -> api.v1.BootServiceSuperUserPasswordResponse - 5, // 19: api.v1.BootService.Register:output_type -> api.v1.BootServiceRegisterResponse - 7, // 20: api.v1.BootService.Wait:output_type -> api.v1.BootServiceWaitResponse - 15, // 21: api.v1.BootService.Report:output_type -> api.v1.BootServiceReportResponse - 18, // 22: api.v1.BootService.AbortReinstall:output_type -> api.v1.BootServiceAbortReinstallResponse - 16, // [16:23] is the sub-list for method output_type - 9, // [9:16] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 13, // 1: api.v1.BootServiceRegisterRequest.bios:type_name -> api.v1.MachineBIOS + 14, // 2: api.v1.BootServiceRegisterRequest.ipmi:type_name -> api.v1.MachineIPMI + 12, // 3: api.v1.MachineHardware.disks:type_name -> api.v1.MachineBlockDevice + 11, // 4: api.v1.MachineHardware.nics:type_name -> api.v1.MachineNic + 9, // 5: api.v1.MachineHardware.cpus:type_name -> api.v1.MachineCPU + 10, // 6: api.v1.MachineHardware.gpus:type_name -> api.v1.MachineGPU + 11, // 7: api.v1.MachineNic.neighbors:type_name -> api.v1.MachineNic + 15, // 8: api.v1.MachineIPMI.fru:type_name -> api.v1.MachineFRU + 18, // 9: api.v1.BootServiceReportRequest.boot_info:type_name -> api.v1.BootInfo + 18, // 10: api.v1.BootServiceAbortReinstallResponse.boot_info:type_name -> api.v1.BootInfo + 0, // 11: api.v1.BootService.Dhcp:input_type -> api.v1.BootServiceDhcpRequest + 2, // 12: api.v1.BootService.Boot:input_type -> api.v1.BootServiceBootRequest + 21, // 13: api.v1.BootService.SuperUserPassword:input_type -> api.v1.BootServiceSuperUserPasswordRequest + 4, // 14: api.v1.BootService.Register:input_type -> api.v1.BootServiceRegisterRequest + 6, // 15: api.v1.BootService.Wait:input_type -> api.v1.BootServiceWaitRequest + 16, // 16: api.v1.BootService.Report:input_type -> api.v1.BootServiceReportRequest + 19, // 17: api.v1.BootService.AbortReinstall:input_type -> api.v1.BootServiceAbortReinstallRequest + 1, // 18: api.v1.BootService.Dhcp:output_type -> api.v1.BootServiceDhcpResponse + 3, // 19: api.v1.BootService.Boot:output_type -> api.v1.BootServiceBootResponse + 22, // 20: api.v1.BootService.SuperUserPassword:output_type -> api.v1.BootServiceSuperUserPasswordResponse + 5, // 21: api.v1.BootService.Register:output_type -> api.v1.BootServiceRegisterResponse + 7, // 22: api.v1.BootService.Wait:output_type -> api.v1.BootServiceWaitResponse + 17, // 23: api.v1.BootService.Report:output_type -> api.v1.BootServiceReportResponse + 20, // 24: api.v1.BootService.AbortReinstall:output_type -> api.v1.BootServiceAbortReinstallResponse + 18, // [18:25] is the sub-list for method output_type + 11, // [11:18] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_api_v1_boot_proto_init() } @@ -1745,7 +1906,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineNic); i { + switch v := v.(*MachineCPU); i { case 0: return &v.state case 1: @@ -1757,7 +1918,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineBlockDevice); i { + switch v := v.(*MachineGPU); i { case 0: return &v.state case 1: @@ -1769,7 +1930,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineBIOS); i { + switch v := v.(*MachineNic); i { case 0: return &v.state case 1: @@ -1781,7 +1942,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineIPMI); i { + switch v := v.(*MachineBlockDevice); i { case 0: return &v.state case 1: @@ -1793,7 +1954,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineFRU); i { + switch v := v.(*MachineBIOS); i { case 0: return &v.state case 1: @@ -1805,7 +1966,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BootServiceReportRequest); i { + switch v := v.(*MachineIPMI); i { case 0: return &v.state case 1: @@ -1817,7 +1978,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BootServiceReportResponse); i { + switch v := v.(*MachineFRU); i { case 0: return &v.state case 1: @@ -1829,7 +1990,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BootInfo); i { + switch v := v.(*BootServiceReportRequest); i { case 0: return &v.state case 1: @@ -1841,7 +2002,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BootServiceAbortReinstallRequest); i { + switch v := v.(*BootServiceReportResponse); i { case 0: return &v.state case 1: @@ -1853,7 +2014,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BootServiceAbortReinstallResponse); i { + switch v := v.(*BootInfo); i { case 0: return &v.state case 1: @@ -1865,7 +2026,7 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BootServiceSuperUserPasswordRequest); i { + switch v := v.(*BootServiceAbortReinstallRequest); i { case 0: return &v.state case 1: @@ -1877,6 +2038,30 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BootServiceAbortReinstallResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_boot_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BootServiceSuperUserPasswordRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_boot_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BootServiceSuperUserPasswordResponse); i { case 0: return &v.state @@ -1890,14 +2075,14 @@ func file_api_v1_boot_proto_init() { } } file_api_v1_boot_proto_msgTypes[3].OneofWrappers = []interface{}{} - file_api_v1_boot_proto_msgTypes[13].OneofWrappers = []interface{}{} + file_api_v1_boot_proto_msgTypes[15].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_boot_proto_rawDesc, NumEnums: 0, - NumMessages: 21, + NumMessages: 23, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/v1/event.pb.go b/pkg/api/v1/event.pb.go index 1b89a3ff8..2137fe291 100644 --- a/pkg/api/v1/event.pb.go +++ b/pkg/api/v1/event.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 +// protoc-gen-go v1.33.0 // protoc (unknown) // source: api/v1/event.proto diff --git a/proto/Makefile b/proto/Makefile index 5afd3f93c..92b108064 100644 --- a/proto/Makefile +++ b/proto/Makefile @@ -1,5 +1,5 @@ MAKEFLAGS += --no-print-directory -BUF_VERSION := 1.29.0 +BUF_VERSION := 1.30.0 _buf: docker run --rm \ diff --git a/proto/api/v1/boot.proto b/proto/api/v1/boot.proto index 44cd05178..2b693591e 100644 --- a/proto/api/v1/boot.proto +++ b/proto/api/v1/boot.proto @@ -64,6 +64,20 @@ message MachineHardware { uint32 cpu_cores = 2; repeated MachineBlockDevice disks = 3; repeated MachineNic nics = 4; + repeated MachineCPU cpus = 5; + repeated MachineGPU gpus = 6; +} + +message MachineCPU { + string vendor = 1; + string model = 2; + uint32 cores = 3; + uint32 threads = 4; +} + +message MachineGPU { + string vendor = 1; + string model = 2; } message MachineNic { diff --git a/proto/buf.gen.yaml b/proto/buf.gen.yaml index f566c5d75..aeb47eacd 100644 --- a/proto/buf.gen.yaml +++ b/proto/buf.gen.yaml @@ -1,7 +1,7 @@ version: v1 plugins: # generate go structs for protocol buffer definition - - plugin: buf.build/protocolbuffers/go:v1.32.0 + - plugin: buf.build/protocolbuffers/go:v1.33.0 out: ../pkg/api # generate gRPC stubs in golang - plugin: buf.build/grpc/go:v1.3.0 diff --git a/spec/metal-api.json b/spec/metal-api.json index cde2ba203..c429a22b3 100644 --- a/spec/metal-api.json +++ b/spec/metal-api.json @@ -2575,6 +2575,13 @@ "format": "int32", "type": "integer" }, + "cpus": { + "description": "the cpu details", + "items": { + "$ref": "#/definitions/v1.MetalCPU" + }, + "type": "array" + }, "disks": { "description": "the list of block devices of this machine", "items": { @@ -2582,6 +2589,13 @@ }, "type": "array" }, + "gpus": { + "description": "the gpu details", + "items": { + "$ref": "#/definitions/v1.MetalGPU" + }, + "type": "array" + }, "memory": { "description": "the total memory of the machine", "format": "integer", @@ -2609,6 +2623,13 @@ "format": "int32", "type": "integer" }, + "cpus": { + "description": "the cpu details", + "items": { + "$ref": "#/definitions/v1.MetalCPU" + }, + "type": "array" + }, "disks": { "description": "the list of block devices of this machine", "items": { @@ -2616,6 +2637,13 @@ }, "type": "array" }, + "gpus": { + "description": "the gpu details", + "items": { + "$ref": "#/definitions/v1.MetalGPU" + }, + "type": "array" + }, "memory": { "description": "the total memory of the machine", "format": "integer", @@ -3507,6 +3535,50 @@ } } }, + "v1.MetalCPU": { + "properties": { + "cores": { + "description": "the cpu cores", + "format": "integer", + "type": "integer" + }, + "model": { + "description": "the cpu model", + "type": "string" + }, + "threads": { + "description": "the cpu threads", + "format": "integer", + "type": "integer" + }, + "vendor": { + "description": "the cpu vendor", + "type": "string" + } + }, + "required": [ + "cores", + "model", + "threads", + "vendor" + ] + }, + "v1.MetalGPU": { + "properties": { + "model": { + "description": "the gpu model", + "type": "string" + }, + "vendor": { + "description": "the gpu vendor", + "type": "string" + } + }, + "required": [ + "model", + "vendor" + ] + }, "v1.NetworkAllocateRequest": { "properties": { "description": { @@ -4402,6 +4474,10 @@ "v1.SizeConstraint": { "description": "a machine matches to a size in order to make them easier to categorize", "properties": { + "identifier": { + "description": "glob pattern which matches to the given type, for example gpu pci id", + "type": "string" + }, "max": { "description": "the maximum value of the constraint", "format": "integer", @@ -4416,6 +4492,7 @@ "description": "the type of the constraint", "enum": [ "cores", + "gpu", "memory", "storage" ], @@ -4423,8 +4500,6 @@ } }, "required": [ - "max", - "min", "type" ] },