diff --git a/go.mod b/go.mod index acf2e705..8e0007fa 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( google.golang.org/protobuf v1.32.0 yunion.io/x/jsonutils v1.0.1-0.20240203102553-4096f103b401 yunion.io/x/log v1.0.1-0.20240305175729-7cf2d6cd5a91 - yunion.io/x/onecloud v0.0.0-20240919015453-72a70d5ec23d + yunion.io/x/onecloud v0.0.0-20241009134837-1641c178b992 yunion.io/x/pkg v1.10.1-0.20240905110705-77c46e716318 ) @@ -112,10 +112,10 @@ require ( moul.io/http2curl/v2 v2.3.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.0.1 // indirect sigs.k8s.io/yaml v1.2.0 // indirect - yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240918093803-56154aecb673 // indirect + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240929084537-95ed5a2d6298 // indirect yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 // indirect yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e // indirect - yunion.io/x/sqlchemy v1.1.3-0.20240916001724-cb6bf30b6f63 // indirect + yunion.io/x/sqlchemy v1.1.3-0.20240926163039-d41512b264e1 // indirect yunion.io/x/structarg v0.0.0-20231017124457-df4d5009457c // indirect ) diff --git a/go.sum b/go.sum index 77063a24..4ca6c7a9 100644 --- a/go.sum +++ b/go.sum @@ -768,8 +768,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240918093803-56154aecb673 h1:6su4RGh9QdZ30U8KGQ6LIqP0iGonnIsj9xRMMuDBFgA= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240918093803-56154aecb673/go.mod h1:rj/pb3DitJlQaQD8UW1oxx/KD+PzDZqoywzqRJaFE9A= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240929084537-95ed5a2d6298 h1:2pHXMA4Ik9KPyO053h4+gho0NrlxRBcLBqkQXwegsL0= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240929084537-95ed5a2d6298/go.mod h1:rj/pb3DitJlQaQD8UW1oxx/KD+PzDZqoywzqRJaFE9A= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 h1:v7POYkQwo1XzOxBoIoRVr/k0V9Y5JyjpshlIFa9raug= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/go-openvswitch v0.0.20240920 h1:imjK9g2EZ3IzBdNZ3UEYobJJYw6bQCvUvgoTOIyis1o= @@ -781,15 +781,15 @@ yunion.io/x/log v0.0.0-20190514041436-04ce53b17c6b/go.mod h1:+gauLs73omeJAPlsXce yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d/go.mod h1:LC6f/4FozL0iaAbnFt2eDX9jlsyo3WiOUPm03d7+U4U= yunion.io/x/log v1.0.1-0.20240305175729-7cf2d6cd5a91 h1:inY5o3LDa/zgsIZuPN0HmpzKIsu/lLgsBmMttuDPGj4= yunion.io/x/log v1.0.1-0.20240305175729-7cf2d6cd5a91/go.mod h1:LC6f/4FozL0iaAbnFt2eDX9jlsyo3WiOUPm03d7+U4U= -yunion.io/x/onecloud v0.0.0-20240919015453-72a70d5ec23d h1:K4TvwllUXAqZtwhqoRL2MvO7PICes/WWJB2G9B32oCE= -yunion.io/x/onecloud v0.0.0-20240919015453-72a70d5ec23d/go.mod h1:N0VtT3SbJEyci5NaEprv+pbO/VhSXF4Pn+6rIauYihc= +yunion.io/x/onecloud v0.0.0-20241009134837-1641c178b992 h1:vlZURHfWdi9WN1uov0Rqr0VSmLWWC3Z5mBLQ3/iU1v4= +yunion.io/x/onecloud v0.0.0-20241009134837-1641c178b992/go.mod h1:u8+DsnUsFAu/gQWGNcVttMX8xDeWBmo3yttn6P1PMlY= yunion.io/x/pkg v0.0.0-20190620104149-945c25821dbf/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= yunion.io/x/pkg v0.0.0-20190628082551-f4033ba2ea30/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= yunion.io/x/pkg v1.10.1-0.20240905110705-77c46e716318 h1:Fm7I8ypXHxeObY4u/VUGz78NsambemzTZ9fECyGKNi8= yunion.io/x/pkg v1.10.1-0.20240905110705-77c46e716318/go.mod h1:0Bwxqd9MA3ACi119/l02FprY/o9gHahmYC2bsSbnVpM= yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e h1:v+EzIadodSwkdZ/7bremd7J8J50Cise/HCylsOJngmo= yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e/go.mod h1:0iFKpOs1y4lbCxeOmq3Xx/0AcQoewVPwj62eRluioEo= -yunion.io/x/sqlchemy v1.1.3-0.20240916001724-cb6bf30b6f63 h1:55d4elb3Jy4VuQ8QpsgC8R/FmEZkGSHiarAJbZqGHE0= -yunion.io/x/sqlchemy v1.1.3-0.20240916001724-cb6bf30b6f63/go.mod h1:5W8ghvJ4TNt/r2yDjjD3i4QsZgIiJX45dhRQBGWPHsQ= +yunion.io/x/sqlchemy v1.1.3-0.20240926163039-d41512b264e1 h1:HWPqY1I5JSmM6Sks6FyK9hnq/MjL7FDghM6M8DXHob0= +yunion.io/x/sqlchemy v1.1.3-0.20240926163039-d41512b264e1/go.mod h1:vCIZpqhZ5Jzaq3tFyrti/vv8BijQKtkzSgNT/uH4H5A= yunion.io/x/structarg v0.0.0-20231017124457-df4d5009457c h1:QuLab2kSRECZRxo4Lo2KcYn6XjQFDGaZ1+x0pYDVVwQ= yunion.io/x/structarg v0.0.0-20231017124457-df4d5009457c/go.mod h1:EP6NSv2C0zzqBDTKumv8hPWLb3XvgMZDHQRfyuOrQng= diff --git a/vendor/modules.txt b/vendor/modules.txt index 10c6fa80..3449c595 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -694,7 +694,7 @@ sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.2.0 ## explicit; go 1.12 sigs.k8s.io/yaml -# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240918093803-56154aecb673 +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240929084537-95ed5a2d6298 ## explicit; go 1.21 yunion.io/x/cloudmux/pkg/apis yunion.io/x/cloudmux/pkg/apis/billing @@ -715,7 +715,7 @@ yunion.io/x/jsonutils ## explicit; go 1.12 yunion.io/x/log yunion.io/x/log/hooks -# yunion.io/x/onecloud v0.0.0-20240919015453-72a70d5ec23d +# yunion.io/x/onecloud v0.0.0-20241009134837-1641c178b992 ## explicit; go 1.21 yunion.io/x/onecloud/locales yunion.io/x/onecloud/pkg/apihelper @@ -885,7 +885,7 @@ yunion.io/x/pkg/utils # yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e ## explicit; go 1.12 yunion.io/x/s3cli -# yunion.io/x/sqlchemy v1.1.3-0.20240916001724-cb6bf30b6f63 +# yunion.io/x/sqlchemy v1.1.3-0.20240926163039-d41512b264e1 ## explicit; go 1.17 yunion.io/x/sqlchemy yunion.io/x/sqlchemy/backends/clickhouse diff --git a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/waf.go b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/waf.go index 2f01b4bd..b3c9f96a 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/waf.go +++ b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/waf.go @@ -159,7 +159,7 @@ type SWafStatement struct { // 是否取反操作, 仅对Azure生效 Negation bool `nullable:"false" list:"user"` // 操作类型 - // enum: EQ, NE, LE, LT, GE, GT + // enum: ["EQ", "NE", "LE", "LT", "GE", "GT"] Operator TWafOperator `width:"20" charset:"ascii" nullable:"false" list:"user"` // 匹配字段 // enmu: Body, JsonBody, Query, Method, Header, UriPath, PostArgs, Cookie diff --git a/vendor/yunion.io/x/onecloud/pkg/apis/compute/cloudaccount.go b/vendor/yunion.io/x/onecloud/pkg/apis/compute/cloudaccount.go index da43216c..5cba5da9 100644 --- a/vendor/yunion.io/x/onecloud/pkg/apis/compute/cloudaccount.go +++ b/vendor/yunion.io/x/onecloud/pkg/apis/compute/cloudaccount.go @@ -97,25 +97,25 @@ type CloudenvResourceListInput struct { // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - PublicCloud bool `json:"public_cloud"` + PublicCloud *bool `json:"public_cloud"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - IsPublic bool `json:"is_public"` + IsPublic *bool `json:"is_public"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - PrivateCloud bool `json:"private_cloud"` + PrivateCloud *bool `json:"private_cloud"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - IsPrivate bool `json:"is_private"` + IsPrivate *bool `json:"is_private"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - IsOnPremise bool `json:"is_on_premise"` + IsOnPremise *bool `json:"is_on_premise"` // 以平台名称排序 // pattern:asc|desc diff --git a/vendor/yunion.io/x/onecloud/pkg/apis/compute/cloudprovider.go b/vendor/yunion.io/x/onecloud/pkg/apis/compute/cloudprovider.go index 8bc9e5f6..74f9966f 100644 --- a/vendor/yunion.io/x/onecloud/pkg/apis/compute/cloudprovider.go +++ b/vendor/yunion.io/x/onecloud/pkg/apis/compute/cloudprovider.go @@ -221,11 +221,11 @@ func (input *ManagedResourceListInput) AfterUnmarshal() { if len(input.CloudEnv) > 0 { return } - if input.PublicCloud || input.IsPublic { + if (input.PublicCloud != nil && *input.PublicCloud) || (input.IsPublic != nil && *input.IsPublic) { input.CloudEnv = CLOUD_ENV_PUBLIC_CLOUD - } else if input.PrivateCloud || input.IsPrivate { + } else if (input.PrivateCloud != nil && *input.PrivateCloud) || (input.IsPrivate != nil && *input.IsPrivate) { input.CloudEnv = CLOUD_ENV_PRIVATE_CLOUD - } else if input.IsOnPremise { + } else if input.IsOnPremise != nil && *input.IsOnPremise { input.CloudEnv = CLOUD_ENV_ON_PREMISE } } diff --git a/vendor/yunion.io/x/onecloud/pkg/compute/models/cloudproviders.go b/vendor/yunion.io/x/onecloud/pkg/compute/models/cloudproviders.go index cfca2863..50a6523b 100644 --- a/vendor/yunion.io/x/onecloud/pkg/compute/models/cloudproviders.go +++ b/vendor/yunion.io/x/onecloud/pkg/compute/models/cloudproviders.go @@ -1275,13 +1275,20 @@ func (manager *SCloudproviderManager) ListItemFilter( var region *SCloudregion if len(query.ZoneId) > 0 { - _, err := validators.ValidateModel(ctx, userCred, ZoneManager, &query.ZoneId) + zoneObj, err := validators.ValidateModel(ctx, userCred, ZoneManager, &query.ZoneId) if err != nil { return nil, err } - vpcs := VpcManager.Query("manager_id").Distinct() - wires := WireManager.Query().Equals("zone_id", query.ZoneId).SubQuery() - vpcs = vpcs.Join(wires, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) + zone = zoneObj.(*SZone) + region, err = zone.GetRegion() + if err != nil { + return nil, err + } + vpcs := VpcManager.Query("manager_id").Equals("cloudregion_id", region.Id).Distinct() + if !utils.IsInStringArray(region.Provider, api.REGIONAL_NETWORK_PROVIDERS) { + wires := WireManager.Query().Equals("zone_id", query.ZoneId).SubQuery() + vpcs = vpcs.Join(wires, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) + } wireManager := WireManager.Query("manager_id").Equals("zone_id", query.ZoneId).Distinct().SubQuery() q = q.Filter( sqlchemy.OR( diff --git a/vendor/yunion.io/x/onecloud/pkg/compute/models/guest_actions.go b/vendor/yunion.io/x/onecloud/pkg/compute/models/guest_actions.go index 342f50ba..48d9bbef 100644 --- a/vendor/yunion.io/x/onecloud/pkg/compute/models/guest_actions.go +++ b/vendor/yunion.io/x/onecloud/pkg/compute/models/guest_actions.go @@ -1476,7 +1476,10 @@ func (self *SGuest) StartGueststartTask( if self.CpuNumaPin != nil { // clean cpu numa pin - self.SetCpuNumaPin(ctx, userCred, nil, nil) + err := self.SetCpuNumaPin(ctx, userCred, nil, nil) + if err != nil { + return errors.Wrap(err, "clean cpu numa pin") + } } if schedStart { @@ -1509,6 +1512,18 @@ func (self *SGuest) GuestNonSchedStartTask( if self.BackupHostId != "" { taskName = "HAGuestStartTask" } + if self.CpuNumaPin != nil { + srcSchedCpuNumaPin := make([]schedapi.SCpuNumaPin, 0) + err := self.CpuNumaPin.Unmarshal(&srcSchedCpuNumaPin) + if err != nil { + return errors.Wrap(err, "unmarshal cpu_numa_pin") + } + // set cpu numa pin + err = self.SetCpuNumaPin(ctx, userCred, srcSchedCpuNumaPin, nil) + if err != nil { + return nil + } + } task, err := taskman.TaskManager.NewTask(ctx, taskName, self, userCred, data, parentTaskId, "", nil) if err != nil { return err diff --git a/vendor/yunion.io/x/onecloud/pkg/compute/models/guests.go b/vendor/yunion.io/x/onecloud/pkg/compute/models/guests.go index da608a1e..3c1629f4 100644 --- a/vendor/yunion.io/x/onecloud/pkg/compute/models/guests.go +++ b/vendor/yunion.io/x/onecloud/pkg/compute/models/guests.go @@ -1295,11 +1295,14 @@ func (guest *SGuest) SetCpuNumaPin( SizeMB: schedCpuNumaPin[i].MemSizeMB, NodeId: schedCpuNumaPin[i].NodeId, } - cpuNumaPin[i].VcpuPin = make([]api.SVCpuPin, len(schedCpuNumaPin[i].CpuPin)) - for j := range schedCpuNumaPin[i].CpuPin { - cpuNumaPin[i].VcpuPin[j].Pcpu = schedCpuNumaPin[i].CpuPin[j] - cpuNumaPin[i].VcpuPin[j].Vcpu = vcpuId - vcpuId += 1 + + if len(schedCpuNumaPin[i].CpuPin) > 0 { + cpuNumaPin[i].VcpuPin = make([]api.SVCpuPin, len(schedCpuNumaPin[i].CpuPin)) + for j := range schedCpuNumaPin[i].CpuPin { + cpuNumaPin[i].VcpuPin[j].Pcpu = schedCpuNumaPin[i].CpuPin[j] + cpuNumaPin[i].VcpuPin[j].Vcpu = vcpuId + vcpuId += 1 + } } } } diff --git a/vendor/yunion.io/x/onecloud/pkg/compute/models/isolated_devices.go b/vendor/yunion.io/x/onecloud/pkg/compute/models/isolated_devices.go index 30284e4e..1fbf6192 100644 --- a/vendor/yunion.io/x/onecloud/pkg/compute/models/isolated_devices.go +++ b/vendor/yunion.io/x/onecloud/pkg/compute/models/isolated_devices.go @@ -474,7 +474,7 @@ func (manager *SIsolatedDeviceManager) parseDeviceInfo(userCred mcclient.TokenCr if len(devId) == 0 { if matchDev == nil { - return nil, fmt.Errorf("Isolated device info not contains either deviceID or model name") + return nil, httperrors.NewNotFoundError("Not found matched device by model: %q, dev_type: %q", devConfig.Model, devConfig.DevType) } devConfig.Model = matchDev.Model if len(devVendor) > 0 { diff --git a/vendor/yunion.io/x/onecloud/pkg/hostman/isolated_device/gpu.go b/vendor/yunion.io/x/onecloud/pkg/hostman/isolated_device/gpu.go index 0826a7e5..8a82a8d8 100644 --- a/vendor/yunion.io/x/onecloud/pkg/hostman/isolated_device/gpu.go +++ b/vendor/yunion.io/x/onecloud/pkg/hostman/isolated_device/gpu.go @@ -92,6 +92,18 @@ func getPassthroughGPUs(filteredAddrs []string, enableWhitelist bool, whitelistM if utils.IsInStringArray(dev.Addr, filteredAddrs) { continue } + if o.HostOptions.BootVgaPciAddr != "" { + if dev.Addr == o.HostOptions.BootVgaPciAddr && !o.HostOptions.UseBootVga { + continue + } + } else { + if ok, err := dev.IsBootVGA(); err != nil { + return nil, err, nil + } else if ok && !o.HostOptions.UseBootVga { + continue + } + } + if !utils.IsInArray(dev.ClassCode, GpuClassCodes) { continue } @@ -119,7 +131,7 @@ func getPassthroughGPUs(filteredAddrs []string, enableWhitelist bool, whitelistM continue } - if err := dev.forceBindVFIOPCIDriver(); err != nil { + if err := dev.forceBindVFIOPCIDriver(o.HostOptions.UseBootVga, o.HostOptions.BootVgaPciAddr); err != nil { warns = append(warns, errors.Wrapf(err, "force bind vfio-pci driver %s", dev.Addr)) continue } @@ -210,7 +222,7 @@ func NewPCIDevice(addr string, executors ...IExecutor) (*PCIDevice, error) { if err := dev.checkSameIOMMUGroupDevice(); err != nil { return nil, err } - if err := dev.forceBindVFIOPCIDriver(); err != nil { + if err := dev.forceBindVFIOPCIDriver(o.HostOptions.UseBootVga, o.HostOptions.BootVgaPciAddr); err != nil { return nil, fmt.Errorf("Force bind vfio-pci driver: %v", err) } return dev, nil @@ -391,10 +403,32 @@ func (d *PCIDevice) IsBootVGA() (bool, error) { return false, nil } -func (d *PCIDevice) forceBindVFIOPCIDriver() error { - if !utils.IsInArray(d.ClassCode, GpuClassCodes) { +func (d *PCIDevice) forceBindVFIOPCIDriver(useBootVGA bool, bootVgaPciAddr string) error { + if !utils.IsInStringArray(d.ClassCode, []string{CLASS_CODE_VGA, CLASS_CODE_3D}) { return nil } + + if !useBootVGA && bootVgaPciAddr != "" { + if d.Addr == bootVgaPciAddr { + log.Infof("device %#v is specific boot vga addr, skip it", d) + return nil + } + } else { + isBootVGA, err := d.IsBootVGA() + if err != nil { + return err + } + if !useBootVGA && isBootVGA { + log.Infof("%#v is boot vga card, skip it", d) + return nil + } + } + + if d.IsVFIOPCIDriverUsed() { + log.Infof("%s already use vfio-pci driver", d) + return nil + } + devs := []*PCIDevice{} devs = append(devs, d.RestIOMMUGroupDevs...) devs = append(devs, d) diff --git a/vendor/yunion.io/x/onecloud/pkg/hostman/metadata/metadatahandler.go b/vendor/yunion.io/x/onecloud/pkg/hostman/metadata/metadatahandler.go index 69ec5e6c..32ee08fb 100644 --- a/vendor/yunion.io/x/onecloud/pkg/hostman/metadata/metadatahandler.go +++ b/vendor/yunion.io/x/onecloud/pkg/hostman/metadata/metadatahandler.go @@ -135,7 +135,10 @@ func (s *Service) metaData(ctx context.Context, w http.ResponseWriter, r *http.R "ami-launch-index", "block-device-mapping/", "hostname", "instance-id", "instance-type", - "local-hostname", "local-ipv4", "mac", + "local-hostname", + "local-ipv4", + "local-ipv6", + "mac", "public-hostname", "public-ipv4", "network_config/", "local-sub-ipv4s", @@ -173,9 +176,12 @@ func (s *Service) metaData(ctx context.Context, w http.ResponseWriter, r *http.R return } } - case "hostname", "public-hostname", "local-hostname": + case "hostname": hostutils.Response(ctx, w, guestDesc.Name) return + case "public-hostname", "local-hostname": + hostutils.Response(ctx, w, guestDesc.Hostname) + return case "instance-id": hostutils.Response(ctx, w, guestDesc.Uuid) return @@ -202,6 +208,16 @@ func (s *Service) metaData(ctx context.Context, w http.ResponseWriter, r *http.R } hostutils.Response(ctx, w, strings.Join(ips, "\n")) return + case "local-ipv6": + ips := make([]string, 0) + guestNics := guestDesc.Nics + for _, nic := range guestNics { + if len(nic.Ip6) > 0 { + ips = append(ips, nic.Ip6) + } + } + hostutils.Response(ctx, w, strings.Join(ips, "\n")) + return case "local-sub-ipv4s": ips := make([]string, 0) guestNics := guestDesc.Nics diff --git a/vendor/yunion.io/x/onecloud/pkg/hostman/options/options.go b/vendor/yunion.io/x/onecloud/pkg/hostman/options/options.go index 91939c88..b5ffd828 100644 --- a/vendor/yunion.io/x/onecloud/pkg/hostman/options/options.go +++ b/vendor/yunion.io/x/onecloud/pkg/hostman/options/options.go @@ -132,9 +132,10 @@ type SHostOptions struct { SetVncPassword bool `default:"true" help:"Auto set vnc password after monitor connected"` UseBootVga bool `default:"false" help:"Use boot VGA GPU for guest"` - EnableHostAgentNumaAllocate bool `default:"false" help:"Enable host agent numa allocate"` - EnableCpuBinding bool `default:"true" help:"Enable cpu binding and rebalance"` - EnableOpenflowController bool `default:"false"` + EnableHostAgentNumaAllocate bool `default:"false" help:"Enable host agent numa allocate"` + EnableCpuBinding bool `default:"true" help:"Enable cpu binding and rebalance"` + EnableOpenflowController bool `default:"false"` + BootVgaPciAddr string `help:"Specific boot vga pci addr incase detect wrong device"` PingRegionInterval int `default:"60" help:"interval to ping region, deefault is 1 minute"` LogSystemdUnits []string `help:"Systemd units log collected by fluent-bit"`