diff --git a/internal/sync/configs/fec-config.yaml b/internal/sync/configs/fec-config.yaml index e347411ec..5a24b0690 100644 --- a/internal/sync/configs/fec-config.yaml +++ b/internal/sync/configs/fec-config.yaml @@ -3,6 +3,6 @@ sync: true repo_link: "https://github.com/intel/sriov-fec-operator" branch: main - remote_api_directory: api/sriovfec/v1 + remote_api_directory: api/sriovfec/v2 local_api_directory: schemes/fec/fectypes ... diff --git a/pkg/schemes/fec/fectypes/groupversion_info.go b/pkg/schemes/fec/fectypes/groupversion_info.go index e7a544200..48756488e 100644 --- a/pkg/schemes/fec/fectypes/groupversion_info.go +++ b/pkg/schemes/fec/fectypes/groupversion_info.go @@ -1,22 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright (c) 2020-2024 Intel Corporation -/* - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package v1 contains API Schema definitions for the sriovfec v1 API group +// Package v2 contains API Schema definitions for the sriovfec v2 API group // +kubebuilder:object:generate=true // +groupName=sriovfec.intel.com package fectypes @@ -28,7 +13,7 @@ import ( var ( // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "sriovfec.intel.com", Version: "v1"} + GroupVersion = schema.GroupVersion{Group: "sriovfec.intel.com", Version: "v2"} // SchemeBuilder is used to add go types to the GroupVersionKind scheme SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} diff --git a/pkg/schemes/fec/fectypes/helper.go b/pkg/schemes/fec/fectypes/helper.go new file mode 100644 index 000000000..2b7e83436 --- /dev/null +++ b/pkg/schemes/fec/fectypes/helper.go @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright (c) 2020-2024 Intel Corporation + +package fectypes + +import ( + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "reflect" +) + +type ByPriority []SriovFecClusterConfig + +func (a ByPriority) Len() int { + return len(a) +} + +func (a ByPriority) Less(i, j int) bool { + if a[i].Spec.Priority != a[j].Spec.Priority { + return a[i].Spec.Priority > a[j].Spec.Priority + } + return a[i].GetName() < a[j].GetName() +} + +func (a ByPriority) Swap(i, j int) { + a[i], a[j] = a[j], a[i] +} + +func (s AcceleratorSelector) Matches(a SriovAccelerator) bool { + return s.isVendorMatching(a) && s.isPciAddressMatching(a) && + s.isPFDriverMatching(a) && s.isMaxVFsMatching(a) && s.isDeviceIDMatching(a) +} + +func (s AcceleratorSelector) isVendorMatching(a SriovAccelerator) bool { + return s.VendorID == "" || s.VendorID == a.VendorID +} + +func (s AcceleratorSelector) isPciAddressMatching(a SriovAccelerator) bool { + return s.PCIAddress == "" || s.PCIAddress == a.PCIAddress +} + +func (s AcceleratorSelector) isPFDriverMatching(a SriovAccelerator) bool { + return s.PFDriver == "" || s.PFDriver == a.PFDriver +} + +func (s AcceleratorSelector) isMaxVFsMatching(a SriovAccelerator) bool { + return s.MaxVFs == 0 || s.MaxVFs == a.MaxVFs +} + +func (s AcceleratorSelector) isDeviceIDMatching(a SriovAccelerator) bool { + return s.DeviceID == "" || s.DeviceID == a.DeviceID +} + +func (in *SriovFecNodeConfig) FindCondition(conditionType string) *metav1.Condition { + return meta.FindStatusCondition(in.Status.Conditions, conditionType) +} + +func isNil(v interface{}) bool { + return v == nil || (reflect.ValueOf(v).Kind() == reflect.Ptr && reflect.ValueOf(v).IsNil()) +} diff --git a/pkg/schemes/fec/fectypes/sriovfecclusterconfig_types.go b/pkg/schemes/fec/fectypes/sriovfecclusterconfig_types.go index 824e22a17..c46efab85 100644 --- a/pkg/schemes/fec/fectypes/sriovfecclusterconfig_types.go +++ b/pkg/schemes/fec/fectypes/sriovfecclusterconfig_types.go @@ -11,6 +11,11 @@ import ( type SyncStatus string +const ( + acc100maxQueueGroups = 8 + acc200maxQueueGroups = 16 +) + var ( // InProgressSync indicates that the synchronization of the CR is in progress InProgressSync SyncStatus = "InProgress" @@ -66,7 +71,10 @@ type UplinkDownlink struct { type N3000BBDevConfig struct { // +kubebuilder:validation:Enum=FPGA_5GNR;FPGA_LTE NetworkType string `json:"networkType"` - PFMode bool `json:"pfMode"` + // +kubebuilder:validation:Optional + // +kubebuilder:default:false + // +kubebuilder:validation:Enum=false + PFMode bool `json:"pfMode,omitempty"` // +kubebuilder:validation:Minimum=0 FLRTimeOut int `json:"flrTimeout"` Downlink UplinkDownlink `json:"downlink"` @@ -75,67 +83,160 @@ type N3000BBDevConfig struct { type QueueGroupConfig struct { // +kubebuilder:validation:Minimum=0 - // +kubebuilder:validation:Maximum=8 + // +kubebuilder:validation:Maximum=16 NumQueueGroups int `json:"numQueueGroups"` - // +kubebuilder:validation:Minimum=16 + // +kubebuilder:validation:Minimum=1 // +kubebuilder:validation:Maximum=16 NumAqsPerGroups int `json:"numAqsPerGroups"` - // +kubebuilder:validation:Minimum=4 - // +kubebuilder:validation:Maximum=4 + // +kubebuilder:validation:Minimum=1 + // +kubebuilder:validation:Maximum=12 AqDepthLog2 int `json:"aqDepthLog2"` } // ACC100BBDevConfig specifies variables to configure ACC100 with type ACC100BBDevConfig struct { - PFMode bool `json:"pfMode"` - // +kubebuilder:validation:Minimum=16 + // +kubebuilder:validation:Optional + // +kubebuilder:default:false + // +kubebuilder:validation:Enum=false + PFMode bool `json:"pfMode,omitempty"` + // +kubebuilder:validation:Minimum=1 // +kubebuilder:validation:Maximum=16 NumVfBundles int `json:"numVfBundles"` // +kubebuilder:validation:Minimum=1024 // +kubebuilder:validation:Maximum=1024 - MaxQueueSize int `json:"maxQueueSize"` + // +kubebuilder:default:1024 + // +kubebuilder:validation:Optional + MaxQueueSize int `json:"maxQueueSize,omitempty"` Uplink4G QueueGroupConfig `json:"uplink4G"` Downlink4G QueueGroupConfig `json:"downlink4G"` Uplink5G QueueGroupConfig `json:"uplink5G"` Downlink5G QueueGroupConfig `json:"downlink5G"` } +func (in *ACC100BBDevConfig) Validate() error { + totalQueueGroups := in.Uplink4G.NumQueueGroups + in.Downlink4G.NumQueueGroups + in.Uplink5G.NumQueueGroups + in.Downlink5G.NumQueueGroups + if totalQueueGroups > acc100maxQueueGroups { + return fmt.Errorf("total number of requested queue groups (4G/5G) %v exceeds the maximum (%d)", totalQueueGroups, acc100maxQueueGroups) + } + return nil +} + +// FFTLutParam specifies variables required to use custom fft bin file +type FFTLutParam struct { + // Path to .tar.gz SRS-FFT file + // +kubebuilder:validation:Pattern=`^((http|https)://.*\.tar\.gz)?$` + FftUrl string `json:"fftUrl"` + // SHA-1 checksum of .tar.gz SRS-FFT File + // +kubebuilder:validation:Pattern=`^([a-fA-F0-9]{40})?$` + FftChecksum string `json:"fftChecksum"` +} + +// ACC200BBDevConfig specifies variables to configure ACC200 with +type ACC200BBDevConfig struct { + ACC100BBDevConfig `json:",inline"` + QFFT QueueGroupConfig `json:"qfft"` + FFTLut FFTLutParam `json:"fftLut,omitempty"` +} + +func (in *ACC200BBDevConfig) Validate() error { + totalQueueGroups := in.Uplink4G.NumQueueGroups + in.Downlink4G.NumQueueGroups + in.Uplink5G.NumQueueGroups + in.Downlink5G.NumQueueGroups + in.QFFT.NumQueueGroups + if totalQueueGroups > acc200maxQueueGroups { + return fmt.Errorf("total number of requested queue groups (4G/5G/QFFT) %v exceeds the maximum (%d)", totalQueueGroups, acc200maxQueueGroups) + } + return nil +} + // BBDevConfig is a struct containing configuration for various FEC cards type BBDevConfig struct { N3000 *N3000BBDevConfig `json:"n3000,omitempty"` ACC100 *ACC100BBDevConfig `json:"acc100,omitempty"` + ACC200 *ACC200BBDevConfig `json:"acc200,omitempty"` +} + +type validator interface { + Validate() error +} + +func (in *BBDevConfig) Validate() error { + + for _, config := range []interface{}{in.ACC200, in.ACC100, in.N3000} { + if !isNil(config) { + if validator, ok := config.(validator); ok { + return validator.Validate() + } + } + } + + return nil } // PhysicalFunctionConfig defines a possible configuration of a single Physical Function (PF), i.e. card type PhysicalFunctionConfig struct { + // PFDriver to bound the PFs to + //+kubebuilder:validation:Pattern=`(pci-pf-stub|pci_pf_stub|igb_uio|vfio-pci)` + PFDriver string `json:"pfDriver"` + // VFDriver to bound the VFs to + VFDriver string `json:"vfDriver"` + // VFAmount is an amount of VFs to be created + // +kubebuilder:validation:Minimum=1 + VFAmount int `json:"vfAmount"` + // BBDevConfig is a config for PF's queues + BBDevConfig BBDevConfig `json:"bbDevConfig"` +} + +type PhysicalFunctionConfigExt struct { // PCIAdress is a Physical Functions's PCI address that will be configured according to this spec // +kubebuilder:validation:Pattern=`^[a-fA-F0-9]{4}:[a-fA-F0-9]{2}:[01][a-fA-F0-9]\.[0-7]$` PCIAddress string `json:"pciAddress"` + // PFDriver to bound the PFs to + //+kubebuilder:validation:Pattern=`(pci-pf-stub|pci_pf_stub|igb_uio|vfio-pci)` PFDriver string `json:"pfDriver"` + // VFDriver to bound the VFs to VFDriver string `json:"vfDriver"` + // VFAmount is an amount of VFs to be created // +kubebuilder:validation:Minimum=0 VFAmount int `json:"vfAmount"` + // BBDevConfig is a config for PF's queues BBDevConfig BBDevConfig `json:"bbDevConfig"` } -type NodeConfig struct { - // Name of the node - NodeName string `json:"nodeName"` - // List of physical functions (cards) configs - // +operator-sdk:csv:customresourcedefinitions:type=spec - PhysicalFunctions []PhysicalFunctionConfig `json:"physicalFunctions"` -} - // SriovFecClusterConfigSpec defines the desired state of SriovFecClusterConfig type SriovFecClusterConfigSpec struct { - // List of node configurations + // +operator-sdk:csv:customresourcedefinitions:type=spec - Nodes []NodeConfig `json:"nodes"` - DrainSkip bool `json:"drainSkip,omitempty"` + // Selector describes target node for this spec + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + + // +operator-sdk:csv:customresourcedefinitions:type=spec + // Selector describes target accelerator for this spec + AcceleratorSelector AcceleratorSelector `json:"acceleratorSelector,omitempty"` + + // +operator-sdk:csv:customresourcedefinitions:type=spec + // Physical function (card) config + PhysicalFunction PhysicalFunctionConfig `json:"physicalFunction"` + + // +operator-sdk:csv:customresourcedefinitions:type=spec + // Higher priority policies can override lower ones. + Priority int `json:"priority,omitempty"` + + // +operator-sdk:csv:customresourcedefinitions:type=spec + // Skips drain process when true; default false. Should be true if operator is running on SNO + DrainSkip *bool `json:"drainSkip,omitempty"` +} + +type AcceleratorSelector struct { + VendorID string `json:"vendorID,omitempty"` + DeviceID string `json:"deviceID,omitempty"` + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Pattern=`^[a-fA-F0-9]{4}:[a-fA-F0-9]{2}:[01][a-fA-F0-9]\.[0-7]$` + PCIAddress string `json:"pciAddress,omitempty"` + //+kubebuilder:validation:Pattern=`(pci-pf-stub|pci_pf_stub|igb_uio|vfio-pci)` + PFDriver string `json:"driver,omitempty"` + MaxVFs int `json:"maxVirtualFunctions,omitempty"` } // SriovFecClusterConfigStatus defines the observed state of SriovFecClusterConfig @@ -148,10 +249,11 @@ type SriovFecClusterConfigStatus struct { // +kubebuilder:object:root=true // +kubebuilder:subresource:status -// +kubebuilder:printcolumn:name="SyncStatus",type=string,JSONPath=`.status.syncStatus` -// +kubebuilder:unservedversion +// +kubebuilder:storageversion +// +kubebuilder:resource:shortName=sfcc + // SriovFecClusterConfig is the Schema for the sriovfecclusterconfigs API -// +operator-sdk:csv:customresourcedefinitions:displayName="SriovFecClusterConfig",resources={{SriovFecNodeConfig,v1,node}} +// +operator-sdk:csv:customresourcedefinitions:displayName="SriovFecClusterConfig",resources={{SriovFecNodeConfig,v2,node}} type SriovFecClusterConfig struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` diff --git a/pkg/schemes/fec/fectypes/sriovfecnodeconfig_types.go b/pkg/schemes/fec/fectypes/sriovfecnodeconfig_types.go index 632e84f0b..11eed5234 100644 --- a/pkg/schemes/fec/fectypes/sriovfecnodeconfig_types.go +++ b/pkg/schemes/fec/fectypes/sriovfecnodeconfig_types.go @@ -17,7 +17,7 @@ type SriovAccelerator struct { VendorID string `json:"vendorID"` DeviceID string `json:"deviceID"` PCIAddress string `json:"pciAddress"` - Driver string `json:"driver"` + PFDriver string `json:"driver"` MaxVFs int `json:"maxVirtualFunctions"` VFs []VF `json:"virtualFunctions"` } @@ -30,12 +30,16 @@ type NodeInventory struct { type SriovFecNodeConfigSpec struct { // List of PhysicalFunctions configs // +operator-sdk:csv:customresourcedefinitions:type=spec - PhysicalFunctions []PhysicalFunctionConfig `json:"physicalFunctions"` - DrainSkip bool `json:"drainSkip,omitempty"` + PhysicalFunctions []PhysicalFunctionConfigExt `json:"physicalFunctions"` + + // +operator-sdk:csv:customresourcedefinitions:type=spec + // Skips drain process when true; default false. Should be true if operator is running on SNO + DrainSkip bool `json:"drainSkip,omitempty"` } // SriovFecNodeConfigStatus defines the observed state of SriovFecNodeConfig type SriovFecNodeConfigStatus struct { + PfBbConfVersion string `json:"pfBbConfVersion,omitempty"` // Provides information about device update status Conditions []metav1.Condition `json:"conditions,omitempty"` // Provides information about FPGA inventory on the node @@ -46,7 +50,9 @@ type SriovFecNodeConfigStatus struct { // +kubebuilder:object:root=true // +kubebuilder:subresource:status // +kubebuilder:printcolumn:name="Configured",type=string,JSONPath=`.status.conditions[?(@.type=="Configured")].reason` -// +kubebuilder:unservedversion +// +kubebuilder:storageversion +// +kubebuilder:resource:shortName=sfnc + // SriovFecNodeConfig is the Schema for the sriovfecnodeconfigs API // +operator-sdk:csv:customresourcedefinitions:displayName="SriovFecNodeConfig",resources={{SriovFecNodeConfig,v1,node}} type SriovFecNodeConfig struct { diff --git a/pkg/schemes/fec/fectypes/zz_generated.deepcopy.go b/pkg/schemes/fec/fectypes/zz_generated.deepcopy.go index e717d77f1..3a2ab18ec 100644 --- a/pkg/schemes/fec/fectypes/zz_generated.deepcopy.go +++ b/pkg/schemes/fec/fectypes/zz_generated.deepcopy.go @@ -8,8 +8,8 @@ package fectypes import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -31,6 +31,39 @@ func (in *ACC100BBDevConfig) DeepCopy() *ACC100BBDevConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ACC200BBDevConfig) DeepCopyInto(out *ACC200BBDevConfig) { + *out = *in + out.ACC100BBDevConfig = in.ACC100BBDevConfig + out.QFFT = in.QFFT + out.FFTLut = in.FFTLut +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ACC200BBDevConfig. +func (in *ACC200BBDevConfig) DeepCopy() *ACC200BBDevConfig { + if in == nil { + return nil + } + out := new(ACC200BBDevConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AcceleratorSelector) DeepCopyInto(out *AcceleratorSelector) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AcceleratorSelector. +func (in *AcceleratorSelector) DeepCopy() *AcceleratorSelector { + if in == nil { + return nil + } + out := new(AcceleratorSelector) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BBDevConfig) DeepCopyInto(out *BBDevConfig) { *out = *in @@ -44,6 +77,11 @@ func (in *BBDevConfig) DeepCopyInto(out *BBDevConfig) { *out = new(ACC100BBDevConfig) **out = **in } + if in.ACC200 != nil { + in, out := &in.ACC200, &out.ACC200 + *out = new(ACC200BBDevConfig) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BBDevConfig. @@ -57,40 +95,54 @@ func (in *BBDevConfig) DeepCopy() *BBDevConfig { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *N3000BBDevConfig) DeepCopyInto(out *N3000BBDevConfig) { +func (in ByPriority) DeepCopyInto(out *ByPriority) { + { + in := &in + *out = make(ByPriority, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ByPriority. +func (in ByPriority) DeepCopy() ByPriority { + if in == nil { + return nil + } + out := new(ByPriority) + in.DeepCopyInto(out) + return *out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FFTLutParam) DeepCopyInto(out *FFTLutParam) { *out = *in - out.Downlink = in.Downlink - out.Uplink = in.Uplink } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new N3000BBDevConfig. -func (in *N3000BBDevConfig) DeepCopy() *N3000BBDevConfig { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FFTLutParam. +func (in *FFTLutParam) DeepCopy() *FFTLutParam { if in == nil { return nil } - out := new(N3000BBDevConfig) + out := new(FFTLutParam) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodeConfig) DeepCopyInto(out *NodeConfig) { +func (in *N3000BBDevConfig) DeepCopyInto(out *N3000BBDevConfig) { *out = *in - if in.PhysicalFunctions != nil { - in, out := &in.PhysicalFunctions, &out.PhysicalFunctions - *out = make([]PhysicalFunctionConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } + out.Downlink = in.Downlink + out.Uplink = in.Uplink } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeConfig. -func (in *NodeConfig) DeepCopy() *NodeConfig { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new N3000BBDevConfig. +func (in *N3000BBDevConfig) DeepCopy() *N3000BBDevConfig { if in == nil { return nil } - out := new(NodeConfig) + out := new(N3000BBDevConfig) in.DeepCopyInto(out) return out } @@ -133,6 +185,22 @@ func (in *PhysicalFunctionConfig) DeepCopy() *PhysicalFunctionConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PhysicalFunctionConfigExt) DeepCopyInto(out *PhysicalFunctionConfigExt) { + *out = *in + in.BBDevConfig.DeepCopyInto(&out.BBDevConfig) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PhysicalFunctionConfigExt. +func (in *PhysicalFunctionConfigExt) DeepCopy() *PhysicalFunctionConfigExt { + if in == nil { + return nil + } + out := new(PhysicalFunctionConfigExt) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *QueueGroupConfig) DeepCopyInto(out *QueueGroupConfig) { *out = *in @@ -230,13 +298,20 @@ func (in *SriovFecClusterConfigList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SriovFecClusterConfigSpec) DeepCopyInto(out *SriovFecClusterConfigSpec) { *out = *in - if in.Nodes != nil { - in, out := &in.Nodes, &out.Nodes - *out = make([]NodeConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val } } + out.AcceleratorSelector = in.AcceleratorSelector + in.PhysicalFunction.DeepCopyInto(&out.PhysicalFunction) + if in.DrainSkip != nil { + in, out := &in.DrainSkip, &out.DrainSkip + *out = new(bool) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SriovFecClusterConfigSpec. @@ -328,7 +403,7 @@ func (in *SriovFecNodeConfigSpec) DeepCopyInto(out *SriovFecNodeConfigSpec) { *out = *in if in.PhysicalFunctions != nil { in, out := &in.PhysicalFunctions, &out.PhysicalFunctions - *out = make([]PhysicalFunctionConfig, len(*in)) + *out = make([]PhysicalFunctionConfigExt, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -350,7 +425,7 @@ func (in *SriovFecNodeConfigStatus) DeepCopyInto(out *SriovFecNodeConfigStatus) *out = *in if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions - *out = make([]metav1.Condition, len(*in)) + *out = make([]v1.Condition, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) }