diff --git a/src/go/k8s/cmd/configurator/main.go b/src/go/k8s/cmd/configurator/main.go index 2980fe2465a3..75d7ee1ee2fc 100644 --- a/src/go/k8s/cmd/configurator/main.go +++ b/src/go/k8s/cmd/configurator/main.go @@ -129,7 +129,7 @@ func main() { } } - cfg.Redpanda.Id = int(hostIndex) + cfg.Redpanda.ID = int(hostIndex) // First Redpanda node need to have cleared seed servers in order // to form raft group 0 @@ -154,12 +154,12 @@ func main() { var errInternalPortMissing = errors.New("port configration is missing internal port") func getInternalKafkaAPIPort(cfg *config.Config) (int, error) { - for _, l := range cfg.Redpanda.KafkaApi { + for _, l := range cfg.Redpanda.KafkaAPI { if l.Name == "kafka" { return l.Port, nil } } - return 0, fmt.Errorf("%w %v", errInternalPortMissing, cfg.Redpanda.KafkaApi) + return 0, fmt.Errorf("%w %v", errInternalPortMissing, cfg.Redpanda.KafkaAPI) } func getInternalProxyAPIPort(cfg *config.Config) int { @@ -192,7 +192,7 @@ func getNode(nodeName string) (*corev1.Node, error) { func registerAdvertisedKafkaAPI( c *configuratorConfig, cfg *config.Config, index brokerID, kafkaAPIPort int, ) error { - cfg.Redpanda.AdvertisedKafkaApi = []config.NamedSocketAddress{ + cfg.Redpanda.AdvertisedKafkaAPI = []config.NamedSocketAddress{ { SocketAddress: config.SocketAddress{ Address: c.hostName + "." + c.svcFQDN, @@ -207,7 +207,7 @@ func registerAdvertisedKafkaAPI( } if len(c.subdomain) > 0 { - cfg.Redpanda.AdvertisedKafkaApi = append(cfg.Redpanda.AdvertisedKafkaApi, config.NamedSocketAddress{ + cfg.Redpanda.AdvertisedKafkaAPI = append(cfg.Redpanda.AdvertisedKafkaAPI, config.NamedSocketAddress{ SocketAddress: config.SocketAddress{ Address: fmt.Sprintf("%d.%s", index, c.subdomain), Port: c.hostPort, @@ -222,7 +222,7 @@ func registerAdvertisedKafkaAPI( return fmt.Errorf("unable to retrieve node: %w", err) } - cfg.Redpanda.AdvertisedKafkaApi = append(cfg.Redpanda.AdvertisedKafkaApi, config.NamedSocketAddress{ + cfg.Redpanda.AdvertisedKafkaAPI = append(cfg.Redpanda.AdvertisedKafkaAPI, config.NamedSocketAddress{ SocketAddress: config.SocketAddress{ Address: networking.GetPreferredAddress(node, c.externalConnectivityAddressType), Port: c.hostPort, diff --git a/src/go/k8s/controllers/redpanda/cluster_controller_configuration.go b/src/go/k8s/controllers/redpanda/cluster_controller_configuration.go index 41a52e70aa29..cef2b9e051a9 100644 --- a/src/go/k8s/controllers/redpanda/cluster_controller_configuration.go +++ b/src/go/k8s/controllers/redpanda/cluster_controller_configuration.go @@ -361,7 +361,7 @@ func mapStatusToCondition( Type: redpandav1alpha1.ClusterConfiguredConditionType, Status: corev1.ConditionFalse, Reason: redpandav1alpha1.ClusterConfiguredReasonUpdating, - Message: fmt.Sprintf("Node %d needs restart", nodeStatus.NodeId), + Message: fmt.Sprintf("Node %d needs restart", nodeStatus.NodeID), } } else if configVersion != 0 && nodeStatus.ConfigVersion != configVersion { condition = &redpandav1alpha1.ClusterCondition{ @@ -399,7 +399,7 @@ func needsRestart(clusterStatus admin.ConfigStatusResponse) bool { func tryMapErrorToCondition( err error, ) (*redpandav1alpha1.ClusterCondition, error) { - var httpErr *admin.HttpError + var httpErr *admin.HTTPError if errors.As(err, &httpErr) { if httpErr.Response != nil && httpErr.Response.StatusCode == http.StatusBadRequest { return &redpandav1alpha1.ClusterCondition{ diff --git a/src/go/k8s/controllers/redpanda/suite_test.go b/src/go/k8s/controllers/redpanda/suite_test.go index 37ef28b9b2b5..ae5b77e14022 100644 --- a/src/go/k8s/controllers/redpanda/suite_test.go +++ b/src/go/k8s/controllers/redpanda/suite_test.go @@ -235,9 +235,9 @@ func (m *mockAdminAPI) PatchClusterConfig( } invalidRequest := len(newInvalid)+len(newUnknown) > 0 if m.directValidation && invalidRequest { - return admin.ClusterConfigWriteResult{}, &admin.HttpError{ + return admin.ClusterConfigWriteResult{}, &admin.HTTPError{ Method: http.MethodPut, - Url: "/v1/cluster_config", + URL: "/v1/cluster_config", Response: &http.Response{ Status: "Bad Request", StatusCode: 400, diff --git a/src/go/k8s/pkg/resources/configmap.go b/src/go/k8s/pkg/resources/configmap.go index a190c6c1b362..79404024c5ac 100644 --- a/src/go/k8s/pkg/resources/configmap.go +++ b/src/go/k8s/pkg/resources/configmap.go @@ -237,8 +237,8 @@ func (r *ConfigMapResource) CreateConfiguration( cr := &cfg.NodeConfiguration.Redpanda internalListener := r.pandaCluster.InternalListener() - cr.KafkaApi = []config.NamedSocketAddress{} // we don't want to inherit default kafka port - cr.KafkaApi = append(cr.KafkaApi, config.NamedSocketAddress{ + cr.KafkaAPI = []config.NamedSocketAddress{} // we don't want to inherit default kafka port + cr.KafkaAPI = append(cr.KafkaAPI, config.NamedSocketAddress{ SocketAddress: config.SocketAddress{ Address: "0.0.0.0", Port: internalListener.Port, @@ -247,7 +247,7 @@ func (r *ConfigMapResource) CreateConfiguration( }) if r.pandaCluster.ExternalListener() != nil { - cr.KafkaApi = append(cr.KafkaApi, config.NamedSocketAddress{ + cr.KafkaAPI = append(cr.KafkaAPI, config.NamedSocketAddress{ SocketAddress: config.SocketAddress{ Address: "0.0.0.0", Port: calculateExternalPort(internalListener.Port, r.pandaCluster.ExternalListener().Port), @@ -262,17 +262,17 @@ func (r *ConfigMapResource) CreateConfiguration( Port: clusterCRPortOrRPKDefault(c.RPCServer.Port, cr.RPCServer.Port), } - cr.AdminApi[0].Port = clusterCRPortOrRPKDefault(r.pandaCluster.AdminAPIInternal().Port, cr.AdminApi[0].Port) - cr.AdminApi[0].Name = AdminPortName + cr.AdminAPI[0].Port = clusterCRPortOrRPKDefault(r.pandaCluster.AdminAPIInternal().Port, cr.AdminAPI[0].Port) + cr.AdminAPI[0].Name = AdminPortName if r.pandaCluster.AdminAPIExternal() != nil { externalAdminAPI := config.NamedSocketAddress{ SocketAddress: config.SocketAddress{ - Address: cr.AdminApi[0].Address, - Port: cr.AdminApi[0].Port + 1, + Address: cr.AdminAPI[0].Address, + Port: cr.AdminAPI[0].Port + 1, }, Name: AdminPortExternalName, } - cr.AdminApi = append(cr.AdminApi, externalAdminAPI) + cr.AdminAPI = append(cr.AdminAPI, externalAdminAPI) } cr.DeveloperMode = c.DeveloperMode @@ -295,7 +295,7 @@ func (r *ConfigMapResource) CreateConfiguration( if tlsListener.TLS.RequireClientAuth { tls.TruststoreFile = fmt.Sprintf("%s/%s", tlsKafkaAPIDirCA, cmetav1.TLSCAKey) } - cr.KafkaApiTLS = []config.ServerTLS{ + cr.KafkaAPITLS = []config.ServerTLS{ tls, } } @@ -317,7 +317,7 @@ func (r *ConfigMapResource) CreateConfiguration( if adminAPITLSListener.TLS.RequireClientAuth { adminTLS.TruststoreFile = fmt.Sprintf("%s/%s", tlsAdminAPIDirCA, cmetav1.TLSCAKey) } - cr.AdminApiTLS = append(cr.AdminApiTLS, adminTLS) + cr.AdminAPITLS = append(cr.AdminAPITLS, adminTLS) } if r.pandaCluster.Spec.CloudStorage.Enabled { diff --git a/src/go/k8s/pkg/resources/configuration/configuration_test.go b/src/go/k8s/pkg/resources/configuration/configuration_test.go index 5601fd2e84c3..3f00415f4721 100644 --- a/src/go/k8s/pkg/resources/configuration/configuration_test.go +++ b/src/go/k8s/pkg/resources/configuration/configuration_test.go @@ -47,20 +47,20 @@ func TestFlatProperties(t *testing.T) { err := config.SetAdditionalFlatProperties(map[string]string{"redpanda.a": "b", "node_uuid": "uuid"}) require.NoError(t, err) assert.Equal(t, "b", config.ClusterConfiguration["a"]) - assert.Equal(t, "uuid", config.NodeConfiguration.NodeUuid) + assert.Equal(t, "uuid", config.NodeConfiguration.NodeUUID) assert.NotContains(t, config.NodeConfiguration.Redpanda.Other, "a") config = configuration.GlobalConfiguration{Mode: configuration.GlobalConfigurationModeClassic} err = config.SetAdditionalFlatProperties(map[string]string{"redpanda.a": "b", "node_uuid": "uuid"}) require.NoError(t, err) - assert.Equal(t, "uuid", config.NodeConfiguration.NodeUuid) + assert.Equal(t, "uuid", config.NodeConfiguration.NodeUUID) assert.Equal(t, "b", config.NodeConfiguration.Redpanda.Other["a"]) assert.NotContains(t, config.ClusterConfiguration, "a") config = configuration.GlobalConfiguration{Mode: configuration.GlobalConfigurationModeMixed} err = config.SetAdditionalFlatProperties(map[string]string{"redpanda.a": "b", "node_uuid": "uuid"}) require.NoError(t, err) - assert.Equal(t, "uuid", config.NodeConfiguration.NodeUuid) + assert.Equal(t, "uuid", config.NodeConfiguration.NodeUUID) assert.Equal(t, "b", config.NodeConfiguration.Redpanda.Other["a"]) assert.Equal(t, "b", config.ClusterConfiguration["a"]) } diff --git a/src/go/k8s/pkg/resources/configuration/serialization_test.go b/src/go/k8s/pkg/resources/configuration/serialization_test.go index 40b6d99b0deb..9e0032c03e3f 100644 --- a/src/go/k8s/pkg/resources/configuration/serialization_test.go +++ b/src/go/k8s/pkg/resources/configuration/serialization_test.go @@ -21,7 +21,7 @@ import ( func TestSerde(t *testing.T) { conf := configuration.GlobalConfiguration{ NodeConfiguration: config.Config{ - NodeUuid: "uuid", + NodeUUID: "uuid", }, ClusterConfiguration: map[string]interface{}{ "a": "b", @@ -33,7 +33,7 @@ func TestSerde(t *testing.T) { conf2, err := ser.Deserialize(configuration.GlobalConfigurationModeCentralized) require.NoError(t, err) require.NotNil(t, conf2) - assert.Equal(t, "uuid", conf2.NodeConfiguration.NodeUuid) + assert.Equal(t, "uuid", conf2.NodeConfiguration.NodeUUID) assert.Equal(t, "b", conf2.ClusterConfiguration["a"]) ser2, err := conf.Serialize() require.NoError(t, err) diff --git a/src/go/rpk/.golangci.yml b/src/go/rpk/.golangci.yml index fb7d72f24dbd..8a999769af58 100644 --- a/src/go/rpk/.golangci.yml +++ b/src/go/rpk/.golangci.yml @@ -1,7 +1,104 @@ run: allow-parallel-runners: true +# golangci-lint by default ignores some staticcheck and vet raised issues that +# are actually important to catch. The following ensures that we do not ignore +# those tools ever. +issues: + exclude-use-default: false + +# We opt out of all suggested linters and manually pick what we want. +# Please do not use enable-all. linters: disable-all: true enable: + # Enabled by default linters: + - deadcode - gosimple + - govet + - ineffassign + - staticcheck + - structcheck + - typecheck + - unused + - varcheck + # Disabled by default + - asciicheck + - bidichk + - bodyclose + - contextcheck + - durationcheck + - errname + - errorlint + - exportloopref + - godot + - goprintffuncname + - misspell + - nilerr + - noctx + - nolintlint + - revive + - tenv + - unconvert + - wastedassign + +linters-settings: + # We do not want to enforce every usage of fmt.Errorf to use %w. + errorlint: + errorf: false + + # If we want to opt out of a lint, we require an explanation. + nolintlint: + allow-leading-space: true + allow-unused: false + require-explanation: true + require-specific: true + + # Revive is yet another metalinter with a lot of useful lints. + # The below opts in to all the ones we would like to use. + revive: + ignore-generated-header: true + severity: warning + confidence: 0.8 + error-code: 0 + warning-code: 0 + rules: + - name: atomic + - name: blank-imports + - name: bool-literal-in-expr + - name: call-to-gc + - name: confusing-results + - name: constant-logical-expr + - name: context-as-argument + - name: context-keys-type + - name: defer + - name: dot-imports + - name: duplicated-imports + - name: early-return + - name: error-naming + - name: error-return + - name: error-strings + - name: errorf + - name: get-return + - name: identical-branches + - name: if-return + - name: modifies-value-receiver + - name: optimize-operands-order + - name: package-comments + - name: range + - name: range-val-in-closure + - name: receiver-naming + - name: string-of-int + - name: struct-tag + - name: superfluous-else + - name: time-equal + - name: time-naming + - name: unconditional-recursion + - name: unnecessary-stmt + - name: unreachable-code + - name: unused-parameter + - name: unused-receiver + - name: useless-break + - name: var-declaration + - name: var-naming + - name: waitgroup-by-value diff --git a/src/go/rpk/pkg/api/admin/admin.go b/src/go/rpk/pkg/api/admin/admin.go index b6c370763ef7..ce440b0e0640 100644 --- a/src/go/rpk/pkg/api/admin/admin.go +++ b/src/go/rpk/pkg/api/admin/admin.go @@ -33,12 +33,12 @@ import ( "github.com/spf13/afero" ) -// ErrNoAdminAPILeader happen when there's no leader for the Admin API +// ErrNoAdminAPILeader happen when there's no leader for the Admin API. var ErrNoAdminAPILeader = errors.New("no Admin API leader found") -type HttpError struct { +type HTTPError struct { Method string - Url string + URL string Response *http.Response Body []byte } @@ -57,8 +57,8 @@ type GenericErrorBody struct { // AdminAPI is a client to interact with Redpanda's admin server. type AdminAPI struct { urls []string - brokerIdToUrlsMutex sync.Mutex - brokerIdToUrls map[int]string + brokerIDToUrlsMutex sync.Mutex + brokerIDToUrls map[int]string retryClient *pester.Client oneshotClient *http.Client basicCredentials BasicCredentials @@ -66,8 +66,8 @@ type AdminAPI struct { } func getBasicCredentials(cfg *config.Config) BasicCredentials { - if cfg.Rpk.KafkaApi.SASL != nil { - return BasicCredentials{Username: cfg.Rpk.KafkaApi.SASL.User, Password: cfg.Rpk.KafkaApi.SASL.Password} + if cfg.Rpk.KafkaAPI.SASL != nil { + return BasicCredentials{Username: cfg.Rpk.KafkaAPI.SASL.User, Password: cfg.Rpk.KafkaAPI.SASL.Password} } else { return BasicCredentials{Username: "", Password: ""} } @@ -76,7 +76,7 @@ func getBasicCredentials(cfg *config.Config) BasicCredentials { // NewClient returns an AdminAPI client that talks to each of the addresses in // the rpk.admin_api section of the config. func NewClient(fs afero.Fs, cfg *config.Config) (*AdminAPI, error) { - a := &cfg.Rpk.AdminApi + a := &cfg.Rpk.AdminAPI addrs := a.Addresses tc, err := a.TLS.Config(fs) if err != nil { @@ -95,7 +95,7 @@ func NewHostClient( return nil, errors.New("invalid empty admin host") } - a := &cfg.Rpk.AdminApi + a := &cfg.Rpk.AdminAPI addrs := a.Addresses tc, err := a.TLS.Config(fs) if err != nil { @@ -164,7 +164,7 @@ func newAdminAPI( oneshotClient: &http.Client{Timeout: 10 * time.Second}, basicCredentials: creds, tlsConfig: tlsConfig, - brokerIdToUrls: make(map[int]string), + brokerIDToUrls: make(map[int]string), } if tlsConfig != nil { a.retryClient.Transport = &http.Transport{TLSClientConfig: tlsConfig} @@ -221,9 +221,9 @@ func (a *AdminAPI) mapBrokerIDsToURLs() { if err != nil { return err } - a.brokerIdToUrlsMutex.Lock() - a.brokerIdToUrls[nc.NodeID] = aa.urls[0] - a.brokerIdToUrlsMutex.Unlock() + a.brokerIDToUrlsMutex.Lock() + a.brokerIDToUrls[nc.NodeID] = aa.urls[0] + a.brokerIDToUrlsMutex.Unlock() return nil }) if err != nil { @@ -231,7 +231,7 @@ func (a *AdminAPI) mapBrokerIDsToURLs() { } } -// GetLeaderID returns the broker ID of the leader of the Admin API +// GetLeaderID returns the broker ID of the leader of the Admin API. func (a *AdminAPI) GetLeaderID() (*int, error) { pa, err := a.GetPartition("redpanda", "controller", 0) if pa.LeaderID == -1 { @@ -282,7 +282,7 @@ func (a *AdminAPI) sendAny(method, path string, body, into interface{}) error { } // sendToLeader sends a single request to the leader of the Admin API for Redpanda >= 21.11.1 -// otherwise, it broadcasts the request +// otherwise, it broadcasts the request. func (a *AdminAPI) sendToLeader( method, path string, body, into interface{}, ) error { @@ -321,7 +321,7 @@ func (a *AdminAPI) sendToLeader( } else { // Got a leader ID, check if it's resolvable leaderURL, err = a.brokerIDToURL(*leaderID) - if err != nil && len(a.brokerIdToUrls) == 0 { + if err != nil && len(a.brokerIDToUrls) == 0 { // Could not map any IDs: probably this is an old redpanda // with no node_config endpoint. Fall back to broadcast. return a.sendAll(method, path, body, into) @@ -365,9 +365,9 @@ func (a *AdminAPI) brokerIDToURL(brokerID int) (string, error) { } func (a *AdminAPI) getURLFromBrokerID(brokerID int) (string, bool) { - a.brokerIdToUrlsMutex.Lock() - url, ok := a.brokerIdToUrls[brokerID] - a.brokerIdToUrlsMutex.Unlock() + a.brokerIDToUrlsMutex.Lock() + url, ok := a.brokerIDToUrls[brokerID] + a.brokerIDToUrlsMutex.Unlock() return url, ok } @@ -453,7 +453,7 @@ func (a *AdminAPI) sendAll(method, path string, body, into interface{}) error { } // eachBroker creates a single host AdminAPI for each of the brokers and calls `fn` -// for each of them in a go routine +// for each of them in a go routine. func (a *AdminAPI) eachBroker(fn func(aa *AdminAPI) error) error { var grp multierror.Group for _, url := range a.urls { @@ -520,9 +520,9 @@ func (a *AdminAPI) sendAndReceive( req.SetBasicAuth(a.basicCredentials.Username, a.basicCredentials.Password) } - const applicationJson = "application/json" - req.Header.Set("Content-Type", applicationJson) - req.Header.Set("Accept", applicationJson) + const applicationJSON = "application/json" + req.Header.Set("Content-Type", applicationJSON) + req.Header.Set("Accept", applicationJSON) // Issue request to the appropriate client, depending on retry behaviour var res *http.Response @@ -549,19 +549,19 @@ func (a *AdminAPI) sendAndReceive( if err != nil { return nil, fmt.Errorf("request %s %s failed: %s, unable to read body: %w", method, url, status, err) } - return nil, &HttpError{Response: res, Body: resBody} + return nil, &HTTPError{Response: res, Body: resBody} } return res, nil } -func (he HttpError) DecodeGenericErrorBody() (GenericErrorBody, error) { +func (he HTTPError) DecodeGenericErrorBody() (GenericErrorBody, error) { var resp GenericErrorBody err := json.Unmarshal(he.Body, &resp) return resp, err } -func (he HttpError) Error() string { +func (he HTTPError) Error() string { return fmt.Sprintf("request %s %s failed: %s, body: %q", - he.Method, he.Url, http.StatusText(he.Response.StatusCode), he.Body) + he.Method, he.URL, http.StatusText(he.Response.StatusCode), he.Body) } diff --git a/src/go/rpk/pkg/api/admin/admin_test.go b/src/go/rpk/pkg/api/admin/admin_test.go index ec32b4928424..ad6e35521d67 100644 --- a/src/go/rpk/pkg/api/admin/admin_test.go +++ b/src/go/rpk/pkg/api/admin/admin_test.go @@ -94,13 +94,19 @@ func TestAdminAPI(t *testing.T) { urls := []string{} calls := []testCall{} mutex := sync.Mutex{} - + tServers := []*httptest.Server{} for i := 0; i < tt.nNodes; i += 1 { ts := httptest.NewServer(handlerForNode(t, i, tt, &calls, &mutex)) - defer ts.Close() + tServers = append(tServers, ts) urls = append(urls, ts.URL) } + defer func() { + for _, ts := range tServers { + ts.Close() + } + }() + adminClient, err := NewAdminAPI(urls, BasicCredentials{}, nil) require.NoError(t, err) err = tt.action(t, adminClient) @@ -112,7 +118,7 @@ func TestAdminAPI(t *testing.T) { checkCallToAnyNode(t, calls, path, tt.nNodes) } for _, path := range tt.leader { - checkCallToLeader(t, calls, path, tt.nNodes, tt.leaderID) + checkCallToLeader(t, calls, path, tt.leaderID) } for _, path := range tt.none { checkCallNone(t, calls, path, tt.nNodes) @@ -173,7 +179,7 @@ func checkCallToAnyNode( require.Fail(t, fmt.Sprintf("path (%s) was expected to be called in any node but it wasn't called", path)) } func checkCallToLeader( - t *testing.T, calls []testCall, path string, nNodes, leaderID int, + t *testing.T, calls []testCall, path string, leaderID int, ) { if len(callsForPathAndNodeID(calls, path, leaderID)) == 0 { require.Fail(t, fmt.Sprintf("path (%s) was expected to be called in the leader node but it wasn't", path)) diff --git a/src/go/rpk/pkg/api/admin/api_broker.go b/src/go/rpk/pkg/api/admin/api_broker.go index 5d744451febe..7bc0da4ed03c 100644 --- a/src/go/rpk/pkg/api/admin/api_broker.go +++ b/src/go/rpk/pkg/api/admin/api_broker.go @@ -42,7 +42,7 @@ type Broker struct { func (a *AdminAPI) Brokers() ([]Broker, error) { var bs []Broker defer func() { - sort.Slice(bs, func(i, j int) bool { return bs[i].NodeID < bs[j].NodeID }) + sort.Slice(bs, func(i, j int) bool { return bs[i].NodeID < bs[j].NodeID }) //nolint:revive // return inside this deferred function is for the sort's less function }() return bs, a.sendAny(http.MethodGet, brokersEndpoint, nil, &bs) } @@ -77,20 +77,20 @@ func (a *AdminAPI) RecommissionBroker(node int) error { } // EnableMaintenanceMode enables maintenance mode for a node. -func (a *AdminAPI) EnableMaintenanceMode(nodeId int) error { +func (a *AdminAPI) EnableMaintenanceMode(nodeID int) error { return a.sendAny( http.MethodPut, - fmt.Sprintf("%s/%d/maintenance", brokersEndpoint, nodeId), + fmt.Sprintf("%s/%d/maintenance", brokersEndpoint, nodeID), nil, nil, ) } // DisableMaintenanceMode disables maintenance mode for a node. -func (a *AdminAPI) DisableMaintenanceMode(nodeId int) error { +func (a *AdminAPI) DisableMaintenanceMode(nodeID int) error { return a.sendAny( http.MethodDelete, - fmt.Sprintf("%s/%d/maintenance", brokersEndpoint, nodeId), + fmt.Sprintf("%s/%d/maintenance", brokersEndpoint, nodeID), nil, nil, ) diff --git a/src/go/rpk/pkg/api/admin/api_cluster.go b/src/go/rpk/pkg/api/admin/api_cluster.go index 06cf0e565c43..b86e20996ae0 100644 --- a/src/go/rpk/pkg/api/admin/api_cluster.go +++ b/src/go/rpk/pkg/api/admin/api_cluster.go @@ -11,7 +11,7 @@ package admin import "net/http" -// Health overview data structure +// Health overview data structure. type ClusterHealthOverview struct { IsHealthy bool `json:"is_healthy"` ControllerID int `json:"controller_id"` diff --git a/src/go/rpk/pkg/api/admin/api_config.go b/src/go/rpk/pkg/api/admin/api_config.go index da33e6fe1f97..2d78fb45eb8f 100644 --- a/src/go/rpk/pkg/api/admin/api_config.go +++ b/src/go/rpk/pkg/api/admin/api_config.go @@ -115,7 +115,7 @@ func (a *AdminAPI) PatchClusterConfig( } type ConfigStatus struct { - NodeId int64 `json:"node_id"` + NodeID int64 `json:"node_id"` Restart bool `json:"restart"` ConfigVersion int64 `json:"config_version"` Invalid []string `json:"invalid"` diff --git a/src/go/rpk/pkg/api/admin/api_features.go b/src/go/rpk/pkg/api/admin/api_features.go index 27980e6e4311..2150dfc7bda0 100644 --- a/src/go/rpk/pkg/api/admin/api_features.go +++ b/src/go/rpk/pkg/api/admin/api_features.go @@ -11,7 +11,7 @@ package admin import "net/http" -// FeatureState enumerates the possible states of a feature +// FeatureState enumerates the possible states of a feature. type FeatureState string const ( @@ -22,7 +22,7 @@ const ( FeatureStateDisabled FeatureState = "disabled" ) -// Feature contains information on the state of a feature +// Feature contains information on the state of a feature. type Feature struct { Name string `json:"name"` State FeatureState `json:"state"` @@ -35,7 +35,7 @@ type FeaturesResponse struct { Features []Feature `json:"features"` } -// GetFeatures returns information about the available features +// GetFeatures returns information about the available features. func (a *AdminAPI) GetFeatures() (FeaturesResponse, error) { var features FeaturesResponse return features, a.sendAny( diff --git a/src/go/rpk/pkg/api/admin/api_partition.go b/src/go/rpk/pkg/api/admin/api_partition.go index c40ef7c75039..e78484171b31 100644 --- a/src/go/rpk/pkg/api/admin/api_partition.go +++ b/src/go/rpk/pkg/api/admin/api_partition.go @@ -14,7 +14,7 @@ import ( "net/http" ) -// Replica contains the information of a partition replica +// Replica contains the information of a partition replica. type Replica struct { NodeID int `json:"node_id"` Core int `json:"core"` @@ -31,7 +31,7 @@ type Partition struct { Replicas []Replica `json:"replicas"` } -// GetPartition returns detailed partition information +// GetPartition returns detailed partition information. func (a *AdminAPI) GetPartition( namespace, topic string, partition int, ) (Partition, error) { diff --git a/src/go/rpk/pkg/api/api.go b/src/go/rpk/pkg/api/api.go index 8c312af7365f..66579327cce9 100644 --- a/src/go/rpk/pkg/api/api.go +++ b/src/go/rpk/pkg/api/api.go @@ -11,6 +11,7 @@ package api import ( "bytes" + "context" "encoding/json" "fmt" "net/http" @@ -26,12 +27,15 @@ import ( "github.com/spf13/afero" ) -const defaultUrl = "https://m.rp.vectorized.io" +const ( + defaultURL = "https://m.rp.vectorized.io" + na = "N/A" +) type MetricsPayload struct { FreeMemoryMB float64 `json:"freeMemoryMB"` FreeSpaceMB float64 `json:"freeSpaceMB"` - CpuPercentage float64 `json:"cpuPercentage"` + CPUPercentage float64 `json:"cpuPercentage"` Partitions *int `json:"partitions"` Topics *int `json:"topics"` } @@ -59,20 +63,20 @@ type TunerPayload struct { type metricsBody struct { MetricsPayload SentAt time.Time `json:"sentAt"` - NodeUuid string `json:"nodeUuid"` + NodeUUID string `json:"nodeUuid"` Organization string `json:"organization"` - ClusterId string `json:"clusterId"` - NodeId int `json:"nodeId"` + ClusterID string `json:"clusterId"` + NodeID int `json:"nodeId"` } type environmentBody struct { Payload EnvironmentPayload `json:"payload"` Config map[string]interface{} `json:"config"` SentAt time.Time `json:"sentAt"` - NodeUuid string `json:"nodeUuid"` + NodeUUID string `json:"nodeUuid"` Organization string `json:"organization"` - ClusterId string `json:"clusterId"` - NodeId int `json:"nodeId"` + ClusterID string `json:"clusterId"` + NodeID int `json:"nodeId"` CloudVendor string `json:"cloudVendor"` VMType string `json:"vmType"` OSInfo string `json:"osInfo"` @@ -86,12 +90,12 @@ func SendMetrics(p MetricsPayload, conf config.Config) error { b := metricsBody{ p, time.Now(), - conf.NodeUuid, + conf.NodeUUID, conf.Organization, - conf.ClusterId, - conf.Redpanda.Id, + conf.ClusterID, + conf.Redpanda.ID, } - return sendMetricsToUrl(b, defaultUrl, conf) + return sendMetricsToURL(b, defaultURL, conf) } func SendEnvironment( @@ -106,15 +110,15 @@ func SendEnvironment( if err != nil { return err } - cloudVendor := "N/A" - vmType := "N/A" + cloudVendor := na + vmType := na if !skipCloudCheck { v, err := cloud.AvailableVendor() if err != nil { log.Debug(err) } else { cloudVendor = v.Name() - vt, err := v.VmType() + vt, err := v.VMType() if err != nil { log.Debug("Error retrieving instance type: ", err) } else { @@ -126,28 +130,28 @@ func SendEnvironment( osInfo, err := system.UnameAndDistro(2000 * time.Millisecond) if err != nil { log.Debug("Error querying OS info: ", err) - osInfo = "N/A" + osInfo = na } else { osInfo = stripCtlFromUTF8(osInfo) } - cpuModel := "N/A" + cpuModel := na cpuCores := 0 - cpuInfo, err := system.CpuInfo(fs) + cpuInfo, err := system.GetCPUInfo(fs) if err != nil { log.Debug("Error querying CPU info: ", err) } else if len(cpuInfo) > 0 { cpuModel = cpuInfo[0].ModelName - cpuCores = int(cpuInfo[0].Cores) * len(cpuInfo) + cpuCores = cpuInfo[0].Cores * len(cpuInfo) } b := environmentBody{ Payload: env, Config: confMap, SentAt: time.Now(), - NodeUuid: conf.NodeUuid, + NodeUUID: conf.NodeUUID, Organization: conf.Organization, - ClusterId: conf.ClusterId, - NodeId: conf.Redpanda.Id, + ClusterID: conf.ClusterID, + NodeID: conf.Redpanda.ID, CloudVendor: cloudVendor, VMType: vmType, OSInfo: osInfo, @@ -155,9 +159,9 @@ func SendEnvironment( CPUCores: cpuCores, RPVersion: version.Pretty(), } - return sendEnvironmentToUrl( + return sendEnvironmentToURL( b, - fmt.Sprintf("%s%s", defaultUrl, "/env"), + fmt.Sprintf("%s%s", defaultURL, "/env"), conf, ) } @@ -171,7 +175,7 @@ func stripCtlFromUTF8(str string) string { }, str) } -func sendMetricsToUrl(b metricsBody, url string, conf config.Config) error { +func sendMetricsToURL(b metricsBody, url string, conf config.Config) error { bs, err := json.Marshal(b) if err != nil { return err @@ -179,7 +183,7 @@ func sendMetricsToUrl(b metricsBody, url string, conf config.Config) error { return sendRequest(bs, http.MethodPost, url, conf) } -func sendEnvironmentToUrl( +func sendEnvironmentToURL( body environmentBody, url string, conf config.Config, ) error { body.Environment = os.Getenv("REDPANDA_ENVIRONMENT") @@ -195,7 +199,8 @@ func sendRequest(body []byte, method, url string, conf config.Config) error { log.Debug("Sending usage stats is disabled.") return nil } - req, err := http.NewRequest( + req, err := http.NewRequestWithContext( + context.Background(), http.MethodPost, url, bytes.NewBuffer(body), diff --git a/src/go/rpk/pkg/api/api_test.go b/src/go/rpk/pkg/api/api_test.go index 391df136ff6a..a6ff80f9700a 100644 --- a/src/go/rpk/pkg/api/api_test.go +++ b/src/go/rpk/pkg/api/api_test.go @@ -14,7 +14,6 @@ import ( "io/ioutil" "net/http" "net/http/httptest" - "os" "testing" "time" @@ -24,14 +23,14 @@ import ( func TestSendMetrics(t *testing.T) { body := metricsBody{ - NodeUuid: "asdfas-asdf2w23sd-907asdf", + NodeUUID: "asdfas-asdf2w23sd-907asdf", Organization: "io.vectorized", - NodeId: 1, + NodeID: 1, SentAt: time.Now(), MetricsPayload: MetricsPayload{ FreeMemoryMB: 100, FreeSpaceMB: 200, - CpuPercentage: 89, + CPUPercentage: 89, }, } bs, err := json.Marshal(body) @@ -48,7 +47,7 @@ func TestSendMetrics(t *testing.T) { conf := config.Default() conf.Rpk.EnableUsageStats = true - err = sendMetricsToUrl(body, ts.URL, *conf) + err = sendMetricsToURL(body, ts.URL, *conf) require.NoError(t, err) } @@ -65,7 +64,7 @@ func TestSkipSendMetrics(t *testing.T) { conf := config.Default() conf.Rpk.EnableUsageStats = false - err := sendMetricsToUrl(metricsBody{}, ts.URL, *conf) + err := sendMetricsToURL(metricsBody{}, ts.URL, *conf) require.NoError(t, err) } @@ -99,8 +98,8 @@ func TestSendEnvironment(t *testing.T) { }, ErrorMsg: "tuner 2 failed", }, - NodeUuid: "awe-1231-sdfasd-13-saddasdf-as123sdf", - NodeId: 1, + NodeUUID: "awe-1231-sdfasd-13-saddasdf-as123sdf", + NodeID: 1, Organization: "test.vectorized.io", CPUCores: 12, CPUModel: "AMD Ryzen 9 3900X 12-Core Processor", @@ -137,9 +136,9 @@ func TestSendEnvironment(t *testing.T) { require.NoError(t, err) env := "only-testing-nbd" - os.Setenv("REDPANDA_ENVIRONMENT", env) + t.Setenv("REDPANDA_ENVIRONMENT", env) defer func() { - os.Setenv("REDPANDA_ENVIRONMENT", "") + t.Setenv("REDPANDA_ENVIRONMENT", "") }() expected.Environment = env @@ -159,7 +158,7 @@ func TestSendEnvironment(t *testing.T) { conf := config.Default() conf.Rpk.EnableUsageStats = true - err = sendEnvironmentToUrl(body, ts.URL, *conf) + err = sendEnvironmentToURL(body, ts.URL, *conf) require.NoError(t, err) } @@ -176,6 +175,6 @@ func TestSkipSendEnvironment(t *testing.T) { conf := config.Default() conf.Rpk.EnableUsageStats = false - err := sendEnvironmentToUrl(environmentBody{}, ts.URL, *conf) + err := sendEnvironmentToURL(environmentBody{}, ts.URL, *conf) require.NoError(t, err) } diff --git a/src/go/rpk/pkg/cli/cmd/acl.go b/src/go/rpk/pkg/cli/cmd/acl.go index d294c19e6daa..aec3aa014826 100644 --- a/src/go/rpk/pkg/cli/cmd/acl.go +++ b/src/go/rpk/pkg/cli/cmd/acl.go @@ -14,12 +14,11 @@ import ( "github.com/redpanda-data/redpanda/src/go/rpk/pkg/cli/cmd/acl" "github.com/redpanda-data/redpanda/src/go/rpk/pkg/cli/cmd/common" - "github.com/redpanda-data/redpanda/src/go/rpk/pkg/config" "github.com/spf13/afero" "github.com/spf13/cobra" ) -func NewACLCommand(fs afero.Fs, mgr config.Manager) *cobra.Command { +func NewACLCommand(fs afero.Fs) *cobra.Command { var ( brokers []string configFile string @@ -44,7 +43,7 @@ func NewACLCommand(fs afero.Fs, mgr config.Manager) *cobra.Command { Args: cobra.ExactArgs(0), Run: func(cmd *cobra.Command, _ []string) { if helpOperations { - fmt.Println(helpACLOperations) + fmt.Print(helpACLOperations) return } cmd.Help() diff --git a/src/go/rpk/pkg/cli/cmd/acl/common.go b/src/go/rpk/pkg/cli/cmd/acl/common.go index c964a21f8d10..c8d9e55feb27 100644 --- a/src/go/rpk/pkg/cli/cmd/acl/common.go +++ b/src/go/rpk/pkg/cli/cmd/acl/common.go @@ -39,19 +39,6 @@ const ( ) var ( - allIndividualFlags = []string{ - topicFlag, - groupFlag, - clusterFlag, - txnIDFlag, - patternFlag, - allowPrincipalFlag, - allowHostFlag, - denyPrincipalFlag, - denyHostFlag, - operationFlag, - } - // For all outputs, we either have the following headers, or the // following headers and an additional "Error" message column. headers = []string{ diff --git a/src/go/rpk/pkg/cli/cmd/acl/list.go b/src/go/rpk/pkg/cli/cmd/acl/list.go index 55a35283cde3..26461412cace 100644 --- a/src/go/rpk/pkg/cli/cmd/acl/list.go +++ b/src/go/rpk/pkg/cli/cmd/acl/list.go @@ -115,7 +115,7 @@ func describeReqResp( } if printAllFilters || printFailedFilters { out.Section("filters") - printDescribeFilters(printAllFilters, results) + printDescribeFilters(results) fmt.Println() printMatchesHeader = true } @@ -125,7 +125,7 @@ func describeReqResp( printDescribedACLs(results) } -func printDescribeFilters(all bool, results kadm.DescribeACLsResults) { +func printDescribeFilters(results kadm.DescribeACLsResults) { tw := out.NewTable(headersWithError...) defer tw.Flush() for _, f := range results { diff --git a/src/go/rpk/pkg/cli/cmd/cluster/config/import.go b/src/go/rpk/pkg/cli/cmd/cluster/config/import.go index 0197ace3e1b0..831e84b09ce5 100644 --- a/src/go/rpk/pkg/cli/cmd/cluster/config/import.go +++ b/src/go/rpk/pkg/cli/cmd/cluster/config/import.go @@ -57,8 +57,7 @@ func importConfig( // if it is given as the value for a floating point // ('number') config property, and vice versa. if meta.Type == "integer" { - switch vFloat := v.(type) { - case float64: + if vFloat, ok := v.(float64); ok { v = int(vFloat) } @@ -66,9 +65,8 @@ func importConfig( oldVal = int(oldVal.(float64)) } } else if meta.Type == "number" { - switch x := v.(type) { - case int: - v = float64(x) + if vInt, ok := v.(int); ok { + v = float64(vInt) } } else if meta.Type == "array" && meta.Items.Type == "string" { switch vArray := v.(type) { @@ -132,7 +130,7 @@ func importConfig( // PUT to admin API result, err := client.PatchClusterConfig(upsert, remove) - if he := (*admin.HttpError)(nil); errors.As(err, &he) { + if he := (*admin.HTTPError)(nil); errors.As(err, &he) { // Special case 400 (validation) errors with friendly output // about which configuration properties were invalid. if he.Response.StatusCode == 400 { @@ -149,10 +147,10 @@ func importConfig( return nil } -func formatValidationError(err error, http_err *admin.HttpError) string { +func formatValidationError(err error, httpErr *admin.HTTPError) string { // Output structured validation errors from server var validationErrs map[string]string - bodyErr := json.Unmarshal(http_err.Body, &validationErrs) + bodyErr := json.Unmarshal(httpErr.Body, &validationErrs) // If no proper JSON body, fall back to generic HTTP error report if bodyErr != nil { out.MaybeDie(err, "error setting config: %v", err) diff --git a/src/go/rpk/pkg/cli/cmd/cluster/config/set.go b/src/go/rpk/pkg/cli/cmd/cluster/config/set.go index 8cb90bc851c8..ca840fae6cbf 100644 --- a/src/go/rpk/pkg/cli/cmd/cluster/config/set.go +++ b/src/go/rpk/pkg/cli/cmd/cluster/config/set.go @@ -80,7 +80,7 @@ If an empty string is given as the value, the property is reset to its default.` } result, err := client.PatchClusterConfig(upsert, remove) - if he := (*admin.HttpError)(nil); errors.As(err, &he) { + if he := (*admin.HTTPError)(nil); errors.As(err, &he) { // Special case 400 (validation) errors with friendly output // about which configuration properties were invalid. if he.Response.StatusCode == 400 { diff --git a/src/go/rpk/pkg/cli/cmd/cluster/config/status.go b/src/go/rpk/pkg/cli/cmd/cluster/config/status.go index 4c562bb53c34..afa53bb8d372 100644 --- a/src/go/rpk/pkg/cli/cmd/cluster/config/status.go +++ b/src/go/rpk/pkg/cli/cmd/cluster/config/status.go @@ -48,12 +48,12 @@ is offline.`, for _, node := range resp { tw.PrintStructFields(struct { - Id int64 + ID int64 Version int64 Restart bool Invalid []string Unknown []string - }{node.NodeId, node.ConfigVersion, node.Restart, node.Invalid, node.Unknown}) + }{node.NodeID, node.ConfigVersion, node.Restart, node.Invalid, node.Unknown}) } }, } diff --git a/src/go/rpk/pkg/cli/cmd/cluster/health.go b/src/go/rpk/pkg/cli/cmd/cluster/health.go index e05c72530e2e..72be9f5d2de7 100644 --- a/src/go/rpk/pkg/cli/cmd/cluster/health.go +++ b/src/go/rpk/pkg/cli/cmd/cluster/health.go @@ -7,8 +7,6 @@ // the Business Source License, use of this software will be governed // by the Apache License, Version 2.0 -// Package brokers contains commands to talk to the Redpanda's admin brokers -// endpoints. package cluster import ( diff --git a/src/go/rpk/pkg/cli/cmd/cluster/maintenance/disable.go b/src/go/rpk/pkg/cli/cmd/cluster/maintenance/disable.go index 7f7890df53f3..653b8adfcd45 100644 --- a/src/go/rpk/pkg/cli/cmd/cluster/maintenance/disable.go +++ b/src/go/rpk/pkg/cli/cmd/cluster/maintenance/disable.go @@ -28,13 +28,13 @@ func newDisableCommand(fs afero.Fs) *cobra.Command { Long: `Disable maintenance mode for a node.`, Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { - nodeId, err := strconv.Atoi(args[0]) + nodeID, err := strconv.Atoi(args[0]) if err != nil { out.MaybeDie(err, "could not parse node id: %s: %v", args[0], err) } - if nodeId < 0 { - out.Die("invalid node id: %d", nodeId) + if nodeID < 0 { + out.Die("invalid node id: %d", nodeID) } p := config.ParamsFromCommand(cmd) @@ -44,8 +44,8 @@ func newDisableCommand(fs afero.Fs) *cobra.Command { client, err := admin.NewClient(fs, cfg) out.MaybeDie(err, "unable to initialize admin client: %v", err) - err = client.DisableMaintenanceMode(nodeId) - if he := (*admin.HttpError)(nil); errors.As(err, &he) { + err = client.DisableMaintenanceMode(nodeID) + if he := (*admin.HTTPError)(nil); errors.As(err, &he) { if he.Response.StatusCode == 404 { body, bodyErr := he.DecodeGenericErrorBody() if bodyErr == nil { @@ -55,7 +55,7 @@ func newDisableCommand(fs afero.Fs) *cobra.Command { } out.MaybeDie(err, "error disabling maintenance mode: %v", err) - fmt.Printf("Successfully disabled maintenance mode for node %d\n", nodeId) + fmt.Printf("Successfully disabled maintenance mode for node %d\n", nodeID) }, } return cmd diff --git a/src/go/rpk/pkg/cli/cmd/cluster/maintenance/enable.go b/src/go/rpk/pkg/cli/cmd/cluster/maintenance/enable.go index 75a2e4a12585..62525c3b4a54 100644 --- a/src/go/rpk/pkg/cli/cmd/cluster/maintenance/enable.go +++ b/src/go/rpk/pkg/cli/cmd/cluster/maintenance/enable.go @@ -36,13 +36,13 @@ node exists that is already in maintenance mode then an error will be returned. `, Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { - nodeId, err := strconv.Atoi(args[0]) + nodeID, err := strconv.Atoi(args[0]) if err != nil { out.MaybeDie(err, "could not parse node id: %s: %v", args[0], err) } - if nodeId < 0 { - out.Die("invalid node id: %d", nodeId) + if nodeID < 0 { + out.Die("invalid node id: %d", nodeID) } p := config.ParamsFromCommand(cmd) @@ -52,8 +52,8 @@ node exists that is already in maintenance mode then an error will be returned. client, err := admin.NewClient(fs, cfg) out.MaybeDie(err, "unable to initialize admin client: %v", err) - err = client.EnableMaintenanceMode(nodeId) - var he *admin.HttpError + err = client.EnableMaintenanceMode(nodeID) + var he *admin.HTTPError if errors.As(err, &he) { if he.Response.StatusCode == 404 { body, bodyErr := he.DecodeGenericErrorBody() @@ -68,8 +68,8 @@ node exists that is already in maintenance mode then an error will be returned. } } - out.MaybeDie(err, "error enabling maintenance mode for node %d: %v", nodeId, err) - fmt.Printf("Successfully enabled maintenance mode for node %d\n", nodeId) + out.MaybeDie(err, "error enabling maintenance mode for node %d: %v", nodeID, err) + fmt.Printf("Successfully enabled maintenance mode for node %d\n", nodeID) if !wait { return @@ -80,7 +80,7 @@ node exists that is already in maintenance mode then an error will be returned. var table *out.TabWriter retries := 3 for { - b, err := client.Broker(nodeId) + b, err := client.Broker(nodeID) if err == nil && b.Maintenance == nil { err = fmt.Errorf("maintenance mode not supported. upgrade in progress?") // since admin api client uses `sendAny` it is possible that diff --git a/src/go/rpk/pkg/cli/cmd/container/common/client.go b/src/go/rpk/pkg/cli/cmd/container/common/client.go index b6f57a9d5c89..43febf5400f5 100644 --- a/src/go/rpk/pkg/cli/cmd/container/common/client.go +++ b/src/go/rpk/pkg/cli/cmd/container/common/client.go @@ -109,10 +109,10 @@ func NewDockerClient() (Client, error) { return &dockerClient{c}, nil } -func (_ *dockerClient) IsErrNotFound(err error) bool { +func (*dockerClient) IsErrNotFound(err error) bool { return client.IsErrNotFound(err) } -func (_ *dockerClient) IsErrConnectionFailed(err error) bool { +func (*dockerClient) IsErrConnectionFailed(err error) bool { return client.IsErrConnectionFailed(err) } diff --git a/src/go/rpk/pkg/cli/cmd/container/common/common.go b/src/go/rpk/pkg/cli/cmd/container/common/common.go index 7e805a432782..89cca4741da6 100644 --- a/src/go/rpk/pkg/cli/cmd/container/common/common.go +++ b/src/go/rpk/pkg/cli/cmd/container/common/common.go @@ -230,7 +230,7 @@ func CreateNode( if err != nil { return nil, err } - kPort, err := nat.NewPort( + kPort, err := nat.NewPort( //nolint:revive // var-naming diff here is intended kPort = kafkaPort. "tcp", strconv.Itoa(int(externalKafkaPort)), ) @@ -351,7 +351,8 @@ func CreateNode( func PullImage(c Client, image string) error { log.Debugf("Pulling image: %s", image) - ctx, _ := context.WithTimeout(context.Background(), 5*time.Minute) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) + defer cancel() res, err := c.ImagePull(ctx, image, types.ImagePullOptions{}) if res != nil { defer res.Close() diff --git a/src/go/rpk/pkg/cli/cmd/container/purge_test.go b/src/go/rpk/pkg/cli/cmd/container/purge_test.go index 9b48660386b1..6eee8f42d7c7 100644 --- a/src/go/rpk/pkg/cli/cmd/container/purge_test.go +++ b/src/go/rpk/pkg/cli/cmd/container/purge_test.go @@ -149,11 +149,11 @@ func TestPurge(t *testing.T) { string, types.ContainerRemoveOptions, ) error { - return errors.New("Not going anywhere!") + return errors.New("not going anywhere") }, }, nil }, - expectedErrMsg: "Not going anywhere!", + expectedErrMsg: "not going anywhere", }, { name: "it should fail if it fails to delete the network", diff --git a/src/go/rpk/pkg/cli/cmd/container/start.go b/src/go/rpk/pkg/cli/cmd/container/start.go index cf86fbc77284..d5234814b8a6 100644 --- a/src/go/rpk/pkg/cli/cmd/container/start.go +++ b/src/go/rpk/pkg/cli/cmd/container/start.go @@ -285,7 +285,7 @@ func startCluster( err = grp.Wait() if err != nil { - return fmt.Errorf("Error restarting the cluster: %v", err) + return fmt.Errorf("error restarting the cluster: %v", err) } err = waitForCluster(check(nodes), retries) if err != nil { @@ -348,7 +348,7 @@ func restartCluster( } err = grp.Wait() if err != nil { - return nil, fmt.Errorf("Error restarting the cluster: %v", err) + return nil, fmt.Errorf("error restarting the cluster: %v", err) } err = waitForCluster(check(nodes), retries) if err != nil { @@ -379,7 +379,7 @@ func checkBrokers(nodes []node) func() error { } if len(brokers) != len(nodes) { return fmt.Errorf( - "Expected %d nodes, got %d.", + "expected %d nodes, got %d", len(nodes), len(brokers), ) diff --git a/src/go/rpk/pkg/cli/cmd/debug/bundle.go b/src/go/rpk/pkg/cli/cmd/debug/bundle.go index f9b482c10b04..3545a54f0dab 100644 --- a/src/go/rpk/pkg/cli/cmd/debug/bundle.go +++ b/src/go/rpk/pkg/cli/cmd/debug/bundle.go @@ -155,16 +155,15 @@ func writeCommandOutputToZipLimit( err = cmd.Wait() if err != nil { - if strings.Contains(err.Error(), "broken pipe") { - log.Debugf( - "Got '%v' while running '%s'. This is probably due to the"+ - " command's output exceeding its limit in bytes.", - err, - cmd, - ) - } else { + if !strings.Contains(err.Error(), "broken pipe") { return fmt.Errorf("couldn't save '%s': %w", filename, err) } + log.Debugf( + "Got '%v' while running '%s'. This is probably due to the"+ + " command's output exceeding its limit in bytes.", + err, + cmd, + ) } return nil } @@ -376,7 +375,7 @@ func executeBundle( saveSocketData(ps), saveTopOutput(ps), saveVmstat(ps), - saveIp(ps), + saveIP(ps), saveLspci(ps), saveDmidecode(ps), } @@ -539,9 +538,9 @@ func saveConfig(ps *stepParams, conf *config.Config) step { return func() error { // Redact SASL credentials redacted := "(REDACTED)" - if conf.Rpk.KafkaApi.SASL != nil { - conf.Rpk.KafkaApi.SASL.User = redacted - conf.Rpk.KafkaApi.SASL.Password = redacted + if conf.Rpk.KafkaAPI.SASL != nil { + conf.Rpk.KafkaAPI.SASL.User = redacted + conf.Rpk.KafkaAPI.SASL.Password = redacted } if conf.Rpk.SASL != nil { conf.Rpk.SASL.User = redacted @@ -555,7 +554,7 @@ func saveConfig(ps *stepParams, conf *config.Config) step { } } -// Saves the contents of /proc/cpuinfo +// Saves the contents of '/proc/cpuinfo'. func saveCPUInfo(ps *stepParams) step { return func() error { bs, err := afero.ReadFile(ps.fs, "/proc/cpuinfo") @@ -566,7 +565,7 @@ func saveCPUInfo(ps *stepParams) step { } } -// Saves the contents of /proc/interrupts +// Saves the contents of '/proc/interrupts'. func saveInterrupts(ps *stepParams) step { return func() error { bs, err := afero.ReadFile(ps.fs, "/proc/interrupts") @@ -682,7 +681,7 @@ func savePrometheusMetrics(ps *stepParams, admin *admin.AdminAPI) step { } } -// Saves the output of `dig` +// Saves the output of `dig`. func saveDNSData(ps *stepParams) step { return func() error { return writeCommandOutputToZip(ps, "dig.txt", "dig") @@ -721,14 +720,14 @@ func saveLogs(ps *stepParams, since, until string, logsLimitBytes int) step { } } -// Saves the output of `ss` +// Saves the output of `ss`. func saveSocketData(ps *stepParams) step { return func() error { return writeCommandOutputToZip(ps, "ss.txt", "ss") } } -// Saves the output of `top` +// Saves the output of `top`. func saveTopOutput(ps *stepParams) step { return func() error { return writeCommandOutputToZip( @@ -739,7 +738,7 @@ func saveTopOutput(ps *stepParams) step { } } -// Saves the output of `vmstat` +// Saves the output of `vmstat`. func saveVmstat(ps *stepParams) step { return func() error { return writeCommandOutputToZip( @@ -750,8 +749,8 @@ func saveVmstat(ps *stepParams) step { } } -// Saves the output of `ip addr` -func saveIp(ps *stepParams) step { +// Saves the output of `ip addr`. +func saveIP(ps *stepParams) step { return func() error { return writeCommandOutputToZip( ps, @@ -761,7 +760,7 @@ func saveIp(ps *stepParams) step { } } -// Saves the output of `lspci` +// Saves the output of `lspci`. func saveLspci(ps *stepParams) step { return func() error { return writeCommandOutputToZip( @@ -772,7 +771,7 @@ func saveLspci(ps *stepParams) step { } } -// Saves the output of `dmidecode` +// Saves the output of `dmidecode`. func saveDmidecode(ps *stepParams) step { return func() error { return writeCommandOutputToZip( diff --git a/src/go/rpk/pkg/cli/cmd/debug/bundle_test.go b/src/go/rpk/pkg/cli/cmd/debug/bundle_test.go index ec61c5897cf3..a08445e81ff0 100644 --- a/src/go/rpk/pkg/cli/cmd/debug/bundle_test.go +++ b/src/go/rpk/pkg/cli/cmd/debug/bundle_test.go @@ -56,7 +56,7 @@ func TestLimitedWriter(t *testing.T) { remaining-- } var expected int - totalBytes := int(tt.blocksToWrite * block) + totalBytes := tt.blocksToWrite * block if totalBytes > tt.limit { require.EqualError(st, writeErr, "output size limit reached") expected = tt.limit diff --git a/src/go/rpk/pkg/cli/cmd/debug/info.go b/src/go/rpk/pkg/cli/cmd/debug/info.go index 20ca0102fc22..f6ac657dd19f 100644 --- a/src/go/rpk/pkg/cli/cmd/debug/info.go +++ b/src/go/rpk/pkg/cli/cmd/debug/info.go @@ -67,7 +67,7 @@ func NewInfoCommand(fs afero.Fs) *cobra.Command { } else { payload.FreeMemoryMB = m.FreeMemoryMB payload.FreeSpaceMB = m.FreeSpaceMB - payload.CpuPercentage = m.CpuPercentage + payload.CPUPercentage = m.CPUPercentage } }() diff --git a/src/go/rpk/pkg/cli/cmd/generate/graf/dashboard.go b/src/go/rpk/pkg/cli/cmd/generate/graf/dashboard.go index 50fc5f76aa7a..2965e9eda1a7 100644 --- a/src/go/rpk/pkg/cli/cmd/generate/graf/dashboard.go +++ b/src/go/rpk/pkg/cli/cmd/generate/graf/dashboard.go @@ -11,7 +11,7 @@ package graf import "encoding/json" -var id uint = 0 +var id uint func nextID() uint { id++ diff --git a/src/go/rpk/pkg/cli/cmd/generate/grafana.go b/src/go/rpk/pkg/cli/cmd/generate/grafana.go index b7e9e621ccaf..ce9d5f256059 100644 --- a/src/go/rpk/pkg/cli/cmd/generate/grafana.go +++ b/src/go/rpk/pkg/cli/cmd/generate/grafana.go @@ -11,6 +11,7 @@ package generate import ( "bytes" + "context" "encoding/json" "fmt" "io/ioutil" @@ -18,6 +19,7 @@ import ( "os" "sort" "strings" + "time" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" @@ -27,24 +29,26 @@ import ( "github.com/spf13/cobra" ) -var datasource string -var jobName string +var ( + datasource string + jobName string + hClient = http.Client{Timeout: 10 * time.Second} + metricGroups = []string{ + "errors", + "storage", + "reactor", + "scheduler", + "io_queue", + "vectorized_internal_rpc", + "kafka_rpc", + "rpc_client", + "memory", + "raft", + } +) const panelHeight = 6 -var metricGroups = []string{ - "errors", - "storage", - "reactor", - "scheduler", - "io_queue", - "vectorized_internal_rpc", - "kafka_rpc", - "rpc_client", - "memory", - "raft", -} - type RowSet struct { rowTitles []string groupPanels map[string]*graf.RowPanel @@ -411,7 +415,16 @@ func metricGroup(metric string) string { func fetchMetrics( metricsEndpoint string, ) (map[string]*dto.MetricFamily, error) { - res, err := http.Get(metricsEndpoint) + req, err := http.NewRequestWithContext( + context.Background(), + http.MethodGet, + metricsEndpoint, + nil, + ) + if err != nil { + return nil, err + } + res, err := hClient.Do(req) if err != nil { return nil, err } diff --git a/src/go/rpk/pkg/cli/cmd/generate/prometheus.go b/src/go/rpk/pkg/cli/cmd/generate/prometheus.go index 3893cc25eb81..b6af624a3663 100644 --- a/src/go/rpk/pkg/cli/cmd/generate/prometheus.go +++ b/src/go/rpk/pkg/cli/cmd/generate/prometheus.go @@ -129,8 +129,8 @@ func executePrometheusConfig( return []byte(""), err } hosts, err := discoverHosts( - conf.Redpanda.KafkaApi[0].Address, - conf.Redpanda.KafkaApi[0].Port, + conf.Redpanda.KafkaAPI[0].Address, + conf.Redpanda.KafkaAPI[0].Port, ) if err != nil { return []byte(""), err @@ -150,10 +150,14 @@ func discoverHosts(url string, port int) ([]string, error) { addr := net.JoinHostPort(url, strconv.Itoa(port)) cl, err := kgo.NewClient(kgo.SeedBrokers(addr)) if err != nil { - return nil, nil + return nil, err } var hosts []string brokers, err := kadm.NewClient(cl).ListBrokers(context.Background()) + if err != nil { + return nil, err + } + for _, b := range brokers { hosts = append( hosts, @@ -164,7 +168,6 @@ func discoverHosts(url string, port int) ([]string, error) { } func splitAddress(address string) (string, int, error) { - host := "" parts := strings.Split(address, ":") if len(parts) == 0 { return "", 0, fmt.Errorf( @@ -175,7 +178,7 @@ func splitAddress(address string) (string, int, error) { if len(parts) == 1 { return parts[0], 0, nil } - host = parts[0] + host := parts[0] var err error port, err := strconv.Atoi(parts[1]) if err != nil { diff --git a/src/go/rpk/pkg/cli/cmd/group/group.go b/src/go/rpk/pkg/cli/cmd/group/group.go index b82fea58d3cb..4f51ab9e2bdb 100644 --- a/src/go/rpk/pkg/cli/cmd/group/group.go +++ b/src/go/rpk/pkg/cli/cmd/group/group.go @@ -21,7 +21,7 @@ import ( "github.com/spf13/cobra" ) -func NewCommand(fs afero.Fs, mgr config.Manager) *cobra.Command { +func NewCommand(fs afero.Fs) *cobra.Command { cmd := &cobra.Command{ Use: "group", Aliases: []string{"g"}, diff --git a/src/go/rpk/pkg/cli/cmd/group/seek_test.go b/src/go/rpk/pkg/cli/cmd/group/seek_test.go index b30dc17c81ea..c9532e31c1ce 100644 --- a/src/go/rpk/pkg/cli/cmd/group/seek_test.go +++ b/src/go/rpk/pkg/cli/cmd/group/seek_test.go @@ -108,7 +108,7 @@ func TestParseSeekFile(t *testing.T) { } { t.Run(test.name, func(t *testing.T) { fs := testfs.FromMap(map[string]testfs.Fmode{ - test.name: {0o444, test.contents}, + test.name: {Mode: 0o444, Contents: test.contents}, }) got, err := parseSeekFile(fs, test.name, keep) diff --git a/src/go/rpk/pkg/cli/cmd/redpanda/admin/config/config.go b/src/go/rpk/pkg/cli/cmd/redpanda/admin/config/config.go index 122a3895bb98..f4c39e4950a7 100644 --- a/src/go/rpk/pkg/cli/cmd/redpanda/admin/config/config.go +++ b/src/go/rpk/pkg/cli/cmd/redpanda/admin/config/config.go @@ -61,7 +61,7 @@ func newPrintCommand(fs afero.Fs) *cobra.Command { return cmd } -// rpk redpanda admin config log-level set +// 'rpk redpanda admin config log-level set'. func newLogLevelCommand(fs afero.Fs) *cobra.Command { cmd := &cobra.Command{ Use: "log-level", @@ -170,7 +170,7 @@ failure of enabling each logger is individually printed. } // List of possible loggers to set; more can be added in the future. -// To generate this list, run redpanda --help-loggers +// To generate this list, run 'redpanda --help-loggers'. var possibleLoggers = []string{ "admin_api_server", "archival", diff --git a/src/go/rpk/pkg/cli/cmd/redpanda/admin/partitions/partitions.go b/src/go/rpk/pkg/cli/cmd/redpanda/admin/partitions/partitions.go index c531c0df9277..f69714a4c88f 100644 --- a/src/go/rpk/pkg/cli/cmd/redpanda/admin/partitions/partitions.go +++ b/src/go/rpk/pkg/cli/cmd/redpanda/admin/partitions/partitions.go @@ -46,10 +46,10 @@ func newListCommand(fs afero.Fs) *cobra.Command { Short: "List the partitions in a broker in the cluster.", Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { - brokerId, err := strconv.Atoi(args[0]) + brokerID, err := strconv.Atoi(args[0]) out.MaybeDie(err, "invalid broker %s: %v", args[0], err) - if brokerId < 0 { - out.Die("invalid negative broker id %v", brokerId) + if brokerID < 0 { + out.Die("invalid negative broker id %v", brokerID) } p := config.ParamsFromCommand(cmd) @@ -70,9 +70,9 @@ func newListCommand(fs afero.Fs) *cobra.Command { for _, t := range m.Topics.Sorted() { for _, pt := range t.Partitions.Sorted() { for _, rs := range pt.Replicas { - if int(rs) == brokerId { + if int(rs) == brokerID { var isLeader bool - if int(pt.Leader) == brokerId { + if int(pt.Leader) == brokerID { isLeader = true tw.Print(t.Topic, pt.Partition, isLeader) } diff --git a/src/go/rpk/pkg/cli/cmd/redpanda/config.go b/src/go/rpk/pkg/cli/cmd/redpanda/config.go index ef844dd7054d..0de9325baae2 100644 --- a/src/go/rpk/pkg/cli/cmd/redpanda/config.go +++ b/src/go/rpk/pkg/cli/cmd/redpanda/config.go @@ -106,7 +106,7 @@ func bootstrap(mgr config.Manager) *cobra.Command { " ones can join later.", Args: cobra.OnlyValidArgs, RunE: func(c *cobra.Command, args []string) error { - defaultRpcPort := config.Default().Redpanda.RPCServer.Port + defaultRPCPort := config.Default().Redpanda.RPCServer.Port conf, err := mgr.FindOrGenerate(configPath) if err != nil { return err @@ -115,30 +115,30 @@ func bootstrap(mgr config.Manager) *cobra.Command { if err != nil { return err } - var ownIp net.IP + var ownIP net.IP if self != "" { - ownIp = net.ParseIP(self) - if ownIp == nil { - return fmt.Errorf("%s is not a valid IP.", self) + ownIP = net.ParseIP(self) + if ownIP == nil { + return fmt.Errorf("%s is not a valid IP", self) } } else { - ownIp, err = ownIP() + ownIP, err = getOwnIP() if err != nil { return err } } - conf.Redpanda.Id = id - conf.Redpanda.RPCServer.Address = ownIp.String() - conf.Redpanda.KafkaApi = []config.NamedSocketAddress{{ + conf.Redpanda.ID = id + conf.Redpanda.RPCServer.Address = ownIP.String() + conf.Redpanda.KafkaAPI = []config.NamedSocketAddress{{ SocketAddress: config.SocketAddress{ - Address: ownIp.String(), + Address: ownIP.String(), Port: config.DefaultKafkaPort, }, }} - conf.Redpanda.AdminApi = []config.NamedSocketAddress{{ + conf.Redpanda.AdminAPI = []config.NamedSocketAddress{{ SocketAddress: config.SocketAddress{ - Address: ownIp.String(), + Address: ownIP.String(), Port: config.DefaultAdminPort, }, }} @@ -147,8 +147,8 @@ func bootstrap(mgr config.Manager) *cobra.Command { for _, ip := range ips { seed := config.SeedServer{ Host: config.SocketAddress{ - ip.String(), - defaultRpcPort, + Address: ip.String(), + Port: defaultRPCPort, }, } seeds = append(seeds, seed) @@ -200,7 +200,7 @@ func initNode(mgr config.Manager) *cobra.Command { return err } // Don't reset the node's UUID if it has already been set. - if conf.NodeUuid == "" { + if conf.NodeUUID == "" { return mgr.WriteNodeUUID(conf) } return nil @@ -221,14 +221,14 @@ func parseIPs(ips []string) ([]net.IP, error) { for _, i := range ips { p := net.ParseIP(i) if p == nil { - return []net.IP{}, fmt.Errorf("%s is not a valid IP.", i) + return []net.IP{}, fmt.Errorf("%s is not a valid IP", i) } parsed = append(parsed, p) } return parsed, nil } -func ownIP() (net.IP, error) { +func getOwnIP() (net.IP, error) { addrs, err := net.InterfaceAddrs() if err != nil { return nil, err @@ -253,12 +253,12 @@ func ownIP() (net.IP, error) { if len(filtered) > 1 { return nil, errors.New( "found multiple private non-loopback v4 IPs for the" + - " current node. Please set one with --self.", + " current node. Please set one with --self", ) } if len(filtered) == 0 { return nil, errors.New( - "couldn't find any non-loopback IPs for the current node.", + "couldn't find any non-loopback IPs for the current node", ) } return filtered[0], nil diff --git a/src/go/rpk/pkg/cli/cmd/redpanda/config_test.go b/src/go/rpk/pkg/cli/cmd/redpanda/config_test.go index b74cbba65aa8..3983c85638bc 100644 --- a/src/go/rpk/pkg/cli/cmd/redpanda/config_test.go +++ b/src/go/rpk/pkg/cli/cmd/redpanda/config_test.go @@ -198,14 +198,14 @@ func TestBootstrap(t *testing.T) { ips: []string{"187.89.9", "192.168.34.5", "192.168.45.8"}, self: "192.168.34.5", id: "1", - expectedErr: "187.89.9 is not a valid IP.", + expectedErr: "187.89.9 is not a valid IP", }, { name: "it should fail if --self isn't a valid IP", ips: []string{"187.89.9.78", "192.168.34.5", "192.168.45.8"}, self: "www.host.com", id: "1", - expectedErr: "www.host.com is not a valid IP.", + expectedErr: "www.host.com is not a valid IP", }, { name: "it should fail if --id isn't passed", @@ -247,12 +247,13 @@ func TestBootstrap(t *testing.T) { } require.NoError(t, err) _, err = fs.Stat(configPath) + require.NoError(t, err) conf, err := mgr.Read(configPath) require.NoError(t, err) require.Equal(t, tt.self, conf.Redpanda.RPCServer.Address) - require.Equal(t, tt.self, conf.Redpanda.KafkaApi[0].Address) - require.Equal(t, tt.self, conf.Redpanda.AdminApi[0].Address) + require.Equal(t, tt.self, conf.Redpanda.KafkaAPI[0].Address) + require.Equal(t, tt.self, conf.Redpanda.AdminAPI[0].Address) if len(tt.ips) == 1 { require.Equal( t, diff --git a/src/go/rpk/pkg/cli/cmd/redpanda/mode_test.go b/src/go/rpk/pkg/cli/cmd/redpanda/mode_test.go index e62ce2093a06..a81f809add8c 100644 --- a/src/go/rpk/pkg/cli/cmd/redpanda/mode_test.go +++ b/src/go/rpk/pkg/cli/cmd/redpanda/mode_test.go @@ -37,7 +37,7 @@ func fillRpkConfig(path, mode string) *config.Config { TuneNomerges: val, TuneDiskIrq: val, TuneFstrim: false, - TuneCpu: val, + TuneCPU: val, TuneAioEvents: val, TuneClocksource: val, TuneSwappiness: val, diff --git a/src/go/rpk/pkg/cli/cmd/redpanda/start.go b/src/go/rpk/pkg/cli/cmd/redpanda/start.go index 3f4879ad9b6e..399c22fd2b78 100644 --- a/src/go/rpk/pkg/cli/cmd/redpanda/start.go +++ b/src/go/rpk/pkg/cli/cmd/redpanda/start.go @@ -95,7 +95,7 @@ func updateConfigWithFlags(conf *config.Config, flags *pflag.FlagSet) { conf.Rpk.Overprovisioned, _ = flags.GetBool(overprovisionedFlag) } if flags.Changed(nodeIDFlag) { - conf.Redpanda.Id, _ = flags.GetInt(nodeIDFlag) + conf.Redpanda.ID, _ = flags.GetInt(nodeIDFlag) } } @@ -192,7 +192,7 @@ func NewStartCommand( ",", ), ) - kafkaApi, err := parseNamedAddresses( + kafkaAPI, err := parseNamedAddresses( kafkaAddr, config.DefaultKafkaPort, ) @@ -200,8 +200,8 @@ func NewStartCommand( sendEnv(fs, mgr, env, conf, !prestartCfg.checkEnabled, err) return err } - if len(kafkaApi) > 0 { - conf.Redpanda.KafkaApi = kafkaApi + if len(kafkaAPI) > 0 { + conf.Redpanda.KafkaAPI = kafkaAPI } proxyAddr = stringSliceOr( @@ -211,7 +211,7 @@ func NewStartCommand( ",", ), ) - proxyApi, err := parseNamedAddresses( + proxyAPI, err := parseNamedAddresses( proxyAddr, config.DefaultProxyPort, ) @@ -219,11 +219,11 @@ func NewStartCommand( sendEnv(fs, mgr, env, conf, !prestartCfg.checkEnabled, err) return err } - if len(proxyApi) > 0 { + if len(proxyAPI) > 0 { if conf.Pandaproxy == nil { conf.Pandaproxy = config.Default().Pandaproxy } - conf.Pandaproxy.PandaproxyAPI = proxyApi + conf.Pandaproxy.PandaproxyAPI = proxyAPI } schemaRegAddr = stringSliceOr( @@ -233,7 +233,7 @@ func NewStartCommand( ",", ), ) - schemaRegApi, err := parseNamedAddresses( + schemaRegAPI, err := parseNamedAddresses( schemaRegAddr, config.DefaultSchemaRegPort, ) @@ -241,11 +241,11 @@ func NewStartCommand( sendEnv(fs, mgr, env, conf, !prestartCfg.checkEnabled, err) return err } - if len(schemaRegApi) > 0 { + if len(schemaRegAPI) > 0 { if conf.SchemaRegistry == nil { conf.SchemaRegistry = config.Default().SchemaRegistry } - conf.SchemaRegistry.SchemaRegistryAPI = schemaRegApi + conf.SchemaRegistry.SchemaRegistryAPI = schemaRegAPI } rpcAddr = stringOr( @@ -271,7 +271,7 @@ func NewStartCommand( ",", ), ) - advKafkaApi, err := parseNamedAddresses( + advKafkaAPI, err := parseNamedAddresses( advertisedKafka, config.DefaultKafkaPort, ) @@ -279,8 +279,8 @@ func NewStartCommand( sendEnv(fs, mgr, env, conf, !prestartCfg.checkEnabled, err) return err } - if advKafkaApi != nil { - conf.Redpanda.AdvertisedKafkaApi = advKafkaApi + if advKafkaAPI != nil { + conf.Redpanda.AdvertisedKafkaAPI = advKafkaAPI } advertisedProxy = stringSliceOr( @@ -290,7 +290,7 @@ func NewStartCommand( ",", ), ) - advProxyApi, err := parseNamedAddresses( + advProxyAPI, err := parseNamedAddresses( advertisedProxy, config.DefaultProxyPort, ) @@ -298,11 +298,11 @@ func NewStartCommand( sendEnv(fs, mgr, env, conf, !prestartCfg.checkEnabled, err) return err } - if advProxyApi != nil { + if advProxyAPI != nil { if conf.Pandaproxy == nil { conf.Pandaproxy = config.Default().Pandaproxy } - conf.Pandaproxy.AdvertisedPandaproxyAPI = advProxyApi + conf.Pandaproxy.AdvertisedPandaproxyAPI = advProxyAPI } advertisedRPC = stringOr( @@ -710,13 +710,13 @@ func tuneAll( if err != nil { return []api.TunerPayload{}, err } - params.CpuMask = cpuMask + params.CPUMask = cpuMask } else { - cpuMask, err := hwloc.TranslateToHwLocCpuSet(cpuSet) + cpuMask, err := hwloc.TranslateToHwLocCPUSet(cpuSet) if err != nil { return []api.TunerPayload{}, err } - params.CpuMask = cpuMask + params.CPUMask = cpuMask } err := factory.FillTunerParamsWithValuesFromConfig(params, conf) @@ -792,7 +792,7 @@ func check( } payloads = append(payloads, payload) if !result.IsOk { - if action, exists := checkFailedActions[result.CheckerId]; exists { + if action, exists := checkFailedActions[result.CheckerID]; exists { action(&result) } msg := fmt.Sprintf("System check '%s' failed. Required: %v, Current %v", diff --git a/src/go/rpk/pkg/cli/cmd/redpanda/start_test.go b/src/go/rpk/pkg/cli/cmd/redpanda/start_test.go index ecc159faa56a..fde34e69d72f 100644 --- a/src/go/rpk/pkg/cli/cmd/redpanda/start_test.go +++ b/src/go/rpk/pkg/cli/cmd/redpanda/start_test.go @@ -19,18 +19,22 @@ import ( "github.com/redpanda-data/redpanda/src/go/rpk/pkg/config" "github.com/redpanda-data/redpanda/src/go/rpk/pkg/redpanda" - rp "github.com/redpanda-data/redpanda/src/go/rpk/pkg/redpanda" "github.com/sirupsen/logrus" "github.com/spf13/afero" "github.com/spf13/pflag" "github.com/stretchr/testify/require" ) +const ( + testConfigPath string = "/arbitrary/path/redpanda.yaml" + setFlag string = "--set" +) + type noopLauncher struct { - rpArgs *rp.RedpandaArgs + rpArgs *redpanda.RedpandaArgs } -func (l *noopLauncher) Start(_ string, rpArgs *rp.RedpandaArgs) error { +func (l *noopLauncher) Start(_ string, rpArgs *redpanda.RedpandaArgs) error { l.rpArgs = rpArgs return nil } @@ -104,16 +108,16 @@ func TestParseSeeds(t *testing.T) { arg: []string{"127.0.0.1:1234", "domain.com:9892", "lonely-host", "192.168.34.1"}, expected: []config.SeedServer{ { - config.SocketAddress{"127.0.0.1", 1234}, + Host: config.SocketAddress{Address: "127.0.0.1", Port: 1234}, }, { - config.SocketAddress{"domain.com", 9892}, + Host: config.SocketAddress{Address: "domain.com", Port: 9892}, }, { - config.SocketAddress{"lonely-host", 33145}, + Host: config.SocketAddress{Address: "lonely-host", Port: 33145}, }, { - config.SocketAddress{"192.168.34.1", 33145}, + Host: config.SocketAddress{Address: "192.168.34.1", Port: 33145}, }, }, }, @@ -154,7 +158,7 @@ func TestStartCommand(t *testing.T) { args []string before func(afero.Fs) error after func() - postCheck func(afero.Fs, *rp.RedpandaArgs, *testing.T) + postCheck func(afero.Fs, *redpanda.RedpandaArgs, *testing.T) expectedErrMsg string }{{ name: "should fail if the config at the given path is corrupt", @@ -174,7 +178,7 @@ func TestStartCommand(t *testing.T) { "--config", config.Default().ConfigFile, "--install-dir", "/var/lib/redpanda", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { path := config.Default().ConfigFile exists, err := afero.Exists( fs, @@ -202,8 +206,8 @@ func TestStartCommand(t *testing.T) { before: func(fs afero.Fs) error { return fs.MkdirAll("/arbitrary/path", 0755) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { - path := "/arbitrary/path/redpanda.yaml" + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { + path := testConfigPath mgr := config.NewManager(fs) conf, err := mgr.Read(path) require.NoError(st, err) @@ -244,14 +248,14 @@ func TestStartCommand(t *testing.T) { }, after: func() { for i, a := range os.Args { - if a == "--set" { + if a == setFlag { os.Args = os.Args[:i] return } } }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { - path := "/arbitrary/path/redpanda.yaml" + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { + path := testConfigPath mgr := config.NewManager(fs) conf, err := mgr.Read(path) require.NoError(st, err) @@ -261,7 +265,7 @@ func TestStartCommand(t *testing.T) { Port: 9643, }, }} - expectedKafkaApi := []config.NamedSocketAddress{{ + expectedKafkaAPI := []config.NamedSocketAddress{{ Name: "external", SocketAddress: config.SocketAddress{ Address: "192.168.73.45", @@ -274,9 +278,9 @@ func TestStartCommand(t *testing.T) { Port: 9092, }, }} - require.Exactly(st, 39, conf.Redpanda.Id) - require.Exactly(st, expectedAdmin, conf.Redpanda.AdminApi) - require.Exactly(st, expectedKafkaApi, conf.Redpanda.KafkaApi) + require.Exactly(st, 39, conf.Redpanda.ID) + require.Exactly(st, expectedAdmin, conf.Redpanda.AdminAPI) + require.Exactly(st, expectedKafkaAPI, conf.Redpanda.KafkaAPI) }, }, { name: "it should still save values passed through field-specific flags, and prioritize them if they overlap with values set with --set", @@ -316,14 +320,14 @@ func TestStartCommand(t *testing.T) { }, after: func() { for i, a := range os.Args { - if a == "--set" { + if a == setFlag { os.Args = os.Args[:i] return } } }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { - path := "/arbitrary/path/redpanda.yaml" + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { + path := testConfigPath mgr := config.NewManager(fs) conf, err := mgr.Read(path) require.NoError(st, err) @@ -333,7 +337,7 @@ func TestStartCommand(t *testing.T) { Port: 9643, }, }} - expectedKafkaApi := []config.NamedSocketAddress{{ + expectedKafkaAPI := []config.NamedSocketAddress{{ Name: "external", SocketAddress: config.SocketAddress{ Address: "192.168.73.45", @@ -346,7 +350,7 @@ func TestStartCommand(t *testing.T) { Port: 9092, }, }} - expectedAdvKafkaApi := []config.NamedSocketAddress{{ + expectedAdvKafkaAPI := []config.NamedSocketAddress{{ Name: "plaintext", SocketAddress: config.SocketAddress{ Address: "192.168.34.32", @@ -354,10 +358,10 @@ func TestStartCommand(t *testing.T) { }, }} // The value set with --node-id should have been prioritized - require.Exactly(st, 42, conf.Redpanda.Id) - require.Exactly(st, expectedAdmin, conf.Redpanda.AdminApi) - require.Exactly(st, expectedKafkaApi, conf.Redpanda.KafkaApi) - require.Exactly(st, expectedAdvKafkaApi, conf.Redpanda.AdvertisedKafkaApi) + require.Exactly(st, 42, conf.Redpanda.ID) + require.Exactly(st, expectedAdmin, conf.Redpanda.AdminAPI) + require.Exactly(st, expectedKafkaAPI, conf.Redpanda.KafkaAPI) + require.Exactly(st, expectedAdvKafkaAPI, conf.Redpanda.AdvertisedKafkaAPI) }, }, { name: "it should evaluate config sources in this order: 1. config file, 2. key-value pairs passed with --set, 3. env vars, 4. specific flags", @@ -378,20 +382,20 @@ func TestStartCommand(t *testing.T) { }, after: func() { for i, a := range os.Args { - if a == "--set" { + if a == setFlag { os.Args = os.Args[:i] return } } }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { - path := "/arbitrary/path/redpanda.yaml" + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { + path := testConfigPath mgr := config.NewManager(fs) conf, err := mgr.Read(path) require.NoError(st, err) // The value set through the --kafka-addr flag should // have been picked. - expectedKafkaApi := []config.NamedSocketAddress{{ + expectedKafkaAPI := []config.NamedSocketAddress{{ Name: "flag", SocketAddress: config.SocketAddress{ Address: "192.168.34.3", @@ -399,7 +403,7 @@ func TestStartCommand(t *testing.T) { }, }} // The value set with --kafka-addr should have been prioritized - require.Exactly(st, expectedKafkaApi, conf.Redpanda.KafkaApi) + require.Exactly(st, expectedKafkaAPI, conf.Redpanda.KafkaAPI) }, }, { name: "it should write the default config file path if --config" + @@ -407,7 +411,7 @@ func TestStartCommand(t *testing.T) { args: []string{ "--install-dir", "/var/lib/redpanda", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { path := config.Default().ConfigFile mgr := config.NewManager(fs) conf, err := mgr.Read(path) @@ -424,7 +428,7 @@ func TestStartCommand(t *testing.T) { conf := config.Default() return mgr.Write(conf) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -437,12 +441,12 @@ func TestStartCommand(t *testing.T) { "--config", config.Default().ConfigFile, "--install-dir", "/var/lib/redpanda", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { path := config.Default().ConfigFile mgr := config.NewManager(fs) conf, err := mgr.Read(path) require.NoError(st, err) - require.Exactly(st, 34, conf.Redpanda.Id) + require.Exactly(st, 34, conf.Redpanda.ID) }, }, { name: "it should write the default node ID if --node-id isn't passed and the config file doesn't exist", @@ -450,13 +454,13 @@ func TestStartCommand(t *testing.T) { "--config", config.Default().ConfigFile, "--install-dir", "/var/lib/redpanda", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { path := config.Default().ConfigFile mgr := config.NewManager(fs) conf, err := mgr.Read(path) require.NoError(st, err) // Check that the generated config is as expected. - require.Exactly(st, config.Default().Redpanda.Id, conf.Redpanda.Id) + require.Exactly(st, config.Default().Redpanda.ID, conf.Redpanda.ID) }, }, { name: "it should leave redpanda.node_id untouched if --node-id wasn't passed", @@ -466,17 +470,17 @@ func TestStartCommand(t *testing.T) { before: func(fs afero.Fs) error { mgr := config.NewManager(fs) conf := config.Default() - conf.Redpanda.Id = 98 + conf.Redpanda.ID = 98 return mgr.Write(conf) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) require.Exactly( st, 98, - conf.Redpanda.Id, + conf.Redpanda.ID, ) }, }, { @@ -486,7 +490,7 @@ func TestStartCommand(t *testing.T) { "--config", config.Default().ConfigFile, "--install-dir", "/var/lib/redpanda", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { path := config.Default().ConfigFile mgr := config.NewManager(fs) conf, err := mgr.Read(path) @@ -505,7 +509,7 @@ func TestStartCommand(t *testing.T) { conf.Rpk.WellKnownIo = "gcp:n2standard:ssd" return mgr.Write(conf) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -524,7 +528,7 @@ func TestStartCommand(t *testing.T) { "--config", config.Default().ConfigFile, "--install-dir", "/var/lib/redpanda", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { path := config.Default().ConfigFile mgr := config.NewManager(fs) conf, err := mgr.Read(path) @@ -542,7 +546,7 @@ func TestStartCommand(t *testing.T) { conf := config.Default() return mgr.Write(conf) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -560,7 +564,7 @@ func TestStartCommand(t *testing.T) { "--config", config.Default().ConfigFile, "--install-dir", "/var/lib/redpanda", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { path := config.Default().ConfigFile mgr := config.NewManager(fs) conf, err := mgr.Read(path) @@ -580,7 +584,7 @@ func TestStartCommand(t *testing.T) { conf.Rpk.EnableMemoryLocking = true return mgr.Write(conf) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -597,7 +601,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--seeds", "192.168.34.32:33145,somehost:54321,justahostnoport", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -631,7 +635,7 @@ func TestStartCommand(t *testing.T) { "-s", "192.168.3.32:33145", "-s", "192.168.123.32:33146,host", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -670,7 +674,7 @@ func TestStartCommand(t *testing.T) { after: func() { os.Unsetenv("REDPANDA_SEEDS") }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -708,7 +712,7 @@ func TestStartCommand(t *testing.T) { }} return mgr.Write(conf) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -743,7 +747,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--rpc-addr", "192.168.34.32:33145", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -764,7 +768,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--rpc-addr", "192.168.34.32", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -798,7 +802,7 @@ func TestStartCommand(t *testing.T) { after: func() { os.Unsetenv("REDPANDA_RPC_ADDRESS") }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -827,7 +831,7 @@ func TestStartCommand(t *testing.T) { } return mgr.Write(conf) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -848,7 +852,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--kafka-addr", "192.168.34.32:33145", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -862,7 +866,7 @@ func TestStartCommand(t *testing.T) { require.Exactly( st, expectedAddr, - conf.Redpanda.KafkaApi, + conf.Redpanda.KafkaAPI, ) }, }, { @@ -871,7 +875,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--kafka-addr", "192.168.34.32", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -885,7 +889,7 @@ func TestStartCommand(t *testing.T) { require.Exactly( st, expectedAddr, - conf.Redpanda.KafkaApi, + conf.Redpanda.KafkaAPI, ) }, }, { @@ -894,7 +898,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--kafka-addr", "nondefaultname://192.168.34.32", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -909,7 +913,7 @@ func TestStartCommand(t *testing.T) { require.Exactly( st, expectedAddr, - conf.Redpanda.KafkaApi, + conf.Redpanda.KafkaAPI, ) }, }, { @@ -918,7 +922,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--kafka-addr", "nondefaultname://192.168.34.32,host:9092", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -938,7 +942,7 @@ func TestStartCommand(t *testing.T) { require.Exactly( st, expectedAddr, - conf.Redpanda.KafkaApi, + conf.Redpanda.KafkaAPI, ) }, }, { @@ -960,7 +964,7 @@ func TestStartCommand(t *testing.T) { after: func() { os.Unsetenv("REDPANDA_KAFKA_ADDRESS") }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -974,7 +978,7 @@ func TestStartCommand(t *testing.T) { require.Exactly( st, expectedAddr, - conf.Redpanda.KafkaApi, + conf.Redpanda.KafkaAPI, ) }, }, { @@ -985,7 +989,7 @@ func TestStartCommand(t *testing.T) { before: func(fs afero.Fs) error { mgr := config.NewManager(fs) conf := config.Default() - conf.Redpanda.KafkaApi = []config.NamedSocketAddress{{ + conf.Redpanda.KafkaAPI = []config.NamedSocketAddress{{ SocketAddress: config.SocketAddress{ Address: "192.168.33.33", Port: 9892, @@ -993,7 +997,7 @@ func TestStartCommand(t *testing.T) { }} return mgr.Write(conf) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1007,7 +1011,7 @@ func TestStartCommand(t *testing.T) { require.Exactly( st, expectedAddr, - conf.Redpanda.KafkaApi, + conf.Redpanda.KafkaAPI, ) }, }, { @@ -1016,7 +1020,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--advertise-kafka-addr", "192.168.34.32:33145", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1030,7 +1034,7 @@ func TestStartCommand(t *testing.T) { require.Exactly( st, expectedAddr, - conf.Redpanda.AdvertisedKafkaApi, + conf.Redpanda.AdvertisedKafkaAPI, ) }, }, { @@ -1039,7 +1043,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--advertise-kafka-addr", "192.168.34.32", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1053,7 +1057,7 @@ func TestStartCommand(t *testing.T) { require.Exactly( st, expectedAddr, - conf.Redpanda.AdvertisedKafkaApi, + conf.Redpanda.AdvertisedKafkaAPI, ) }, }, { @@ -1075,7 +1079,7 @@ func TestStartCommand(t *testing.T) { after: func() { os.Unsetenv("REDPANDA_ADVERTISE_KAFKA_ADDRESS") }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1089,7 +1093,7 @@ func TestStartCommand(t *testing.T) { require.Exactly( st, expectedAddr, - conf.Redpanda.AdvertisedKafkaApi, + conf.Redpanda.AdvertisedKafkaAPI, ) }, }, { @@ -1100,7 +1104,7 @@ func TestStartCommand(t *testing.T) { before: func(fs afero.Fs) error { mgr := config.NewManager(fs) conf := config.Default() - conf.Redpanda.AdvertisedKafkaApi = []config.NamedSocketAddress{{ + conf.Redpanda.AdvertisedKafkaAPI = []config.NamedSocketAddress{{ SocketAddress: config.SocketAddress{ Address: "192.168.33.33", Port: 9892, @@ -1108,7 +1112,7 @@ func TestStartCommand(t *testing.T) { }} return mgr.Write(conf) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1122,7 +1126,7 @@ func TestStartCommand(t *testing.T) { require.Exactly( st, expectedAddr, - conf.Redpanda.AdvertisedKafkaApi, + conf.Redpanda.AdvertisedKafkaAPI, ) }, }, { @@ -1131,7 +1135,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--advertise-pandaproxy-addr", "192.168.34.32:8083", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1160,7 +1164,7 @@ func TestStartCommand(t *testing.T) { after: func() { os.Unsetenv("REDPANDA_ADVERTISE_PANDAPROXY_ADDRESS") }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1183,7 +1187,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--advertise-rpc-addr", "192.168.34.32:33145", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1204,7 +1208,7 @@ func TestStartCommand(t *testing.T) { "--install-dir", "/var/lib/redpanda", "--advertise-rpc-addr", "192.168.34.32", }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1238,7 +1242,7 @@ func TestStartCommand(t *testing.T) { after: func() { os.Unsetenv("REDPANDA_ADVERTISE_RPC_ADDRESS") }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1267,7 +1271,7 @@ func TestStartCommand(t *testing.T) { } return mgr.Write(conf) }, - postCheck: func(fs afero.Fs, _ *rp.RedpandaArgs, st *testing.T) { + postCheck: func(fs afero.Fs, _ *redpanda.RedpandaArgs, st *testing.T) { mgr := config.NewManager(fs) conf, err := mgr.Read(config.Default().ConfigFile) require.NoError(st, err) @@ -1333,7 +1337,7 @@ func TestStartCommand(t *testing.T) { }, postCheck: func( _ afero.Fs, - rpArgs *rp.RedpandaArgs, + rpArgs *redpanda.RedpandaArgs, st *testing.T, ) { require.Equal(st, "55", rpArgs.SeastarFlags["smp"]) @@ -1353,7 +1357,7 @@ func TestStartCommand(t *testing.T) { }, postCheck: func( _ afero.Fs, - rpArgs *rp.RedpandaArgs, + rpArgs *redpanda.RedpandaArgs, st *testing.T, ) { require.Equal(st, "archival=debug:cloud_storage=debug", rpArgs.SeastarFlags["logger-log-level"]) @@ -1366,7 +1370,7 @@ func TestStartCommand(t *testing.T) { }, postCheck: func( _ afero.Fs, - rpArgs *rp.RedpandaArgs, + rpArgs *redpanda.RedpandaArgs, st *testing.T, ) { require.Equal(st, "4G", rpArgs.SeastarFlags["memory"]) @@ -1388,7 +1392,7 @@ func TestStartCommand(t *testing.T) { }, postCheck: func( _ afero.Fs, - rpArgs *rp.RedpandaArgs, + rpArgs *redpanda.RedpandaArgs, st *testing.T, ) { expected := []string{ @@ -1405,7 +1409,7 @@ func TestStartCommand(t *testing.T) { } fs := afero.NewMemMapFs() mgr := config.NewManager(fs) - var launcher rp.Launcher = &noopLauncher{} + var launcher redpanda.Launcher = &noopLauncher{} if tt.launcher != nil { launcher = tt.launcher } diff --git a/src/go/rpk/pkg/cli/cmd/redpanda/stop.go b/src/go/rpk/pkg/cli/cmd/redpanda/stop.go index 1685ddbad458..5f452ba82373 100644 --- a/src/go/rpk/pkg/cli/cmd/redpanda/stop.go +++ b/src/go/rpk/pkg/cli/cmd/redpanda/stop.go @@ -92,14 +92,14 @@ func executeStop( if err != nil { return err } - return signalAndWait(fs, pid, timeout) + return signalAndWait(pid, timeout) } -func signalAndWait(fs afero.Fs, pid int, timeout time.Duration) error { +func signalAndWait(pid int, timeout time.Duration) error { var f func(int, []syscall.Signal) error f = func(pid int, signals []syscall.Signal) error { if len(signals) == 0 { - return errors.New("process couldn't be terminated.") + return errors.New("process couldn't be terminated") } signal := signals[0] pending := signals[1:] diff --git a/src/go/rpk/pkg/cli/cmd/redpanda/tune.go b/src/go/rpk/pkg/cli/cmd/redpanda/tune.go index 169eca2f6fec..105763b244d9 100644 --- a/src/go/rpk/pkg/cli/cmd/redpanda/tune.go +++ b/src/go/rpk/pkg/cli/cmd/redpanda/tune.go @@ -86,11 +86,11 @@ func NewTuneCommand(fs afero.Fs, mgr config.Manager) *cobra.Command { } else { tuners = strings.Split(args[0], ",") } - cpuMask, err := hwloc.TranslateToHwLocCpuSet(cpuSet) + cpuMask, err := hwloc.TranslateToHwLocCPUSet(cpuSet) if err != nil { return err } - tunerParams.CpuMask = cpuMask + tunerParams.CPUMask = cpuMask conf, err := mgr.FindOrGenerate(configFile) if err != nil { if !interactive { @@ -118,7 +118,7 @@ Would you like to continue with the default configuration?`, tunerFactory = factory.NewDirectExecutorTunersFactory( fs, *conf, timeout) } - return tune(fs, conf, tuners, tunerFactory, &tunerParams) + return tune(conf, tuners, tunerFactory, &tunerParams) }, } command.Flags().StringVarP(&tunerParams.Mode, @@ -203,7 +203,6 @@ func promptConfirmation(msg string, in io.Reader) (bool, error) { } func tune( - fs afero.Fs, conf *config.Config, tunerNames []string, tunersFactory factory.TunersFactory, diff --git a/src/go/rpk/pkg/cli/cmd/redpanda/tune/help.go b/src/go/rpk/pkg/cli/cmd/redpanda/tune/help.go index 8666061601ab..db75a58489d6 100644 --- a/src/go/rpk/pkg/cli/cmd/redpanda/tune/help.go +++ b/src/go/rpk/pkg/cli/cmd/redpanda/tune/help.go @@ -74,7 +74,7 @@ This tuner performs the following operations: - Disable Hyper Threading - Sets the ACPI-cpufreq governor to ‘performance’ -Additionaly if system reboot is allowed: +Additionally if system reboot is allowed: - Disable Hyper Threading via Kernel boot parameter - Disable Intel P-States - Disable Intel C-States diff --git a/src/go/rpk/pkg/cli/cmd/root.go b/src/go/rpk/pkg/cli/cmd/root.go index 44b6b427fbd9..077f98d493ed 100644 --- a/src/go/rpk/pkg/cli/cmd/root.go +++ b/src/go/rpk/pkg/cli/cmd/root.go @@ -30,7 +30,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/afero" "github.com/spf13/cobra" - "golang.org/x/crypto/ssh/terminal" + "golang.org/x/term" ) func Execute() { @@ -38,7 +38,7 @@ func Execute() { fs := afero.NewOsFs() mgr := config.NewManager(fs) - if !terminal.IsTerminal(int(os.Stdout.Fd())) { + if !term.IsTerminal(int(os.Stdout.Fd())) { color.NoColor = true } log.SetFormatter(cli.NewRpkLogFormatter()) @@ -64,12 +64,12 @@ func Execute() { rootCmd.AddCommand(NewGenerateCommand(mgr)) rootCmd.AddCommand(NewVersionCommand()) - rootCmd.AddCommand(NewWasmCommand(fs, mgr)) + rootCmd.AddCommand(NewWasmCommand(fs)) rootCmd.AddCommand(NewContainerCommand()) - rootCmd.AddCommand(NewTopicCommand(fs, mgr)) + rootCmd.AddCommand(NewTopicCommand(fs)) rootCmd.AddCommand(NewClusterCommand(fs)) - rootCmd.AddCommand(NewACLCommand(fs, mgr)) - rootCmd.AddCommand(group.NewCommand(fs, mgr)) + rootCmd.AddCommand(NewACLCommand(fs)) + rootCmd.AddCommand(group.NewCommand(fs)) rootCmd.AddCommand(plugincmd.NewCommand(fs)) @@ -196,7 +196,7 @@ func addPluginWithExec( // recursively below when there is more than one piece. p0 := pieces[0] - childCmd, args, err := parentCmd.Find(pieces) + childCmd, _, err := parentCmd.Find(pieces) // If the command does not exist, then err will be non-nil. If the // command does not exist and the parent does not have subcommands, @@ -211,7 +211,7 @@ func addPluginWithExec( } if len(pieces) > 1 { // recursive: we are not done yet adding our nested command - args = pieces[1:] + args := pieces[1:] addPluginWithExec(childCmd, args, execPath) return } @@ -229,7 +229,7 @@ func addPluginWithExec( out, err := (&exec.Cmd{ Path: execPath, - Args: append([]string{execPath, plugin.FlagAutoComplete}), + Args: []string{execPath, plugin.FlagAutoComplete}, Env: os.Environ(), }).Output() if err != nil { diff --git a/src/go/rpk/pkg/cli/cmd/root_linux.go b/src/go/rpk/pkg/cli/cmd/root_linux.go index 10bf678ab052..89fa57706b46 100644 --- a/src/go/rpk/pkg/cli/cmd/root_linux.go +++ b/src/go/rpk/pkg/cli/cmd/root_linux.go @@ -28,6 +28,6 @@ func addPlatformDependentCmds( cmd.AddCommand(NewStartCommand(fs, mgr, redpanda.NewLauncher())) cmd.AddCommand(NewStopCommand(fs, mgr)) cmd.AddCommand(NewConfigCommand(fs, mgr)) - cmd.AddCommand(NewStatusCommand(fs, mgr)) + cmd.AddCommand(NewStatusCommand(fs)) cmd.AddCommand(NewModeCommand(mgr)) } diff --git a/src/go/rpk/pkg/cli/cmd/root_test.go b/src/go/rpk/pkg/cli/cmd/root_test.go index a50e1564ceba..c68ebb6a76e5 100644 --- a/src/go/rpk/pkg/cli/cmd/root_test.go +++ b/src/go/rpk/pkg/cli/cmd/root_test.go @@ -126,7 +126,7 @@ func (t testPluginHandler) exec(path string, args []string) error { } file := strings.TrimPrefix(path, testPluginPathPrefix) if file == testPluginFileExecError { - return errors.New("error!") + return errors.New("error") } argHits := t[file] if argHits == nil { diff --git a/src/go/rpk/pkg/cli/cmd/status.go b/src/go/rpk/pkg/cli/cmd/status.go index 834cd0bd723c..3d87ad256342 100644 --- a/src/go/rpk/pkg/cli/cmd/status.go +++ b/src/go/rpk/pkg/cli/cmd/status.go @@ -12,12 +12,11 @@ package cmd import ( "github.com/redpanda-data/redpanda/src/go/rpk/pkg/cli/cmd/common" "github.com/redpanda-data/redpanda/src/go/rpk/pkg/cli/cmd/debug" - "github.com/redpanda-data/redpanda/src/go/rpk/pkg/config" "github.com/spf13/afero" "github.com/spf13/cobra" ) -func NewStatusCommand(fs afero.Fs, mgr config.Manager) *cobra.Command { +func NewStatusCommand(fs afero.Fs) *cobra.Command { return common.Deprecated( debug.NewInfoCommand(fs), "rpk debug info", diff --git a/src/go/rpk/pkg/cli/cmd/topic.go b/src/go/rpk/pkg/cli/cmd/topic.go index fb1556e6b094..c523988c26ab 100644 --- a/src/go/rpk/pkg/cli/cmd/topic.go +++ b/src/go/rpk/pkg/cli/cmd/topic.go @@ -12,12 +12,11 @@ package cmd import ( "github.com/redpanda-data/redpanda/src/go/rpk/pkg/cli/cmd/common" "github.com/redpanda-data/redpanda/src/go/rpk/pkg/cli/cmd/topic" - "github.com/redpanda-data/redpanda/src/go/rpk/pkg/config" "github.com/spf13/afero" "github.com/spf13/cobra" ) -func NewTopicCommand(fs afero.Fs, mgr config.Manager) *cobra.Command { +func NewTopicCommand(fs afero.Fs) *cobra.Command { var ( brokers []string configFile string diff --git a/src/go/rpk/pkg/cli/cmd/topic/consume.go b/src/go/rpk/pkg/cli/cmd/topic/consume.go index fa9ee2212ba4..98b8309fe114 100644 --- a/src/go/rpk/pkg/cli/cmd/topic/consume.go +++ b/src/go/rpk/pkg/cli/cmd/topic/consume.go @@ -48,7 +48,6 @@ type consumer struct { metaOnly bool // specific to -f json resetOffset kgo.Offset // defaults to NoResetOffset, can be start or end - start int64 // TODO doc // If an end offset is specified, we immediately look up where we will // end and quit rpk when we hit the end. @@ -80,7 +79,7 @@ func NewConsumeCommand(fs afero.Fs) *cobra.Command { err = c.parseOffset(offset, topics, adm) out.MaybeDie(err, "invalid --offset %q: %v", offset, err) - if allEmpty := c.filterEmptyPartitions(adm); allEmpty { + if allEmpty := c.filterEmptyPartitions(); allEmpty { return } @@ -244,7 +243,7 @@ func (c *consumer) writeRecordJSON(r *kgo.Record) { for _, h := range r.Headers { m.Headers = append(m.Headers, Header{ - Key: string(h.Key), + Key: h.Key, Value: string(h.Value), }) } @@ -272,6 +271,9 @@ func (c *consumer) parseOffset( } start, end, rel, atStart, atEnd, hasEnd, currentEnd, err := parseFromToOffset(offset) + if err != nil { + return fmt.Errorf("unable to parse offset: %v", err) + } if atStart { c.resetOffset = kgo.NewOffset().AtStart().Relative(rel) @@ -352,7 +354,7 @@ func (c *consumer) setParts( // - currentEnd: consume until the *current* end offset // // - if !atStart && !atEnd, then we consume at the returned start number -// - rel is used for relative offsets from atStart or atEnd +// - rel is used for relative offsets from atStart or atEnd. // func parseFromToOffset( o string, @@ -383,7 +385,7 @@ func parseFromToOffset( // oo, oo:, and :oo if start, err = strconv.ParseInt(o, 10, 64); err == nil { - return + return //nolint:nilerr // false positive with naked returns } else if strings.HasSuffix(o, ":") { start, err = strconv.ParseInt(o[:len(o)-1], 10, 64) return @@ -558,7 +560,7 @@ func (c *consumer) parseTimeOffset( // // Depending on our order of requests and pathological timing, end could // come before the start; in this case we also filter the partition. -func (c *consumer) filterEmptyPartitions(adm *kadm.Client) (allEmpty bool) { +func (c *consumer) filterEmptyPartitions() (allEmpty bool) { if c.partEnds == nil { return false } diff --git a/src/go/rpk/pkg/cli/cmd/topic/describe.go b/src/go/rpk/pkg/cli/cmd/topic/describe.go index e12c8af400f7..77bc9062d2c7 100644 --- a/src/go/rpk/pkg/cli/cmd/topic/describe.go +++ b/src/go/rpk/pkg/cli/cmd/topic/describe.go @@ -276,7 +276,7 @@ func describePartitionsRows( } else if errors.Is(o.startErr, errUnlisted) { row = append(row, "-") } else { - row = append(row, o.startErr.(*kerr.Error).Message) + row = append(row, o.startErr.(*kerr.Error).Message) //nolint:errorlint // This error must be kerr.Error, and we want the message } if stable { if o.stableErr == nil { @@ -284,7 +284,7 @@ func describePartitionsRows( } else if errors.Is(o.stableErr, errUnlisted) { row = append(row, "-") } else { - row = append(row, o.stableErr.(*kerr.Error).Message) + row = append(row, o.stableErr.(*kerr.Error).Message) //nolint:errorlint // This error must be kerr.Error, and we want the message } } if o.endErr == nil { @@ -292,7 +292,7 @@ func describePartitionsRows( } else if errors.Is(o.endErr, errUnlisted) { row = append(row, "-") } else { - row = append(row, o.endErr.(*kerr.Error).Message) + row = append(row, o.endErr.(*kerr.Error).Message) //nolint:errorlint // This error must be kerr.Error, and we want the message } rows = append(rows, row) } diff --git a/src/go/rpk/pkg/cli/cmd/topic/produce.go b/src/go/rpk/pkg/cli/cmd/topic/produce.go index 0ccef0bb6b52..4f95227a9eaa 100644 --- a/src/go/rpk/pkg/cli/cmd/topic/produce.go +++ b/src/go/rpk/pkg/cli/cmd/topic/produce.go @@ -11,6 +11,7 @@ package topic import ( "context" + "errors" "fmt" "io" "os" @@ -112,7 +113,7 @@ func NewProduceCommand(fs afero.Fs) *cobra.Command { out.MaybeDie(err, "unable to parse input headers: %v", err) headers := make([]kgo.RecordHeader, 0, len(kvs)) for k, v := range kvs { - headers = append(headers, kgo.RecordHeader{k, []byte(v)}) + headers = append(headers, kgo.RecordHeader{Key: k, Value: []byte(v)}) } // We are now ready to produce. @@ -134,7 +135,7 @@ func NewProduceCommand(fs afero.Fs) *cobra.Command { r.Key = []byte(key) } if err := inf.ReadRecordInto(r); err != nil { - if err != io.EOF { + if !errors.Is(err, io.EOF) { fmt.Fprintf(os.Stderr, "record read error: %v\n", err) } return diff --git a/src/go/rpk/pkg/cli/cmd/wasm.go b/src/go/rpk/pkg/cli/cmd/wasm.go index f826880b9e38..59199c2f0387 100644 --- a/src/go/rpk/pkg/cli/cmd/wasm.go +++ b/src/go/rpk/pkg/cli/cmd/wasm.go @@ -12,12 +12,11 @@ package cmd import ( "github.com/redpanda-data/redpanda/src/go/rpk/pkg/cli/cmd/common" "github.com/redpanda-data/redpanda/src/go/rpk/pkg/cli/cmd/wasm" - "github.com/redpanda-data/redpanda/src/go/rpk/pkg/config" "github.com/spf13/afero" "github.com/spf13/cobra" ) -func NewWasmCommand(fs afero.Fs, mgr config.Manager) *cobra.Command { +func NewWasmCommand(fs afero.Fs) *cobra.Command { var ( configFile string brokers []string diff --git a/src/go/rpk/pkg/cli/cmd/wasm/common.go b/src/go/rpk/pkg/cli/cmd/wasm/common.go index 14c1ab6edfd0..66e116e81c6a 100644 --- a/src/go/rpk/pkg/cli/cmd/wasm/common.go +++ b/src/go/rpk/pkg/cli/cmd/wasm/common.go @@ -4,6 +4,7 @@ import ( "context" "crypto/sha256" "encoding/binary" + "errors" "fmt" "github.com/cespare/xxhash" @@ -54,12 +55,10 @@ func ensureCoprocTopic(cl *kgo.Client) error { return err } err = kerr.ErrorForCode(resp.Topics[0].ErrorCode) - switch err { - case nil: - // topic did not exist - case kerr.TopicAlreadyExists: - // topic exists, fine - default: + + // nil error = topic did not exist + // and it's fine that the topic exists + if err != nil && !errors.Is(err, kerr.TopicAlreadyExists) { return err } return nil diff --git a/src/go/rpk/pkg/cli/cmd/wasm/generate.go b/src/go/rpk/pkg/cli/cmd/wasm/generate.go index d56eec14b596..ff6e5250ff00 100644 --- a/src/go/rpk/pkg/cli/cmd/wasm/generate.go +++ b/src/go/rpk/pkg/cli/cmd/wasm/generate.go @@ -56,61 +56,61 @@ func generateManifest(version string) map[string][]genFile { "src": {genFile{name: "main.js", content: template.WasmJs()}}, "test": {genFile{name: "main.test.js", content: template.WasmTestJs()}}, "": { - genFile{name: "package.json", content: template.PackageJson(version)}, + genFile{name: "package.json", content: template.PackageJSON(version)}, genFile{name: "webpack.js", content: template.Webpack(), permission: 0o766}, }, } } -const defApiVersion = "21.8.2" +const defAPIVersion = "21.8.2" -func getWasmApiVersion(wasmApi string) string { +func getWasmAPIVersion(wasmAPI string) string { var result []map[string]interface{} - if err := json.Unmarshal([]byte(wasmApi), &result); err != nil { - fmt.Printf("Can not parse json from npm search: '%s', Error: %s\n", wasmApi, err) - return defApiVersion + if err := json.Unmarshal([]byte(wasmAPI), &result); err != nil { + fmt.Printf("Can not parse json from npm search: '%s', Error: %s\n", wasmAPI, err) + return defAPIVersion } if len(result) != 1 { fmt.Printf("Wrong npm search result: %v", result) - return defApiVersion + return defAPIVersion } version, ok := result[0]["version"].(string) if !ok { fmt.Printf("Can not get version from npm search result: %s\n", result) - return defApiVersion + return defAPIVersion } return version } // latestClientApiVersion looks up the latest version of our client library using npm, // defaulting if anything fails. -func latestClientApiVersion() string { +func latestClientAPIVersion() string { if _, err := exec.LookPath("npm"); err != nil { - fmt.Printf("npm not found, defaulting to client API version %s.\n", defApiVersion) - return defApiVersion + fmt.Printf("npm not found, defaulting to client API version %s.\n", defAPIVersion) + return defAPIVersion } proc := vos.NewProc() output, err := proc.RunWithSystemLdPath(2*time.Second, "npm", "search", "@vectorizedio/wasm-api", "--json") if err != nil { log.Error(err) - return defApiVersion + return defAPIVersion } - wasmApi := strings.Join(output, "") + wasmAPI := strings.Join(output, "") - return getWasmApiVersion(wasmApi) + return getWasmAPIVersion(wasmAPI) } func executeGenerate(fs afero.Fs, path string, skipVersion bool) error { var preexisting []string var version string if skipVersion { - version = defApiVersion + version = defAPIVersion } else { - version = latestClientApiVersion() + version = latestClientAPIVersion() } for dir, templates := range generateManifest(version) { for _, template := range templates { diff --git a/src/go/rpk/pkg/cli/cmd/wasm/generate_test.go b/src/go/rpk/pkg/cli/cmd/wasm/generate_test.go index 1943cb69b053..6656fc7f9da1 100644 --- a/src/go/rpk/pkg/cli/cmd/wasm/generate_test.go +++ b/src/go/rpk/pkg/cli/cmd/wasm/generate_test.go @@ -39,22 +39,22 @@ func TestGetWasmApiVersion(t *testing.T) { { name: "should get default vectorized WASM API version if npm search returns random string", input: "Random string\n", - output: defApiVersion, + output: defAPIVersion, }, { name: "should get default vectorized WASM API version if npm search returns null string", input: "", - output: defApiVersion, + output: defAPIVersion, }, { name: "should get default vectorized WASM API version if npm search returns null JSON array", input: "[]", - output: defApiVersion, + output: defAPIVersion, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - version := getWasmApiVersion(test.input) + version := getWasmAPIVersion(test.input) require.Exactly(t, version, test.output) }) } @@ -75,17 +75,17 @@ func TestWasmCommand(t *testing.T) { path: "new_folder/new_sub_folder/wasm", pre: nil, post: map[string]testfs.Fmode{ - "new_folder/new_sub_folder/wasm/src/main.js": {0o600, template.WasmJs()}, - "new_folder/new_sub_folder/wasm/test/main.test.js": {0o600, template.WasmTestJs()}, - "new_folder/new_sub_folder/wasm/package.json": {0o600, template.PackageJson(defApiVersion)}, - "new_folder/new_sub_folder/wasm/webpack.js": {0o766, template.Webpack()}, + "new_folder/new_sub_folder/wasm/src/main.js": {Mode: 0o600, Contents: template.WasmJs()}, + "new_folder/new_sub_folder/wasm/test/main.test.js": {Mode: 0o600, Contents: template.WasmTestJs()}, + "new_folder/new_sub_folder/wasm/package.json": {Mode: 0o600, Contents: template.PackageJSON(defAPIVersion)}, + "new_folder/new_sub_folder/wasm/webpack.js": {Mode: 0o766, Contents: template.Webpack()}, }, }, { name: "should fail if the given dir contains files created by this command*", path: "wasm", - pre: map[string]testfs.Fmode{"wasm/package.json": {0o300, "foo"}}, - post: map[string]testfs.Fmode{"wasm/package.json": {0o300, "foo"}}, + pre: map[string]testfs.Fmode{"wasm/package.json": {Mode: 0o300, Contents: "foo"}}, + post: map[string]testfs.Fmode{"wasm/package.json": {Mode: 0o300, Contents: "foo"}}, expNot: []string{"wasm/src/main.js", "wasm/test/main.test.js", "wasm/webpack.js"}, expErr: true, }, diff --git a/src/go/rpk/pkg/cli/cmd/wasm/template/package_json.go b/src/go/rpk/pkg/cli/cmd/wasm/template/package_json.go index a7e2eb0ba54f..b730ac43a984 100644 --- a/src/go/rpk/pkg/cli/cmd/wasm/template/package_json.go +++ b/src/go/rpk/pkg/cli/cmd/wasm/template/package_json.go @@ -11,7 +11,7 @@ package template import "fmt" -const packageJson = `{ +const packageJSON = `{ "name": "wasm-panda", "version": "0.0.1", "description": "inline wasm transforms sdk", @@ -35,6 +35,6 @@ const packageJson = `{ } ` -func PackageJson(version string) string { - return fmt.Sprintf(packageJson, version) +func PackageJSON(version string) string { + return fmt.Sprintf(packageJSON, version) } diff --git a/src/go/rpk/pkg/cli/log_formatter.go b/src/go/rpk/pkg/cli/log_formatter.go index a35c442bca57..298e186bb275 100644 --- a/src/go/rpk/pkg/cli/log_formatter.go +++ b/src/go/rpk/pkg/cli/log_formatter.go @@ -54,7 +54,7 @@ func (f rpkLogFormatter) Format(entry *logrus.Entry) ([]byte, error) { return b.Bytes(), nil } -func (f rpkLogFormatter) getPrinter( +func (rpkLogFormatter) getPrinter( lvl logrus.Level, ) func(io.Writer, ...interface{}) (int, error) { if color, exists := logLevelColorMap[lvl]; exists { diff --git a/src/go/rpk/pkg/cloud/aws/aws.go b/src/go/rpk/pkg/cloud/aws/aws.go index c8f91eac6c8a..3dc53fc0cb8f 100644 --- a/src/go/rpk/pkg/cloud/aws/aws.go +++ b/src/go/rpk/pkg/cloud/aws/aws.go @@ -26,11 +26,11 @@ type InitializedAwsVendor struct { client *ec2metadata.EC2Metadata } -func (v *AwsVendor) Name() string { +func (*AwsVendor) Name() string { return name } -func (v *AwsVendor) Init() (vendor.InitializedVendor, error) { +func (*AwsVendor) Init() (vendor.InitializedVendor, error) { s, err := session.NewSession() if err != nil { return nil, err @@ -42,11 +42,11 @@ func (v *AwsVendor) Init() (vendor.InitializedVendor, error) { return nil, errors.New("vendor AWS couldn't be initialized") } -func (v *InitializedAwsVendor) VmType() (string, error) { +func (v *InitializedAwsVendor) VMType() (string, error) { return v.client.GetMetadata("instance-type") } -func (v *InitializedAwsVendor) Name() string { +func (*InitializedAwsVendor) Name() string { return name } diff --git a/src/go/rpk/pkg/cloud/gcp/gcp.go b/src/go/rpk/pkg/cloud/gcp/gcp.go index 4d134a41579b..794f67bd861e 100644 --- a/src/go/rpk/pkg/cloud/gcp/gcp.go +++ b/src/go/rpk/pkg/cloud/gcp/gcp.go @@ -27,11 +27,11 @@ type InitializedGcpVendor struct { client *metadata.Client } -func (v *GcpVendor) Name() string { +func (*GcpVendor) Name() string { return name } -func (v *GcpVendor) Init() (vendor.InitializedVendor, error) { +func (*GcpVendor) Init() (vendor.InitializedVendor, error) { timeout := 500 * time.Millisecond client := metadata.NewClient(&http.Client{Timeout: timeout}) if available(client, timeout) { @@ -40,7 +40,7 @@ func (v *GcpVendor) Init() (vendor.InitializedVendor, error) { return nil, errors.New("vendor GCP couldn't be initialized") } -func (v *InitializedGcpVendor) VmType() (string, error) { +func (v *InitializedGcpVendor) VMType() (string, error) { t, err := v.client.Get("instance/machine-type") if err != nil { return "", err @@ -52,7 +52,7 @@ func (v *InitializedGcpVendor) VmType() (string, error) { return filepath.Base(t), nil } -func (v *InitializedGcpVendor) Name() string { +func (*InitializedGcpVendor) Name() string { return name } diff --git a/src/go/rpk/pkg/cloud/vendor/vendor.go b/src/go/rpk/pkg/cloud/vendor/vendor.go index 52eb48b8aa7d..b67243383ed6 100644 --- a/src/go/rpk/pkg/cloud/vendor/vendor.go +++ b/src/go/rpk/pkg/cloud/vendor/vendor.go @@ -16,5 +16,5 @@ type Vendor interface { type InitializedVendor interface { Name() string - VmType() (string, error) + VMType() (string, error) } diff --git a/src/go/rpk/pkg/cloud/vendors.go b/src/go/rpk/pkg/cloud/vendors.go index b11cfa39b254..13a2e022952c 100644 --- a/src/go/rpk/pkg/cloud/vendors.go +++ b/src/go/rpk/pkg/cloud/vendors.go @@ -29,7 +29,7 @@ func vendors() map[string]vendor.Vendor { return vendors } -// Tries to initializes the vendors and returns the one available, or an error +// AvailableVendor tries to initialize the vendors and returns the one available, or an error // if none could be initialized. func AvailableVendor() (vendor.InitializedVendor, error) { return availableVendorFrom(vendors()) diff --git a/src/go/rpk/pkg/cloud/vendors_test.go b/src/go/rpk/pkg/cloud/vendors_test.go index 965e21176836..2bc5fe5d1ded 100644 --- a/src/go/rpk/pkg/cloud/vendors_test.go +++ b/src/go/rpk/pkg/cloud/vendors_test.go @@ -34,7 +34,7 @@ func (v *mockVendor) Init() (vendor.InitializedVendor, error) { return v, nil } -func (v *mockVendor) VmType() (string, error) { +func (v *mockVendor) VMType() (string, error) { return v.vmType, nil } diff --git a/src/go/rpk/pkg/config/config.go b/src/go/rpk/pkg/config/config.go index 02fd95f327c4..43888f180da3 100644 --- a/src/go/rpk/pkg/config/config.go +++ b/src/go/rpk/pkg/config/config.go @@ -88,12 +88,12 @@ func defaultMap() map[string]interface{} { "address": "0.0.0.0", "port": 9092, } - var defaultListeners []interface{} = []interface{}{defaultListener} + var defaultListeners = []interface{}{defaultListener} var defaultAdminListener interface{} = map[string]interface{}{ "address": "0.0.0.0", "port": 9644, } - var defaultAdminListeners []interface{} = []interface{}{defaultAdminListener} + var defaultAdminListeners = []interface{}{defaultAdminListener} return map[string]interface{}{ "config_file": "/etc/redpanda/redpanda.yaml", "pandaproxy": Pandaproxy{}, @@ -164,8 +164,8 @@ func setDevelopment(conf *Config) *Config { conf.Rpk = RpkConfig{ TLS: conf.Rpk.TLS, SASL: conf.Rpk.SASL, - KafkaApi: conf.Rpk.KafkaApi, - AdminApi: conf.Rpk.AdminApi, + KafkaAPI: conf.Rpk.KafkaAPI, + AdminAPI: conf.Rpk.AdminAPI, AdditionalStartFlags: conf.Rpk.AdditionalStartFlags, EnableUsageStats: conf.Rpk.EnableUsageStats, CoredumpDir: conf.Rpk.CoredumpDir, @@ -184,7 +184,7 @@ func setProduction(conf *Config) *Config { conf.Rpk.TuneNomerges = true conf.Rpk.TuneDiskIrq = true conf.Rpk.TuneFstrim = false - conf.Rpk.TuneCpu = true + conf.Rpk.TuneCPU = true conf.Rpk.TuneAioEvents = true conf.Rpk.TuneClocksource = true conf.Rpk.TuneSwappiness = true @@ -279,12 +279,12 @@ func checkRedpandaConfig(v *viper.Viper) []error { } } - kafkaApiKey := "redpanda.kafka_api" - exists = v.Get(kafkaApiKey) != nil + kafkaAPIKey := "redpanda.kafka_api" + exists = v.Get(kafkaAPIKey) != nil if !exists { errs = append( errs, - fmt.Errorf("%s missing", kafkaApiKey), + fmt.Errorf("%s missing", kafkaAPIKey), ) } else { var kafkaListeners []NamedSocketAddress @@ -293,7 +293,7 @@ func checkRedpandaConfig(v *viper.Viper) []error { log.Error(err) err = fmt.Errorf( "%s doesn't have the expected structure", - kafkaApiKey, + kafkaAPIKey, ) return append( errs, @@ -303,7 +303,7 @@ func checkRedpandaConfig(v *viper.Viper) []error { for i, addr := range kafkaListeners { configPath := fmt.Sprintf( "%s.%d", - kafkaApiKey, + kafkaAPIKey, i, ) errs = append( @@ -377,7 +377,7 @@ func decoderConfig() mapstructure.DecoderConfig { // These 2 hooks are viper's default hooks. // https://github.com/spf13/viper/blob/fb4eafdd9775508c450b90b1b72affeef4a68cf5/viper.go#L1004-L1005 // They're set here because when decoderConfigOptions' resulting - // viper.DecoderConfigOption is used, viper's hooks are overriden. + // viper.DecoderConfigOption is used, viper's hooks are overridden. mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToSliceHookFunc(","), // This hook translates the pre-21.1.4 configuration format to the diff --git a/src/go/rpk/pkg/config/config_test.go b/src/go/rpk/pkg/config/config_test.go index 2958b0c26e88..789104318be5 100644 --- a/src/go/rpk/pkg/config/config_test.go +++ b/src/go/rpk/pkg/config/config_test.go @@ -39,7 +39,7 @@ func getValidConfig() *Config { TuneNomerges: true, TuneDiskIrq: true, TuneFstrim: true, - TuneCpu: true, + TuneCPU: true, TuneAioEvents: true, TuneClocksource: true, TuneSwappiness: true, @@ -68,7 +68,7 @@ func TestSet(t *testing.T) { value: "1", format: "single", check: func(st *testing.T, c *Config, _ *manager) { - require.Exactly(st, 1, c.Redpanda.Id) + require.Exactly(st, 1, c.Redpanda.ID) }, }, { @@ -77,7 +77,7 @@ func TestSet(t *testing.T) { value: "54312", format: "single", check: func(st *testing.T, c *Config, _ *manager) { - require.Exactly(st, 54312, c.Redpanda.Id) + require.Exactly(st, 54312, c.Redpanda.ID) }, }, { @@ -85,7 +85,7 @@ func TestSet(t *testing.T) { key: "redpanda.node_id", value: "54312", check: func(st *testing.T, c *Config, _ *manager) { - require.Exactly(st, 54312, c.Redpanda.Id) + require.Exactly(st, 54312, c.Redpanda.ID) }, }, { @@ -154,7 +154,7 @@ func TestSet(t *testing.T) { TuneDiskScheduler: false, TuneNomerges: false, TuneDiskIrq: true, - TuneCpu: false, + TuneCPU: false, TuneAioEvents: false, TuneClocksource: false, TuneSwappiness: false, @@ -200,7 +200,7 @@ func TestSet(t *testing.T) { Port: 9092, }, }} - require.Exactly(st, expected, c.Redpanda.KafkaApi) + require.Exactly(st, expected, c.Redpanda.KafkaAPI) }, }, { @@ -218,7 +218,7 @@ func TestSet(t *testing.T) { Address: "192.168.54.2", }, }} - require.Exactly(st, expected, c.Redpanda.KafkaApi) + require.Exactly(st, expected, c.Redpanda.KafkaAPI) }, }, { @@ -235,7 +235,7 @@ func TestSet(t *testing.T) { Address: "192.168.54.2", }, }} - require.Exactly(st, expected, c.Redpanda.AdvertisedKafkaApi) + require.Exactly(st, expected, c.Redpanda.AdvertisedKafkaAPI) }, }, { @@ -272,7 +272,6 @@ func TestSet(t *testing.T) { t.Run(tt.name, func(t *testing.T) { fs := afero.NewMemMapFs() mgr := NewManager(fs) - conf := Default() err := mgr.Set(tt.key, tt.value, tt.format) if tt.expectErr { require.Error(t, err) @@ -280,7 +279,7 @@ func TestSet(t *testing.T) { } require.NoError(t, err) if tt.check != nil { - conf, err = mgr.Get() + conf, err := mgr.Get() require.NoError(t, err) m, _ := mgr.(*manager) tt.check(t, conf, m) @@ -300,7 +299,7 @@ func TestMerge(t *testing.T) { name: "it should merge Kafka API spec", config: Config{ Redpanda: RedpandaConfig{ - KafkaApi: []NamedSocketAddress{{ + KafkaAPI: []NamedSocketAddress{{ Name: "kafka-api-name", SocketAddress: SocketAddress{ "1.2.3.4", @@ -310,9 +309,9 @@ func TestMerge(t *testing.T) { }, }, check: func(st *testing.T, c *Config, _ *manager) { - require.Exactly(st, "kafka-api-name", c.Redpanda.KafkaApi[0].Name) - require.Exactly(st, "1.2.3.4", c.Redpanda.KafkaApi[0].Address) - require.Exactly(st, 9123, c.Redpanda.KafkaApi[0].Port) + require.Exactly(st, "kafka-api-name", c.Redpanda.KafkaAPI[0].Name) + require.Exactly(st, "1.2.3.4", c.Redpanda.KafkaAPI[0].Address) + require.Exactly(st, 9123, c.Redpanda.KafkaAPI[0].Port) }, }, { @@ -364,19 +363,19 @@ func TestDefault(t *testing.T) { Redpanda: RedpandaConfig{ Directory: "/var/lib/redpanda/data", RPCServer: SocketAddress{"0.0.0.0", 33145}, - KafkaApi: []NamedSocketAddress{{ + KafkaAPI: []NamedSocketAddress{{ SocketAddress: SocketAddress{ "0.0.0.0", 9092, }, }}, - AdminApi: []NamedSocketAddress{{ + AdminAPI: []NamedSocketAddress{{ SocketAddress: SocketAddress{ "0.0.0.0", 9644, }, }}, - Id: 0, + ID: 0, SeedServers: []SeedServer{}, DeveloperMode: true, }, @@ -600,7 +599,7 @@ schema_registry: {} name: "shall write a valid config file without advertised_rpc_api", conf: func() *Config { c := getValidConfig() - c.Redpanda.AdvertisedKafkaApi = []NamedSocketAddress{{ + c.Redpanda.AdvertisedKafkaAPI = []NamedSocketAddress{{ SocketAddress: SocketAddress{ "174.32.64.2", 9092, @@ -920,8 +919,8 @@ schema_registry: {} name: "shall write config with tls configuration", conf: func() *Config { c := getValidConfig() - c.Redpanda.KafkaApi[0].Name = "outside" - c.Redpanda.KafkaApiTLS = []ServerTLS{{ + c.Redpanda.KafkaAPI[0].Name = "outside" + c.Redpanda.KafkaAPITLS = []ServerTLS{{ Name: "outside", KeyFile: "/etc/certs/cert.key", TruststoreFile: "/etc/certs/ca.crt", @@ -990,7 +989,7 @@ schema_registry: {} name: "shall write config with admin tls configuration", conf: func() *Config { c := getValidConfig() - c.Redpanda.AdminApiTLS = []ServerTLS{{ + c.Redpanda.AdminAPITLS = []ServerTLS{{ KeyFile: "/etc/certs/admin/cert.key", TruststoreFile: "/etc/certs/admin/ca.crt", CertFile: "/etc/certs/admin/cert.crt", @@ -1408,7 +1407,7 @@ schema_registry: {} name: "shall write a valid config file with scram configured", conf: func() *Config { c := getValidConfig() - c.Rpk.KafkaApi.SASL = &SASL{ + c.Rpk.KafkaAPI.SASL = &SASL{ User: "scram_user", Password: "scram_password", Mechanism: "SCRAM-SHA-256", @@ -1670,7 +1669,7 @@ func TestSetMode(t *testing.T) { TuneDiskWriteCache: val, TuneDiskIrq: val, TuneFstrim: false, - TuneCpu: val, + TuneCPU: val, TuneAioEvents: val, TuneClocksource: val, TuneSwappiness: val, @@ -1723,10 +1722,10 @@ func TestSetMode(t *testing.T) { name: "it should preserve all the values that shouldn't be reset", startingConf: func() *Config { conf := Default() - conf.Rpk.AdminApi = RpkAdminApi{ + conf.Rpk.AdminAPI = RpkAdminAPI{ Addresses: []string{"some.addr.com:33145"}, } - conf.Rpk.KafkaApi = RpkKafkaApi{ + conf.Rpk.KafkaAPI = RpkKafkaAPI{ Brokers: []string{"192.168.76.54:9092"}, TLS: &TLS{ KeyFile: "some-key.pem", @@ -1739,10 +1738,10 @@ func TestSetMode(t *testing.T) { mode: ModeProd, expectedConfig: func() *Config { conf := fillRpkConfig(ModeProd)() - conf.Rpk.AdminApi = RpkAdminApi{ + conf.Rpk.AdminAPI = RpkAdminAPI{ Addresses: []string{"some.addr.com:33145"}, } - conf.Rpk.KafkaApi = RpkKafkaApi{ + conf.Rpk.KafkaAPI = RpkKafkaAPI{ Brokers: []string{"192.168.76.54:9092"}, TLS: &TLS{ KeyFile: "some-key.pem", @@ -1796,7 +1795,7 @@ func TestCheckConfig(t *testing.T) { name: "shall return an error when id of server is negative", conf: func() *Config { c := getValidConfig() - c.Redpanda.Id = -100 + c.Redpanda.ID = -100 return c }, expected: []string{"redpanda.node_id can't be a negative integer"}, @@ -1823,7 +1822,7 @@ func TestCheckConfig(t *testing.T) { name: "shall return an error when the Kafka API port is 0", conf: func() *Config { c := getValidConfig() - c.Redpanda.KafkaApi[0].Port = 0 + c.Redpanda.KafkaAPI[0].Port = 0 return c }, expected: []string{"redpanda.kafka_api.0.port can't be 0"}, @@ -1832,7 +1831,7 @@ func TestCheckConfig(t *testing.T) { name: "shall return an error when the Kafka API address is empty", conf: func() *Config { c := getValidConfig() - c.Redpanda.KafkaApi[0].Address = "" + c.Redpanda.KafkaAPI[0].Address = "" return c }, expected: []string{"redpanda.kafka_api.0.address can't be empty"}, @@ -1912,7 +1911,7 @@ func TestReadAsJSON(t *testing.T) { name: "it should load the config as JSON", before: func(fs afero.Fs) error { conf := Default() - conf.Redpanda.KafkaApi[0].Name = "internal" + conf.Redpanda.KafkaAPI[0].Name = "internal" mgr := NewManager(fs) return mgr.Write(conf) }, @@ -2006,7 +2005,7 @@ func TestReadFlat(t *testing.T) { SocketAddress{"192.168.167.1", 1337}, }, } - conf.Redpanda.AdvertisedKafkaApi = []NamedSocketAddress{{ + conf.Redpanda.AdvertisedKafkaAPI = []NamedSocketAddress{{ SocketAddress: SocketAddress{ Address: "127.0.0.1", Port: 9092, @@ -2019,7 +2018,7 @@ func TestReadFlat(t *testing.T) { }, }} - conf.Redpanda.KafkaApi = []NamedSocketAddress{{ + conf.Redpanda.KafkaAPI = []NamedSocketAddress{{ SocketAddress: SocketAddress{ Address: "192.168.92.34", Port: 9092, @@ -2032,7 +2031,7 @@ func TestReadFlat(t *testing.T) { }, }} - conf.Redpanda.KafkaApiTLS = []ServerTLS{{ + conf.Redpanda.KafkaAPITLS = []ServerTLS{{ Name: "internal", KeyFile: "/some/key/file.pem", CertFile: "some/cert/file.crt", @@ -2045,7 +2044,7 @@ func TestReadFlat(t *testing.T) { RequireClientAuth: true, }} - conf.Redpanda.AdminApi = []NamedSocketAddress{{ + conf.Redpanda.AdminAPI = []NamedSocketAddress{{ SocketAddress: SocketAddress{ Address: "192.168.92.34", Port: 9644, @@ -2058,7 +2057,7 @@ func TestReadFlat(t *testing.T) { }, }} - conf.Redpanda.AdminApiTLS = []ServerTLS{{ + conf.Redpanda.AdminAPITLS = []ServerTLS{{ Name: "internal", KeyFile: "/some/key/file.pem", CertFile: "some/cert/file.crt", @@ -2095,7 +2094,7 @@ func TestWriteAndGenerateNodeUuid(t *testing.T) { require.NoError(t, err) err = mgr.WriteNodeUUID(conf) require.NoError(t, err) - require.NotEqual(t, "", conf.NodeUuid) + require.NotEqual(t, "", conf.NodeUUID) readConf, err := mgr.Read(path) require.NoError(t, err) require.Exactly(t, conf, readConf) diff --git a/src/go/rpk/pkg/config/license.go b/src/go/rpk/pkg/config/license.go index 7577a9197792..5ecf38d923de 100644 --- a/src/go/rpk/pkg/config/license.go +++ b/src/go/rpk/pkg/config/license.go @@ -53,7 +53,7 @@ func CheckLicenseKey(key string) error { return invalidErr } lk := &LicenseKey{} - err = json.Unmarshal([]byte(decoded), lk) + err = json.Unmarshal(decoded, lk) if err != nil { return invalidErr } diff --git a/src/go/rpk/pkg/config/license_test.go b/src/go/rpk/pkg/config/license_test.go index 12d16f4a7a4d..20b5fd9df80d 100644 --- a/src/go/rpk/pkg/config/license_test.go +++ b/src/go/rpk/pkg/config/license_test.go @@ -21,6 +21,8 @@ import ( "github.com/stretchr/testify/require" ) +const vectorizedOrg string = "vectorized.io" + func makeKey(org string, exp time.Time, overrideHash uint32) (string, error) { content := fmt.Sprintf( "%s%d%d%d", @@ -29,7 +31,7 @@ func makeKey(org string, exp time.Time, overrideHash uint32) (string, error) { exp.Month(), exp.Day(), ) - checksum := uint32(0) + var checksum uint32 if overrideHash != 0 { checksum = overrideHash } else { @@ -59,7 +61,7 @@ func TestCheckLicenseKey(t *testing.T) { { name: "key is valid if the hashes match and the expiration date hasn't passed", key: func() (string, error) { - organization := "vectorized.io" + organization := vectorizedOrg expiresAt := time.Now().Add(48 * time.Hour) return makeKey(organization, expiresAt, 0) }, @@ -68,7 +70,7 @@ func TestCheckLicenseKey(t *testing.T) { { name: "key is invalid if the hashes don't match", key: func() (string, error) { - organization := "vectorized.io" + organization := vectorizedOrg expiresAt := time.Now().Add(48 * time.Hour) return makeKey(organization, expiresAt, 123) }, @@ -77,7 +79,7 @@ func TestCheckLicenseKey(t *testing.T) { { name: "key is invalid if the expiration date has already passed", key: func() (string, error) { - organization := "vectorized.io" + organization := vectorizedOrg expiresAt := time.Now().Add(-48 * time.Hour) return makeKey(organization, expiresAt, 0) }, diff --git a/src/go/rpk/pkg/config/manager.go b/src/go/rpk/pkg/config/manager.go index 0a75f1970554..88c9be0fea3a 100644 --- a/src/go/rpk/pkg/config/manager.go +++ b/src/go/rpk/pkg/config/manager.go @@ -13,11 +13,9 @@ import ( "encoding/json" "errors" "fmt" - "math/big" "net" "os" "path/filepath" - fp "path/filepath" "reflect" "strconv" "strings" @@ -75,13 +73,7 @@ func (m *manager) FindOrGenerate(path string) (*Config, error) { if path == "" { addConfigPaths(m.v) err := m.v.ReadInConfig() - if err != nil { - _, notFound := err.(viper.ConfigFileNotFoundError) - if !notFound { - return nil, err - } - path = Default().ConfigFile - } else { + if err == nil { conf, err := unmarshal(m.v) if err != nil { return nil, err @@ -89,7 +81,11 @@ func (m *manager) FindOrGenerate(path string) (*Config, error) { conf.ConfigFile, err = absPath(m.v.ConfigFileUsed()) return conf, err } - + _, notFound := err.(viper.ConfigFileNotFoundError) //nolint:errorlint // Viper returns a non-pointer error https://github.com/spf13/viper/issues/1139 + if !notFound { + return nil, err + } + path = Default().ConfigFile } return readOrGenerate(m.fs, m.v, path) } @@ -107,7 +103,7 @@ func readOrGenerate(fs afero.Fs, v *viper.Viper, path string) (*Config, error) { // The config file's there, there's nothing to do. return unmarshal(v) } - _, notFound := err.(viper.ConfigFileNotFoundError) + _, notFound := err.(viper.ConfigFileNotFoundError) //nolint:errorlint // Viper returns a non-pointer error https://github.com/spf13/viper/issues/1139 notExist := os.IsNotExist(err) if err != nil && !notFound && !notExist { return nil, fmt.Errorf( @@ -245,7 +241,7 @@ func (m *manager) ReadAsJSON(path string) (string, error) { func (m *manager) Read(path string) (*Config, error) { // If the path was set, try reading only from there. - abs, err := fp.Abs(path) + abs, err := filepath.Abs(path) if err != nil { return nil, err } @@ -277,7 +273,7 @@ func (m *manager) WriteNodeUUID(conf *Config) error { if err != nil { return err } - conf.NodeUuid = id.String() + conf.NodeUUID = id.String() return m.Write(conf) } @@ -396,7 +392,7 @@ func checkAndWrite(fs afero.Fs, v *viper.Viper, path string) error { } return errors.New(strings.Join(reasons, ", ")) } - lastBackupFile, err := findBackup(fs, fp.Dir(path)) + lastBackupFile, err := findBackup(fs, filepath.Dir(path)) if err != nil { return err } @@ -426,7 +422,7 @@ func checkAndWrite(fs afero.Fs, v *viper.Viper, path string) error { log.Debugf("Writing the new redpanda config to '%s'", path) err = write(fs, v, path) if err != nil { - return recover(fs, backup, path, err) + return recover(fs, backup, path, err) //nolint:revive // false positive: this recover function is different from built-in recover } return nil } @@ -471,15 +467,13 @@ func v21_1_4MapToNamedSocketAddressSlice( from, to reflect.Type, data interface{}, ) (interface{}, error) { if to == reflect.TypeOf([]NamedSocketAddress{}) { - switch from.Kind() { - case reflect.Map: + if from.Kind() == reflect.Map { sa := NamedSocketAddress{} err := mapstructure.Decode(data, &sa) if err != nil { return nil, err } return []NamedSocketAddress{sa}, nil - } } return data, nil @@ -488,12 +482,12 @@ func v21_1_4MapToNamedSocketAddressSlice( // Redpanda version <= 21.4.1 only supported a single TLS config. This custom // decode function translates a single TLS config-equivalent // map[string]interface{} into a []ServerTLS. +//nolint:revive // using underscore here is intended func v21_4_1TlsMapToNamedTlsSlice( from, to reflect.Type, data interface{}, ) (interface{}, error) { if to == reflect.TypeOf([]ServerTLS{}) { - switch from.Kind() { - case reflect.Map: + if from.Kind() == reflect.Map { tls := ServerTLS{} err := mapstructure.Decode(data, &tls) if err != nil { @@ -505,40 +499,6 @@ func v21_4_1TlsMapToNamedTlsSlice( return data, nil } -func base58Encode(s string) string { - b := []byte(s) - - alphabet := "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" - alphabetIdx0 := byte('1') - bigRadix := big.NewInt(58) - bigZero := big.NewInt(0) - x := new(big.Int) - x.SetBytes(b) - - answer := make([]byte, 0, len(b)*136/100) - for x.Cmp(bigZero) > 0 { - mod := new(big.Int) - x.DivMod(x, bigRadix, mod) - answer = append(answer, alphabet[mod.Int64()]) - } - - // leading zero bytes - for _, i := range b { - if i != 0 { - break - } - answer = append(answer, alphabetIdx0) - } - - // reverse - alen := len(answer) - for i := 0; i < alen/2; i++ { - answer[i], answer[alen-1-i] = answer[alen-1-i], answer[i] - } - - return string(answer) -} - func parse(val string) interface{} { if i, err := strconv.Atoi(val); err == nil { return i @@ -553,10 +513,10 @@ func parse(val string) interface{} { } func absPath(path string) (string, error) { - absPath, err := fp.Abs(path) + absPath, err := filepath.Abs(path) if err != nil { return "", fmt.Errorf( - "Couldn't convert the used config file path to"+ + "couldn't convert the used config file path to"+ " absolute: %s", path, ) @@ -569,7 +529,7 @@ func createConfigDir(fs afero.Fs, configFile string) error { err := fs.MkdirAll(dir, 0755) if err != nil { return fmt.Errorf( - "Couldn't create config dir %s: %v", + "couldn't create config dir %s: %v", dir, err, ) diff --git a/src/go/rpk/pkg/config/params.go b/src/go/rpk/pkg/config/params.go index 9a06f2b5777e..a91745aea55c 100644 --- a/src/go/rpk/pkg/config/params.go +++ b/src/go/rpk/pkg/config/params.go @@ -240,11 +240,11 @@ func (p *Params) Load(fs afero.Fs) (*Config, error) { Address: "0.0.0.0", Port: 33145, }, - KafkaApi: []NamedSocketAddress{{SocketAddress: SocketAddress{ + KafkaAPI: []NamedSocketAddress{{SocketAddress: SocketAddress{ Address: "0.0.0.0", Port: 9092, }}}, - AdminApi: []NamedSocketAddress{{SocketAddress: SocketAddress{ + AdminAPI: []NamedSocketAddress{{SocketAddress: SocketAddress{ Address: "0.0.0.0", Port: 9644, }}}, @@ -321,14 +321,14 @@ func (p *Params) readConfig(fs afero.Fs, c *Config) error { // loaded file. func (c *Config) backcompat() { r := &c.Rpk - if r.KafkaApi.TLS == nil { - r.KafkaApi.TLS = r.TLS + if r.KafkaAPI.TLS == nil { + r.KafkaAPI.TLS = r.TLS } - if r.KafkaApi.SASL == nil { - r.KafkaApi.SASL = r.SASL + if r.KafkaAPI.SASL == nil { + r.KafkaAPI.SASL = r.SASL } - if r.AdminApi.TLS == nil { - r.AdminApi.TLS = r.TLS + if r.AdminAPI.TLS == nil { + r.AdminAPI.TLS = r.TLS } } @@ -349,8 +349,8 @@ func splitCommaIntoStrings(in string, dst *[]string) error { // that we result in our priority order: flag, env, file). func (p *Params) processOverrides(c *Config) error { r := &c.Rpk - k := &r.KafkaApi - a := &r.AdminApi + k := &r.KafkaAPI + a := &r.AdminAPI // We have three "make" functions that initialize pointer values if // necessary. @@ -472,17 +472,17 @@ func (p *Params) processOverrides(c *Config) error { func (c *Config) addUnsetDefaults() { r := &c.Rpk - brokers := r.KafkaApi.Brokers - defer func() { r.KafkaApi.Brokers = brokers }() - if len(brokers) == 0 && len(c.Redpanda.KafkaApi) > 0 { - b0 := c.Redpanda.KafkaApi[0] + brokers := r.KafkaAPI.Brokers + defer func() { r.KafkaAPI.Brokers = brokers }() + if len(brokers) == 0 && len(c.Redpanda.KafkaAPI) > 0 { + b0 := c.Redpanda.KafkaAPI[0] brokers = []string{net.JoinHostPort(b0.Address, strconv.Itoa(b0.Port))} } if len(brokers) == 0 { brokers = []string{"127.0.0.1:9092"} } - if len(r.AdminApi.Addresses) == 0 { - r.AdminApi.Addresses = []string{"127.0.0.1:9644"} + if len(r.AdminAPI.Addresses) == 0 { + r.AdminAPI.Addresses = []string{"127.0.0.1:9644"} } } diff --git a/src/go/rpk/pkg/config/schema.go b/src/go/rpk/pkg/config/schema.go index 30d1a5c07172..3965b976e23d 100644 --- a/src/go/rpk/pkg/config/schema.go +++ b/src/go/rpk/pkg/config/schema.go @@ -20,10 +20,10 @@ import ( type Config struct { file *Config - NodeUuid string `yaml:"node_uuid,omitempty" mapstructure:"node_uuid,omitempty" json:"nodeUuid"` + NodeUUID string `yaml:"node_uuid,omitempty" mapstructure:"node_uuid,omitempty" json:"nodeUuid"` Organization string `yaml:"organization,omitempty" mapstructure:"organization,omitempty" json:"organization"` LicenseKey string `yaml:"license_key,omitempty" mapstructure:"license_key,omitempty" json:"licenseKey"` - ClusterId string `yaml:"cluster_id,omitempty" mapstructure:"cluster_id,omitempty" json:"clusterId"` + ClusterID string `yaml:"cluster_id,omitempty" mapstructure:"cluster_id,omitempty" json:"clusterId"` ConfigFile string `yaml:"config_file" mapstructure:"config_file" json:"configFile"` Redpanda RedpandaConfig `yaml:"redpanda" mapstructure:"redpanda" json:"redpanda"` Rpk RpkConfig `yaml:"rpk" mapstructure:"rpk" json:"rpk"` @@ -44,21 +44,21 @@ func (c *Config) File() *Config { type RedpandaConfig struct { Directory string `yaml:"data_directory" mapstructure:"data_directory" json:"dataDirectory"` - Id int `yaml:"node_id" mapstructure:"node_id" json:"id"` + ID int `yaml:"node_id" mapstructure:"node_id" json:"id"` Rack string `yaml:"rack,omitempty" mapstructure:"rack" json:"rack"` SeedServers []SeedServer `yaml:"seed_servers" mapstructure:"seed_servers" json:"seedServers"` RPCServer SocketAddress `yaml:"rpc_server" mapstructure:"rpc_server" json:"rpcServer"` RPCServerTLS []ServerTLS `yaml:"rpc_server_tls,omitempty" mapstructure:"rpc_server_tls,omitempty" json:"rpcServerTls"` - KafkaApi []NamedSocketAddress `yaml:"kafka_api" mapstructure:"kafka_api" json:"kafkaApi"` - KafkaApiTLS []ServerTLS `yaml:"kafka_api_tls,omitempty" mapstructure:"kafka_api_tls,omitempty" json:"kafkaApiTls"` - AdminApi []NamedSocketAddress `yaml:"admin" mapstructure:"admin" json:"admin"` - AdminApiTLS []ServerTLS `yaml:"admin_api_tls,omitempty" mapstructure:"admin_api_tls,omitempty" json:"adminApiTls"` + KafkaAPI []NamedSocketAddress `yaml:"kafka_api" mapstructure:"kafka_api" json:"kafkaApi"` + KafkaAPITLS []ServerTLS `yaml:"kafka_api_tls,omitempty" mapstructure:"kafka_api_tls,omitempty" json:"kafkaApiTls"` + AdminAPI []NamedSocketAddress `yaml:"admin" mapstructure:"admin" json:"admin"` + AdminAPITLS []ServerTLS `yaml:"admin_api_tls,omitempty" mapstructure:"admin_api_tls,omitempty" json:"adminApiTls"` CoprocSupervisorServer SocketAddress `yaml:"coproc_supervisor_server,omitempty" mapstructure:"coproc_supervisor_server" json:"coprocSupervisorServer"` AdminAPIDocDir string `yaml:"admin_api_doc_dir,omitempty" mapstructure:"admin_api_doc_dir" json:"adminApiDocDir"` DashboardDir string `yaml:"dashboard_dir,omitempty" mapstructure:"dashboard_dir" json:"dashboardDir"` CloudStorageCacheDirectory string `yaml:"cloud_storage_cache_directory,omitempty" mapstructure:"cloud_storage_cache_directory" json:"CloudStorageCacheDirectory"` AdvertisedRPCAPI *SocketAddress `yaml:"advertised_rpc_api,omitempty" mapstructure:"advertised_rpc_api,omitempty" json:"advertisedRpcApi,omitempty"` - AdvertisedKafkaApi []NamedSocketAddress `yaml:"advertised_kafka_api,omitempty" mapstructure:"advertised_kafka_api,omitempty" json:"advertisedKafkaApi,omitempty"` + AdvertisedKafkaAPI []NamedSocketAddress `yaml:"advertised_kafka_api,omitempty" mapstructure:"advertised_kafka_api,omitempty" json:"advertisedKafkaApi,omitempty"` DeveloperMode bool `yaml:"developer_mode" mapstructure:"developer_mode" json:"developerMode"` Other map[string]interface{} `yaml:",inline" mapstructure:",remain"` } @@ -142,8 +142,8 @@ type RpkConfig struct { // Deprecated 2021-07-1 SASL *SASL `yaml:"sasl,omitempty" mapstructure:"sasl,omitempty" json:"sasl,omitempty"` - KafkaApi RpkKafkaApi `yaml:"kafka_api,omitempty" mapstructure:"kafka_api,omitempty" json:"kafkaApi"` - AdminApi RpkAdminApi `yaml:"admin_api,omitempty" mapstructure:"admin_api,omitempty" json:"adminApi"` + KafkaAPI RpkKafkaAPI `yaml:"kafka_api,omitempty" mapstructure:"kafka_api,omitempty" json:"kafkaApi"` + AdminAPI RpkAdminAPI `yaml:"admin_api,omitempty" mapstructure:"admin_api,omitempty" json:"adminApi"` AdditionalStartFlags []string `yaml:"additional_start_flags,omitempty" mapstructure:"additional_start_flags,omitempty" json:"additionalStartFlags"` EnableUsageStats bool `yaml:"enable_usage_stats" mapstructure:"enable_usage_stats" json:"enableUsageStats"` TuneNetwork bool `yaml:"tune_network" mapstructure:"tune_network" json:"tuneNetwork"` @@ -152,7 +152,7 @@ type RpkConfig struct { TuneDiskWriteCache bool `yaml:"tune_disk_write_cache" mapstructure:"tune_disk_write_cache" json:"tuneDiskWriteCache"` TuneDiskIrq bool `yaml:"tune_disk_irq" mapstructure:"tune_disk_irq" json:"tuneDiskIrq"` TuneFstrim bool `yaml:"tune_fstrim" mapstructure:"tune_fstrim" json:"tuneFstrim"` - TuneCpu bool `yaml:"tune_cpu" mapstructure:"tune_cpu" json:"tuneCpu"` + TuneCPU bool `yaml:"tune_cpu" mapstructure:"tune_cpu" json:"tuneCpu"` TuneAioEvents bool `yaml:"tune_aio_events" mapstructure:"tune_aio_events" json:"tuneAioEvents"` TuneClocksource bool `yaml:"tune_clocksource" mapstructure:"tune_clocksource" json:"tuneClocksource"` TuneSwappiness bool `yaml:"tune_swappiness" mapstructure:"tune_swappiness" json:"tuneSwappiness"` @@ -168,13 +168,13 @@ type RpkConfig struct { SMP *int `yaml:"smp,omitempty" mapstructure:"smp,omitempty" json:"smp,omitempty"` } -type RpkKafkaApi struct { +type RpkKafkaAPI struct { Brokers []string `yaml:"brokers,omitempty" mapstructure:"brokers,omitempty" json:"brokers"` TLS *TLS `yaml:"tls,omitempty" mapstructure:"tls,omitempty" json:"tls"` SASL *SASL `yaml:"sasl,omitempty" mapstructure:"sasl,omitempty" json:"sasl,omitempty"` } -type RpkAdminApi struct { +type RpkAdminAPI struct { Addresses []string `yaml:"addresses,omitempty" mapstructure:"addresses,omitempty" json:"addresses"` TLS *TLS `yaml:"tls,omitempty" mapstructure:"tls,omitempty" json:"tls"` } @@ -185,6 +185,6 @@ type SASL struct { Mechanism string `yaml:"type,omitempty" mapstructure:"type,omitempty" json:"type,omitempty"` } -func (conf *Config) PIDFile() string { - return path.Join(conf.Redpanda.Directory, "pid.lock") +func (c *Config) PIDFile() string { + return path.Join(c.Redpanda.Directory, "pid.lock") } diff --git a/src/go/rpk/pkg/kafka/client_franz.go b/src/go/rpk/pkg/kafka/client_franz.go index b275184617de..43d5c15fcde3 100644 --- a/src/go/rpk/pkg/kafka/client_franz.go +++ b/src/go/rpk/pkg/kafka/client_franz.go @@ -31,7 +31,7 @@ import ( func NewFranzClient( fs afero.Fs, p *config.Params, cfg *config.Config, extraOpts ...kgo.Opt, ) (*kgo.Client, error) { - k := &cfg.Rpk.KafkaApi + k := &cfg.Rpk.KafkaAPI opts := []kgo.Opt{ kgo.SeedBrokers(k.Brokers...), diff --git a/src/go/rpk/pkg/os/proc.go b/src/go/rpk/pkg/os/proc.go index 6d4ec6a7e3af..317567187ab3 100644 --- a/src/go/rpk/pkg/os/proc.go +++ b/src/go/rpk/pkg/os/proc.go @@ -35,7 +35,7 @@ func NewProc() Proc { type proc struct{} -func (proc *proc) RunWithSystemLdPath( +func (*proc) RunWithSystemLdPath( timeout time.Duration, command string, args ...string, ) ([]string, error) { diff --git a/src/go/rpk/pkg/out/out.go b/src/go/rpk/pkg/out/out.go index 1b38196a8e0b..7fe9a6f53b9d 100644 --- a/src/go/rpk/pkg/out/out.go +++ b/src/go/rpk/pkg/out/out.go @@ -78,7 +78,7 @@ func Exit(msg string, args ...interface{}) { // HandleShardError prints a message and potentially exits depending on the // inner error. If the error is a shard error and not everything failed, this -// allows the cli to continue +// allows the cli to continue. func HandleShardError(name string, err error) { var se *kadm.ShardErrors var ae *kadm.AuthError diff --git a/src/go/rpk/pkg/plugin/manifest.go b/src/go/rpk/pkg/plugin/manifest.go index 890604990066..e631ccbb07fd 100644 --- a/src/go/rpk/pkg/plugin/manifest.go +++ b/src/go/rpk/pkg/plugin/manifest.go @@ -65,6 +65,7 @@ func DownloadManifest(url string) (*Manifest, error) { if err != nil { return nil, fmt.Errorf("unable to request manifest: %v", err) } + defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("unable to read manifest body: %v", err) @@ -79,7 +80,7 @@ func DownloadManifest(url string) (*Manifest, error) { const understand = "2021-07-27" if m.Version != understand { - return nil, fmt.Errorf("Plugin manifest indicates version %q, and we can only understand %q! Please update rpk!", m.Version, understand) + return nil, fmt.Errorf("plugin manifest indicates version %q, and we can only understand %q; please update rpk", m.Version, understand) } sort.Slice(m.Plugins, func(i, j int) bool { @@ -186,6 +187,8 @@ func (p *ManifestPlugin) Download(baseURL, os, host string) ([]byte, error) { if err != nil { return nil, fmt.Errorf("unable to issue request to %s: %v", u, err) } + defer resp.Body.Close() + if resp.StatusCode/100 != 2 { return nil, fmt.Errorf("unsuccessful plugin response from %s, status: %s", u, http.StatusText(resp.StatusCode)) } diff --git a/src/go/rpk/pkg/plugin/plugin_test.go b/src/go/rpk/pkg/plugin/plugin_test.go index 6c9725183055..1bb9e9e6ac56 100644 --- a/src/go/rpk/pkg/plugin/plugin_test.go +++ b/src/go/rpk/pkg/plugin/plugin_test.go @@ -11,17 +11,17 @@ func TestListPlugins(t *testing.T) { t.Parallel() fs := testfs.FromMap(map[string]testfs.Fmode{ - "/usr/local/sbin/.rpk-non_executable": {0666, ""}, - "/usr/local/sbin/.rpk-barely_executable": {0100, ""}, - "/bin/.rpk-barely_executable": {0100, "shadowed!"}, - "/bin/.rpk.ac-barely_executable": {0100, "also shadowed!"}, - "/bin/.rpk.ac-auto_completed": {0777, ""}, - "/bin/has/dir/": {0777, ""}, - "/bin/.rpk.ac-": {0777, "empty name ignored"}, - "/bin/.rpk-": {0777, "empty name ignored"}, - "/bin/.rpkunrelated": {0777, ""}, - "/bin/rpk-nodot": {0777, ""}, - "/unsearched/.rpk-valid_unused": {0777, ""}, + "/usr/local/sbin/.rpk-non_executable": {Mode: 0666, Contents: ""}, + "/usr/local/sbin/.rpk-barely_executable": {Mode: 0100, Contents: ""}, + "/bin/.rpk-barely_executable": {Mode: 0100, Contents: "shadowed!"}, + "/bin/.rpk.ac-barely_executable": {Mode: 0100, Contents: "also shadowed!"}, + "/bin/.rpk.ac-auto_completed": {Mode: 0777, Contents: ""}, + "/bin/has/dir/": {Mode: 0777, Contents: ""}, + "/bin/.rpk.ac-": {Mode: 0777, Contents: "empty name ignored"}, + "/bin/.rpk-": {Mode: 0777, Contents: "empty name ignored"}, + "/bin/.rpkunrelated": {Mode: 0777, Contents: ""}, + "/bin/rpk-nodot": {Mode: 0777, Contents: ""}, + "/unsearched/.rpk-valid_unused": {Mode: 0777, Contents: ""}, }) got := ListPlugins(fs, []string{ @@ -102,7 +102,7 @@ func TestWriteBinary(t *testing.T) { } testfs.Expect(t, fs, map[string]testfs.Fmode{ - "/bin/.rpk.ac-autocomplete": {0o755, "ac"}, - "/usr/bin/.rpk-non-auto": {0o755, "nonac"}, + "/bin/.rpk.ac-autocomplete": {Mode: 0o755, Contents: "ac"}, + "/usr/bin/.rpk-non-auto": {Mode: 0o755, Contents: "nonac"}, }) } diff --git a/src/go/rpk/pkg/redpanda/launcher.go b/src/go/rpk/pkg/redpanda/launcher.go index f4b83cd94e3a..4eff2085134a 100644 --- a/src/go/rpk/pkg/redpanda/launcher.go +++ b/src/go/rpk/pkg/redpanda/launcher.go @@ -38,7 +38,7 @@ func NewLauncher() Launcher { return &launcher{} } -func (l *launcher) Start(installDir string, args *RedpandaArgs) error { +func (*launcher) Start(installDir string, args *RedpandaArgs) error { binary, err := getBinary(installDir) if err != nil { return err diff --git a/src/go/rpk/pkg/system/cpu.go b/src/go/rpk/pkg/system/cpu.go index bb325e02aba5..777fd64d15f0 100644 --- a/src/go/rpk/pkg/system/cpu.go +++ b/src/go/rpk/pkg/system/cpu.go @@ -22,7 +22,7 @@ type CPUInfo struct { Cores int } -func CpuInfo(fs afero.Fs) ([]*CPUInfo, error) { +func GetCPUInfo(fs afero.Fs) ([]*CPUInfo, error) { bytes, err := afero.ReadFile(fs, "/proc/cpuinfo") if err != nil { return nil, err diff --git a/src/go/rpk/pkg/system/cpu_test.go b/src/go/rpk/pkg/system/cpu_test.go index b8da8288ee44..b71b596a1b20 100644 --- a/src/go/rpk/pkg/system/cpu_test.go +++ b/src/go/rpk/pkg/system/cpu_test.go @@ -109,7 +109,7 @@ power management: if tt.before != nil { require.NoError(st, tt.before(fs)) } - cpus, err := system.CpuInfo(fs) + cpus, err := system.GetCPUInfo(fs) if tt.expectedErrMsg != "" { require.Error(st, err) require.Contains(st, err.Error(), tt.expectedErrMsg) diff --git a/src/go/rpk/pkg/system/filesystem/fs.go b/src/go/rpk/pkg/system/filesystem/fs.go index d6ed3b9af1ec..0e2fbad10924 100644 --- a/src/go/rpk/pkg/system/filesystem/fs.go +++ b/src/go/rpk/pkg/system/filesystem/fs.go @@ -21,13 +21,13 @@ func DirectoryIsWriteable(fs afero.Fs, path string) (bool, error) { if exists, _ := afero.Exists(fs, path); !exists { err := fs.MkdirAll(path, 0755) if err != nil { - return false, nil + return false, err } } testFile := filepath.Join(path, "test_file") err := afero.WriteFile(fs, testFile, []byte{0}, 0644) if err != nil { - return false, nil + return false, err } err = fs.Remove(testFile) if err != nil { diff --git a/src/go/rpk/pkg/system/grub.go b/src/go/rpk/pkg/system/grub.go index debf70776a50..515fe3264134 100644 --- a/src/go/rpk/pkg/system/grub.go +++ b/src/go/rpk/pkg/system/grub.go @@ -152,7 +152,7 @@ func matchAndSplitCmdOptions(optLine string) []string { return nil } -func splitGrubOption(opt string) (string, string) { +func splitGrubOption(opt string) (key, val string) { splitted := strings.Split(opt, "=") if len(splitted) == 1 { return splitted[0], "" diff --git a/src/go/rpk/pkg/system/metrics.go b/src/go/rpk/pkg/system/metrics.go index c79baaa8b40c..1ddaa8ed1481 100644 --- a/src/go/rpk/pkg/system/metrics.go +++ b/src/go/rpk/pkg/system/metrics.go @@ -26,7 +26,7 @@ import ( ) type Metrics struct { - CpuPercentage float64 `json:"cpuPercentage"` + CPUPercentage float64 `json:"cpuPercentage"` FreeMemoryMB float64 `json:"freeMemoryMB"` FreeSpaceMB float64 `json:"freeSpaceMB"` } @@ -46,7 +46,7 @@ type stat struct { stime uint64 } -var errRedpandaDown = errors.New("the local redpanda process isn't running.") +var errRedpandaDown = errors.New("the local redpanda process isn't running") func GatherMetrics( fs afero.Fs, timeout time.Duration, conf config.Config, @@ -73,7 +73,7 @@ func GatherMetrics( return metrics, errs } - metrics.CpuPercentage, err = redpandaCpuPercentage(fs, pid, timeout) + metrics.CPUPercentage, err = redpandaCPUPercentage(fs, pid, timeout) if err != nil { errs = multierror.Append(errs, err) } @@ -88,7 +88,7 @@ func GatherMetrics( return metrics, errs } -func redpandaCpuPercentage( +func redpandaCPUPercentage( fs afero.Fs, pid int, timeout time.Duration, ) (float64, error) { clktck, err := sysconf.Sysconf(sysconf.SC_CLK_TCK) @@ -157,5 +157,5 @@ func getFreeDiskSpaceMB(conf config.Config) (float64, error) { } func IsErrRedpandaDown(err error) bool { - return err == errRedpandaDown + return errors.Is(err, errRedpandaDown) } diff --git a/src/go/rpk/pkg/system/metrics_test.go b/src/go/rpk/pkg/system/metrics_test.go index 59a1cd73f852..966fde885e9b 100644 --- a/src/go/rpk/pkg/system/metrics_test.go +++ b/src/go/rpk/pkg/system/metrics_test.go @@ -39,7 +39,7 @@ func TestGatherMetrics(t *testing.T) { expectedErrMsg: "/proc/4194304/stat", }, { name: "it should fail if the PID file doesn't exist", - expectedErrMsg: "the local redpanda process isn't running.", + expectedErrMsg: "the local redpanda process isn't running", }, { name: "it should fail if the CPU utime can't be parsed", before: func(fs afero.Fs) error { diff --git a/src/go/rpk/pkg/system/ntp.go b/src/go/rpk/pkg/system/ntp.go index 3f9b58a2f7d5..a3592002d64e 100644 --- a/src/go/rpk/pkg/system/ntp.go +++ b/src/go/rpk/pkg/system/ntp.go @@ -44,21 +44,20 @@ func (q *ntpQuery) IsNtpSynced() (bool, error) { log.Debug(err) } synced, err := q.checkWithTimedateCtl() - if err != nil { - log.Debug(err) - } else { + if err == nil { return synced, nil } + log.Debug(err) + _, err = exec.LookPath("ntpstat") if err != nil { log.Debug(err) } synced, err = q.checkWithNtpstat() - if err != nil { - log.Debug(err) - } else { + if err == nil { return synced, nil } + log.Debug(err) return false, errors.New("couldn't check NTP with timedatectl or ntpstat") } diff --git a/src/go/rpk/pkg/system/syslog/package.go b/src/go/rpk/pkg/system/syslog/package.go index bd3ae6368de8..d6cefa058902 100644 --- a/src/go/rpk/pkg/system/syslog/package.go +++ b/src/go/rpk/pkg/system/syslog/package.go @@ -7,7 +7,7 @@ // the Business Source License, use of this software will be governed // by the Apache License, Version 2.0 -// Declares the 'syslog' package. Necessary for non-linux build, since all +// Package syslog is necessary for non-linux build, since all // other files in this package are only built for linux, would which cause // darwin builds to fail. package syslog diff --git a/src/go/rpk/pkg/system/systemd/dbus.go b/src/go/rpk/pkg/system/systemd/dbus.go index be20d1d26443..3f4836bbbe72 100644 --- a/src/go/rpk/pkg/system/systemd/dbus.go +++ b/src/go/rpk/pkg/system/systemd/dbus.go @@ -45,13 +45,13 @@ func (c *dbusClient) StartUnit(name string) error { func (c *dbusClient) UnitState(name string) (LoadState, ActiveState, error) { loadState, err := c.conn.GetUnitProperty(name, "LoadState") if err != nil { - return LoadStateUnknown, ActiveStateUnknown, nil + return LoadStateUnknown, ActiveStateUnknown, err } activeState, err := c.conn.GetUnitProperty(name, "ActiveState") if err != nil { return toLoadState(loadState.Value.String()), ActiveStateUnknown, - nil + err } return toLoadState(loadState.Value.String()), diff --git a/src/go/rpk/pkg/system/utils_linux.go b/src/go/rpk/pkg/system/utils_linux.go index b1de66fe4acd..dce7da3c19e1 100644 --- a/src/go/rpk/pkg/system/utils_linux.go +++ b/src/go/rpk/pkg/system/utils_linux.go @@ -18,9 +18,9 @@ func uname() (string, error) { return "", err } str := "" - str += string(int8ToString(uname.Machine)) + " " - str += string(int8ToString(uname.Release)) + " " - str += string(int8ToString(uname.Version)) + str += int8ToString(uname.Machine) + " " + str += int8ToString(uname.Release) + " " + str += int8ToString(uname.Version) return str, nil } diff --git a/src/go/rpk/pkg/tuners/aio_test.go b/src/go/rpk/pkg/tuners/aio_test.go index 11eb75b951e0..c46531a554a1 100644 --- a/src/go/rpk/pkg/tuners/aio_test.go +++ b/src/go/rpk/pkg/tuners/aio_test.go @@ -20,6 +20,14 @@ import ( "github.com/stretchr/testify/require" ) +const rpTuningHeader = `#!/bin/bash + +# Redpanda Tuning Script +# ---------------------------------- +# This file was autogenerated by RPK + +` + func TestMaxAIOEventsCheck(t *testing.T) { const maxAIOEventsFile = "/proc/sys/fs/aio-max-nr" const scriptPath = "/tune.sh" @@ -88,13 +96,7 @@ func TestMaxAIOEventsCheck(t *testing.T) { require.NoError(st, res.Error()) contents, err := afero.ReadFile(fs, scriptPath) require.NoError(st, err) - expected := `#!/bin/bash - -# Redpanda Tuning Script -# ---------------------------------- -# This file was autogenerated by RPK - -` + expected := rpTuningHeader if tt.expectChange { expected = expected + fmt.Sprintf(`echo '%d' > /proc/sys/fs/aio-max-nr `, diff --git a/src/go/rpk/pkg/tuners/ballast/tuner.go b/src/go/rpk/pkg/tuners/ballast/tuner.go index 86f705c7184d..2858c2523e01 100644 --- a/src/go/rpk/pkg/tuners/ballast/tuner.go +++ b/src/go/rpk/pkg/tuners/ballast/tuner.go @@ -55,7 +55,7 @@ func (t *ballastTuner) Tune() tuners.TuneResult { sizeBytes, err := units.FromHumanSize(size) if err != nil { return tuners.NewTuneError(fmt.Errorf( - "'%s' is not a valid size unit.", + "'%s' is not a valid size unit", size, )) } diff --git a/src/go/rpk/pkg/tuners/checked_tunable_test.go b/src/go/rpk/pkg/tuners/checked_tunable_test.go index a7fddce33141..841361fce230 100644 --- a/src/go/rpk/pkg/tuners/checked_tunable_test.go +++ b/src/go/rpk/pkg/tuners/checked_tunable_test.go @@ -25,11 +25,11 @@ type checkedTunerMock struct { tune func() TuneResult } -func (c *checkedTunerMock) Id() CheckerID { +func (*checkedTunerMock) ID() CheckerID { return 1 } -func (c *checkedTunerMock) GetDesc() string { +func (*checkedTunerMock) GetDesc() string { return "mocked check" } @@ -42,7 +42,7 @@ func (c *checkedTunerMock) GetSeverity() Severity { return c.severity } -func (c *checkedTunerMock) GetRequiredAsString() string { +func (*checkedTunerMock) GetRequiredAsString() string { return "r" } diff --git a/src/go/rpk/pkg/tuners/checker.go b/src/go/rpk/pkg/tuners/checker.go index 790a8963cf34..242d458584fd 100644 --- a/src/go/rpk/pkg/tuners/checker.go +++ b/src/go/rpk/pkg/tuners/checker.go @@ -27,7 +27,7 @@ func (s Severity) String() string { } type CheckResult struct { - CheckerId CheckerID + CheckerID CheckerID IsOk bool Err error Current string @@ -37,7 +37,7 @@ type CheckResult struct { } type Checker interface { - Id() CheckerID + ID() CheckerID GetDesc() string Check() *CheckResult GetRequiredAsString() string diff --git a/src/go/rpk/pkg/tuners/cpu/tuner.go b/src/go/rpk/pkg/tuners/cpu/tuner.go index 44e4a0e5afac..406ebaf0c47d 100644 --- a/src/go/rpk/pkg/tuners/cpu/tuner.go +++ b/src/go/rpk/pkg/tuners/cpu/tuner.go @@ -24,7 +24,7 @@ import ( ) type tuner struct { - cpuMasks irq.CpuMasks + cpuMasks irq.CPUMasks grub system.Grub rebootAllowed bool cores uint @@ -33,8 +33,8 @@ type tuner struct { executor executors.Executor } -func NewCpuTuner( - cpuMasks irq.CpuMasks, +func NewCPUTuner( + cpuMasks irq.CPUMasks, grub system.Grub, fs afero.Fs, rebootAllowed bool, @@ -117,10 +117,14 @@ func (tuner *tuner) CheckIfSupported() (supported bool, reason string) { func (tuner *tuner) getMaxCState() (uint, error) { log.Debugf("Getting max allowed CState") + // Possible errors while reading max_cstate: + // File doesn't exist or reading error. lines, err := utils.ReadFileLines(tuner.fs, "/sys/module/intel_idle/parameters/max_cstate") + + // We return maxCstate = 0 when any of the above errors occurred. if err != nil { - return 0, err + return 0, nil //nolint:nilerr //We don't want to interrupt tune execution if any of the above errors oc curred } if len(lines) == 1 { cState, err := strconv.Atoi(lines[0]) @@ -129,7 +133,8 @@ func (tuner *tuner) getMaxCState() (uint, error) { } return uint(cState), nil } - return 0, fmt.Errorf("Unsuported length of 'max_cstate' file") + // Only stop tune execution (i.e return error) if max_cstate file length is unsupported. + return 0, fmt.Errorf("Unsupported length of 'max_cstate' file") } func (tuner *tuner) disableCStates() error { @@ -145,7 +150,7 @@ func (tuner *tuner) checkIfPStateIsEnabled() (bool, error) { lines, err := utils.ReadFileLines(tuner.fs, "/sys/devices/system/cpu/cpu0/cpufreq/scaling_driver") if err != nil { - return false, nil + return false, err } if len(lines) == 0 { diff --git a/src/go/rpk/pkg/tuners/disk/block_devices.go b/src/go/rpk/pkg/tuners/disk/block_devices.go index 409a6e6b2a79..b1875d9058b9 100644 --- a/src/go/rpk/pkg/tuners/disk/block_devices.go +++ b/src/go/rpk/pkg/tuners/disk/block_devices.go @@ -114,9 +114,7 @@ func (b *blockDevices) GetDirectoryDevices(path string) ([]string, error) { } devices = append(devices, directoryDevices...) } else { - log.Error("Failed to create device"+ - " while 'df -P %s' returns a '%s'", - path, devicePath) + log.Errorf("Failed to create device while 'df -P %s' returns a '%s'", path, devicePath) } } if len(devices) == 0 { @@ -209,7 +207,7 @@ func (b *blockDevices) getDevicesIRQs( return diskIRQs, nil } -func (b *blockDevices) getDeviceControllerPath( +func (*blockDevices) getDeviceControllerPath( devSystemPath string, ) (string, error) { log.Debugf("Getting controller path for '%s'", devSystemPath) diff --git a/src/go/rpk/pkg/tuners/disk_checkers.go b/src/go/rpk/pkg/tuners/disk_checkers.go index 577e90c44c0f..a316629c567d 100644 --- a/src/go/rpk/pkg/tuners/disk_checkers.go +++ b/src/go/rpk/pkg/tuners/disk_checkers.go @@ -18,7 +18,6 @@ import ( ) func CreateDirectoryCheckers( - fs afero.Fs, dir string, blockDevices disk.BlockDevices, newDeviceChecker func(string) Checker, @@ -35,7 +34,7 @@ func CreateDirectoryCheckers( } func NewDeviceNomergesChecker( - fs afero.Fs, device string, deviceFeatures disk.DeviceFeatures, + device string, deviceFeatures disk.DeviceFeatures, ) Checker { return NewEqualityChecker( NomergesChecker, @@ -49,7 +48,6 @@ func NewDeviceNomergesChecker( } func NewDirectoryNomergesChecker( - fs afero.Fs, dir string, deviceFeatures disk.DeviceFeatures, blockDevices disk.BlockDevices, @@ -88,7 +86,7 @@ func checkDeviceNomerges( } func NewDeviceSchedulerChecker( - fs afero.Fs, device string, deviceFeatures disk.DeviceFeatures, + _ afero.Fs, device string, deviceFeatures disk.DeviceFeatures, ) Checker { return NewEqualityChecker( SchedulerChecker, @@ -102,7 +100,6 @@ func NewDeviceSchedulerChecker( } func NewDirectorySchedulerChecker( - fs afero.Fs, dir string, deviceFeatures disk.DeviceFeatures, blockDevices disk.BlockDevices, @@ -141,7 +138,7 @@ func checkScheduler( } func NewDeviceWriteCacheChecker( - fs afero.Fs, device string, deviceFeatures disk.DeviceFeatures, + device string, deviceFeatures disk.DeviceFeatures, ) Checker { return NewEqualityChecker( SchedulerChecker, @@ -155,7 +152,6 @@ func NewDeviceWriteCacheChecker( } func NewDirectoryWriteCacheChecker( - fs afero.Fs, dir string, deviceFeatures disk.DeviceFeatures, blockDevices disk.BlockDevices, @@ -194,7 +190,6 @@ func checkDeviceWriteCache( } func NewDisksIRQAffinityStaticChecker( - fs afero.Fs, devices []string, blockDevices disk.BlockDevices, balanceService irq.BalanceService, @@ -211,10 +206,7 @@ func NewDisksIRQAffinityStaticChecker( } func NewDirectoryIRQsAffinityStaticChecker( - fs afero.Fs, - dir string, - blockDevices disk.BlockDevices, - balanceService irq.BalanceService, + dir string, blockDevices disk.BlockDevices, balanceService irq.BalanceService, ) Checker { return NewEqualityChecker( DiskIRQsAffinityStaticChecker, @@ -252,12 +244,11 @@ func checkDisksIRQsAffinity( } func NewDisksIRQAffinityChecker( - fs afero.Fs, devices []string, cpuMask string, mode irq.Mode, blockDevices disk.BlockDevices, - cpuMasks irq.CpuMasks, + cpuMasks irq.CPUMasks, ) Checker { return NewEqualityChecker( DiskIRQsAffinityChecker, @@ -277,12 +268,11 @@ func NewDisksIRQAffinityChecker( } func NewDirectoryIRQAffinityChecker( - fs afero.Fs, dir string, cpuMask string, mode irq.Mode, blockDevices disk.BlockDevices, - cpuMasks irq.CpuMasks, + cpuMasks irq.CPUMasks, ) Checker { return NewEqualityChecker( DiskIRQsAffinityChecker, @@ -310,7 +300,7 @@ func areDevicesIRQsDistributed( cpuMask string, mode irq.Mode, blockDevices disk.BlockDevices, - cpuMasks irq.CpuMasks, + cpuMasks irq.CPUMasks, ) (bool, error) { expectedDistribution, err := GetExpectedIRQsDistribution( devices, diff --git a/src/go/rpk/pkg/tuners/disk_nomerges_tuner.go b/src/go/rpk/pkg/tuners/disk_nomerges_tuner.go index be4052e6a3eb..09a9bd602299 100644 --- a/src/go/rpk/pkg/tuners/disk_nomerges_tuner.go +++ b/src/go/rpk/pkg/tuners/disk_nomerges_tuner.go @@ -23,7 +23,7 @@ func NewDeviceNomergesTuner( executor executors.Executor, ) Tunable { return NewCheckedTunable( - NewDeviceNomergesChecker(fs, device, deviceFeatures), + NewDeviceNomergesChecker(device, deviceFeatures), func() TuneResult { return tuneNomerges(fs, device, deviceFeatures, executor) }, diff --git a/src/go/rpk/pkg/tuners/disk_scheduler_tuner_test.go b/src/go/rpk/pkg/tuners/disk_scheduler_tuner_test.go index b3fbb4342a2b..b2d832dd2c9a 100644 --- a/src/go/rpk/pkg/tuners/disk_scheduler_tuner_test.go +++ b/src/go/rpk/pkg/tuners/disk_scheduler_tuner_test.go @@ -18,6 +18,11 @@ import ( "github.com/stretchr/testify/require" ) +const ( + deadline string = "deadline" + fScheduler string = "/sys/devices/pci0000:00/0000:00:1d.0/0000:71:00.0/nvme/fake/queue/scheduler" +) + type deviceFeaturesMock struct { disk.DeviceFeatures getSupportedSchedulers func(string) ([]string, error) @@ -69,10 +74,10 @@ func TestDeviceSchedulerTuner_Tune(t *testing.T) { // given deviceFeatures := &deviceFeaturesMock{ getSchedulerFeatureFile: func(string) (string, error) { - return "/sys/devices/pci0000:00/0000:00:1d.0/0000:71:00.0/nvme/fake/queue/scheduler", nil + return fScheduler, nil }, getScheduler: func(string) (string, error) { - return "deadline", nil + return deadline, nil }, getSupportedSchedulers: func(string) ([]string, error) { return []string{"deadline", "cfq", "noop"}, nil @@ -84,7 +89,7 @@ func TestDeviceSchedulerTuner_Tune(t *testing.T) { // when tuner.Tune() // then - setValue, _ := afero.ReadFile(fs, "/sys/devices/pci0000:00/0000:00:1d.0/0000:71:00.0/nvme/fake/queue/scheduler") + setValue, _ := afero.ReadFile(fs, fScheduler) require.Equal(t, "noop", string(setValue)) } @@ -92,10 +97,10 @@ func TestDeviceSchedulerTuner_IsSupported_Should_return_true(t *testing.T) { // given deviceFeatures := &deviceFeaturesMock{ getSchedulerFeatureFile: func(string) (string, error) { - return "/sys/devices/pci0000:00/0000:00:1d.0/0000:71:00.0/nvme/fake/queue/scheduler", nil + return fScheduler, nil }, getScheduler: func(string) (string, error) { - return "deadline", nil + return deadline, nil }, getSupportedSchedulers: func(string) ([]string, error) { return []string{"deadline", "cfq", "noop"}, nil @@ -114,10 +119,10 @@ func TestDeviceSchedulerTuner_IsSupported_should_return_false(t *testing.T) { // given deviceFeatures := &deviceFeaturesMock{ getSchedulerFeatureFile: func(string) (string, error) { - return "/sys/devices/pci0000:00/0000:00:1d.0/0000:71:00.0/nvme/fake/queue/scheduler", nil + return fScheduler, nil }, getScheduler: func(string) (string, error) { - return "deadline", nil + return deadline, nil }, getSupportedSchedulers: func(string) ([]string, error) { return []string{"deadline", "cfq"}, nil @@ -136,10 +141,10 @@ func TestDeviceSchedulerTuner_Tune_should_prefer_none_over_noop(t *testing.T) { // given deviceFeatures := &deviceFeaturesMock{ getSchedulerFeatureFile: func(string) (string, error) { - return "/sys/devices/pci0000:00/0000:00:1d.0/0000:71:00.0/nvme/fake/queue/scheduler", nil + return fScheduler, nil }, getScheduler: func(string) (string, error) { - return "deadline", nil + return deadline, nil }, getSupportedSchedulers: func(string) ([]string, error) { return []string{"deadline", "cfq", "noop", "none"}, nil @@ -151,6 +156,6 @@ func TestDeviceSchedulerTuner_Tune_should_prefer_none_over_noop(t *testing.T) { // when tuner.Tune() // then - setValue, _ := afero.ReadFile(fs, "/sys/devices/pci0000:00/0000:00:1d.0/0000:71:00.0/nvme/fake/queue/scheduler") + setValue, _ := afero.ReadFile(fs, fScheduler) require.Equal(t, "none", string(setValue)) } diff --git a/src/go/rpk/pkg/tuners/disks_irq_tuner.go b/src/go/rpk/pkg/tuners/disks_irq_tuner.go index ddfe5c0f7323..f690eda2707e 100644 --- a/src/go/rpk/pkg/tuners/disks_irq_tuner.go +++ b/src/go/rpk/pkg/tuners/disks_irq_tuner.go @@ -20,7 +20,7 @@ import ( type disksIRQsTuner struct { fs afero.Fs irqDeviceInfo irq.DeviceInfo - cpuMasks irq.CpuMasks + cpuMasks irq.CPUMasks irqBalanceService irq.BalanceService irqProcFile irq.ProcFile blockDevices disk.BlockDevices @@ -39,7 +39,7 @@ func NewDiskIRQTuner( dirs []string, devices []string, irqDeviceInfo irq.DeviceInfo, - cpuMasks irq.CpuMasks, + cpuMasks irq.CPUMasks, irqBalanceService irq.BalanceService, irqProcFile irq.ProcFile, blockDevices disk.BlockDevices, @@ -91,37 +91,23 @@ func (tuner *disksIRQsTuner) Tune() TuneResult { for _, devices := range directoryDevices { allDevices = append(allDevices, devices...) } - balanceServiceTuner := NewDiskIRQsBalanceServiceTuner( - tuner.fs, - allDevices, - tuner.blockDevices, - tuner.irqBalanceService, - tuner.executor) + balanceServiceTuner := NewDiskIRQsBalanceServiceTuner(allDevices, tuner.blockDevices, tuner.irqBalanceService, tuner.executor) if result := balanceServiceTuner.Tune(); result.IsFailed() { return result } - affinityTuner := NewDiskIRQsAffinityTuner( - tuner.fs, - allDevices, - tuner.baseCPUMask, - tuner.mode, - tuner.blockDevices, - tuner.cpuMasks, - tuner.executor, - ) + affinityTuner := NewDiskIRQsAffinityTuner(allDevices, tuner.baseCPUMask, tuner.mode, tuner.blockDevices, tuner.cpuMasks, tuner.executor) return affinityTuner.Tune() } func NewDiskIRQsBalanceServiceTuner( - fs afero.Fs, devices []string, blockDevices disk.BlockDevices, balanceService irq.BalanceService, executor executors.Executor, ) Tunable { return NewCheckedTunable( - NewDisksIRQAffinityStaticChecker(fs, devices, blockDevices, balanceService), + NewDisksIRQAffinityStaticChecker(devices, blockDevices, balanceService), func() TuneResult { diskInfoByType, err := blockDevices.GetDiskInfoByType(devices) if err != nil { @@ -145,16 +131,15 @@ func NewDiskIRQsBalanceServiceTuner( } func NewDiskIRQsAffinityTuner( - fs afero.Fs, devices []string, cpuMask string, mode irq.Mode, blockDevices disk.BlockDevices, - cpuMasks irq.CpuMasks, + cpuMasks irq.CPUMasks, executor executors.Executor, ) Tunable { return NewCheckedTunable( - NewDisksIRQAffinityChecker(fs, devices, cpuMask, mode, blockDevices, cpuMasks), + NewDisksIRQAffinityChecker(devices, cpuMask, mode, blockDevices, cpuMasks), func() TuneResult { distribution, err := GetExpectedIRQsDistribution( devices, @@ -184,12 +169,12 @@ func GetExpectedIRQsDistribution( blockDevices disk.BlockDevices, mode irq.Mode, cpuMask string, - cpuMasks irq.CpuMasks, + cpuMasks irq.CPUMasks, ) (map[int]string, error) { log.Debugf("Getting %v IRQs distribution with mode %s and CPU mask %s", devices, mode, cpuMask) - finalCpuMask, err := cpuMasks.BaseCpuMask(cpuMask) + finalCPUMask, err := cpuMasks.BaseCPUMask(cpuMask) if err != nil { return nil, err } @@ -202,7 +187,7 @@ func GetExpectedIRQsDistribution( if mode != irq.Default { effectiveMode = mode } else { - effectiveMode, err = GetDefaultMode(finalCpuMask, diskInfoByType, cpuMasks) + effectiveMode, err = GetDefaultMode(finalCPUMask, diskInfoByType, cpuMasks) if err != nil { return nil, err } @@ -210,7 +195,7 @@ func GetExpectedIRQsDistribution( nonNvmeDisksInfo := diskInfoByType[disk.NonNvme] nvmeDisksInfo := diskInfoByType[disk.Nvme] - irqCPUMask, err := cpuMasks.CpuMaskForIRQs(effectiveMode, finalCpuMask) + irqCPUMask, err := cpuMasks.CPUMaskForIRQs(effectiveMode, finalCPUMask) if err != nil { return nil, err } @@ -228,7 +213,7 @@ func GetExpectedIRQsDistribution( if len(nvmeDisksInfo.Devices) > 0 { IRQsDist, err := cpuMasks.GetIRQsDistributionMasks( - nvmeDisksInfo.Irqs, finalCpuMask) + nvmeDisksInfo.Irqs, finalCPUMask) if err != nil { return nil, err } @@ -243,7 +228,7 @@ func GetExpectedIRQsDistribution( func GetDefaultMode( cpuMask string, diskInfoByType map[disk.DiskType]disk.DevicesIRQs, - cpuMasks irq.CpuMasks, + cpuMasks irq.CPUMasks, ) (irq.Mode, error) { log.Debug("Calculating default mode for Disk IRQs") @@ -257,7 +242,7 @@ func GetDefaultMode( } numOfPUs, err := cpuMasks.GetNumberOfPUs(cpuMask) if err != nil { - return "", nil + return "", err } log.Debugf("Considering '%d' cores and '%d' PUs", numOfCores, numOfPUs) if numOfPUs <= 4 { diff --git a/src/go/rpk/pkg/tuners/disks_irq_tuner_test.go b/src/go/rpk/pkg/tuners/disks_irq_tuner_test.go index 1aa5689886cf..0bf1ff091350 100644 --- a/src/go/rpk/pkg/tuners/disks_irq_tuner_test.go +++ b/src/go/rpk/pkg/tuners/disks_irq_tuner_test.go @@ -18,8 +18,8 @@ import ( ) type cpuMasksMock struct { - irq.CpuMasks - baseCpuMask func(string) (string, error) + irq.CPUMasks + baseCPUMask func(string) (string, error) cpuMaskForIRQs func(irq.Mode, string) (string, error) getIRQsDistributionMasks func([]int, string) (map[int]string, error) } @@ -32,11 +32,11 @@ type blockDevicesMock struct { getDiskInfoByType func([]string) (map[disk.DiskType]disk.DevicesIRQs, error) } -func (m *cpuMasksMock) BaseCpuMask(cpuMask string) (string, error) { - return m.baseCpuMask(cpuMask) +func (m *cpuMasksMock) BaseCPUMask(cpuMask string) (string, error) { + return m.baseCPUMask(cpuMask) } -func (m *cpuMasksMock) CpuMaskForIRQs( +func (m *cpuMasksMock) CPUMaskForIRQs( mode irq.Mode, cpuMask string, ) (string, error) { return m.cpuMaskForIRQs(mode, cpuMask) @@ -80,7 +80,7 @@ func TestGetExpectedIRQsDistribution(t *testing.T) { mode irq.Mode cpuMask string blockDevices disk.BlockDevices - cpuMasks irq.CpuMasks + cpuMasks irq.CPUMasks } tests := []struct { name string @@ -108,7 +108,7 @@ func TestGetExpectedIRQsDistribution(t *testing.T) { }, }, cpuMasks: &cpuMasksMock{ - baseCpuMask: func(string) (string, error) { + baseCPUMask: func(string) (string, error) { return "0x0000000f", nil }, cpuMaskForIRQs: func(mode irq.Mode, cpuMask string) (string, error) { diff --git a/src/go/rpk/pkg/tuners/equality_checker.go b/src/go/rpk/pkg/tuners/equality_checker.go index 94cc3da86a13..754ce9678ab7 100644 --- a/src/go/rpk/pkg/tuners/equality_checker.go +++ b/src/go/rpk/pkg/tuners/equality_checker.go @@ -16,7 +16,7 @@ import ( // NewEqualityChecker creates a checker that will return valid result if value // returned by getCurrent function is equal to required value. This checker uses -// reflect.DeepEqual to compare the values +// reflect.DeepEqual to compare the values. func NewEqualityChecker( id CheckerID, desc string, @@ -41,7 +41,7 @@ type equalityChecker struct { getCurrent func() (interface{}, error) } -func (c *equalityChecker) Id() CheckerID { +func (c *equalityChecker) ID() CheckerID { return c.id } @@ -59,7 +59,7 @@ func (c *equalityChecker) GetRequiredAsString() string { func (c *equalityChecker) Check() *CheckResult { res := &CheckResult{ - CheckerId: c.Id(), + CheckerID: c.ID(), Desc: c.GetDesc(), Severity: c.GetSeverity(), Required: c.GetRequiredAsString(), diff --git a/src/go/rpk/pkg/tuners/executors/commands/write_file_test.go b/src/go/rpk/pkg/tuners/executors/commands/write_file_test.go index f6059fb3c49c..ab2cde9fe882 100644 --- a/src/go/rpk/pkg/tuners/executors/commands/write_file_test.go +++ b/src/go/rpk/pkg/tuners/executors/commands/write_file_test.go @@ -20,9 +20,10 @@ import ( "github.com/spf13/afero" ) +const path string = "/usr/file" + func TestWriteFileCmdExecute(t *testing.T) { fs := afero.NewMemMapFs() - path := "/usr/file" content := `some multiline content @@ -54,7 +55,6 @@ content func TestWriteFileModeCmdExecuteExistingFile(t *testing.T) { fs := afero.NewMemMapFs() - path := "/usr/file" mode := os.FileMode(0765) err := afero.WriteFile(fs, path, []byte{}, mode) @@ -83,7 +83,6 @@ func TestWriteFileModeCmdExecuteExistingFile(t *testing.T) { func TestWriteFileCmdRender(t *testing.T) { fs := afero.NewMemMapFs() - path := "/usr/file" content := `some multiline content @@ -112,7 +111,6 @@ chmod %o %s func TestWriteFileCmdRenderExistingFile(t *testing.T) { fs := afero.NewMemMapFs() - path := "/usr/file" content := "content" mode := os.FileMode(0765) diff --git a/src/go/rpk/pkg/tuners/executors/direct.go b/src/go/rpk/pkg/tuners/executors/direct.go index c8bbfb8e4768..bad74cda7434 100644 --- a/src/go/rpk/pkg/tuners/executors/direct.go +++ b/src/go/rpk/pkg/tuners/executors/direct.go @@ -19,10 +19,10 @@ func NewDirectExecutor() Executor { return &directExecutor{} } -func (e *directExecutor) Execute(cmd commands.Command) error { +func (*directExecutor) Execute(cmd commands.Command) error { return cmd.Execute() } -func (e *directExecutor) IsLazy() bool { +func (*directExecutor) IsLazy() bool { return false } diff --git a/src/go/rpk/pkg/tuners/executors/script_rendering.go b/src/go/rpk/pkg/tuners/executors/script_rendering.go index 356f0a250bb5..aa7cdaedcdc9 100644 --- a/src/go/rpk/pkg/tuners/executors/script_rendering.go +++ b/src/go/rpk/pkg/tuners/executors/script_rendering.go @@ -57,6 +57,6 @@ func (e *scriptRenderingExecutor) Execute(cmd commands.Command) error { return e.writer.Flush() } -func (e *scriptRenderingExecutor) IsLazy() bool { +func (*scriptRenderingExecutor) IsLazy() bool { return true } diff --git a/src/go/rpk/pkg/tuners/factory/factory.go b/src/go/rpk/pkg/tuners/factory/factory.go index 1565aaae35bc..beb5d115553c 100644 --- a/src/go/rpk/pkg/tuners/factory/factory.go +++ b/src/go/rpk/pkg/tuners/factory/factory.go @@ -42,7 +42,7 @@ var ( "disk_write_cache": (*tunersFactory).newGcpWriteCacheTuner, "fstrim": (*tunersFactory).newFstrimTuner, "net": (*tunersFactory).newNetworkTuner, - "cpu": (*tunersFactory).newCpuTuner, + "cpu": (*tunersFactory).newCPUTuner, "aio_events": (*tunersFactory).newMaxAIOEventsTuner, "clocksource": (*tunersFactory).newClockSourceTuner, "swappiness": (*tunersFactory).newSwappinessTuner, @@ -54,7 +54,7 @@ var ( type TunerParams struct { Mode string - CpuMask string + CPUMask string RebootAllowed bool Disks []string Directories []string @@ -69,7 +69,7 @@ type tunersFactory struct { fs afero.Fs conf config.Config irqDeviceInfo irq.DeviceInfo - cpuMasks irq.CpuMasks + cpuMasks irq.CPUMasks irqBalanceService irq.BalanceService irqProcFile irq.ProcFile blockDevices disk.BlockDevices @@ -112,7 +112,7 @@ func newTunersFactory( conf: conf, irqProcFile: irqProcFile, irqDeviceInfo: irqDeviceInfo, - cpuMasks: irq.NewCpuMasks(fs, hwloc.NewHwLocCmd(proc, timeout), executor), + cpuMasks: irq.NewCPUMasks(fs, hwloc.NewHwLocCmd(proc, timeout), executor), irqBalanceService: irq.NewBalanceService(fs, proc, executor, timeout), blockDevices: disk.NewBlockDevices(fs, irqDeviceInfo, irqProcFile, proc, timeout), grub: system.NewGrub(os.NewCommands(proc), proc, fs, executor, timeout), @@ -148,7 +148,7 @@ func IsTunerEnabled(tuner string, rpkConfig config.RpkConfig) bool { case "net": return rpkConfig.TuneNetwork case "cpu": - return rpkConfig.TuneCpu + return rpkConfig.TuneCPU case "aio_events": return rpkConfig.TuneAioEvents case "clocksource": @@ -178,7 +178,7 @@ func (factory *tunersFactory) newDiskIRQTuner( return tuners.NewDiskIRQTuner( factory.fs, irq.ModeFromString(params.Mode), - params.CpuMask, + params.CPUMask, params.Directories, params.Disks, factory.irqDeviceInfo, @@ -241,7 +241,7 @@ func (factory *tunersFactory) newNetworkTuner( } return tuners.NewNetTuner( irq.ModeFromString(params.Mode), - params.CpuMask, + params.CPUMask, params.Nics, factory.fs, factory.irqDeviceInfo, @@ -253,8 +253,8 @@ func (factory *tunersFactory) newNetworkTuner( ) } -func (factory *tunersFactory) newCpuTuner(params *TunerParams) tuners.Tunable { - return cpu.NewCpuTuner( +func (factory *tunersFactory) newCPUTuner(params *TunerParams) tuners.Tunable { + return cpu.NewCPUTuner( factory.cpuMasks, factory.grub, factory.fs, @@ -264,19 +264,19 @@ func (factory *tunersFactory) newCpuTuner(params *TunerParams) tuners.Tunable { } func (factory *tunersFactory) newMaxAIOEventsTuner( - params *TunerParams, + _ *TunerParams, ) tuners.Tunable { return tuners.NewMaxAIOEventsTuner(factory.fs, factory.executor) } func (factory *tunersFactory) newClockSourceTuner( - params *TunerParams, + _ *TunerParams, ) tuners.Tunable { return tuners.NewClockSourceTuner(factory.fs, factory.executor) } func (factory *tunersFactory) newSwappinessTuner( - params *TunerParams, + _ *TunerParams, ) tuners.Tunable { return tuners.NewSwappinessTuner(factory.fs, factory.executor) } @@ -285,14 +285,12 @@ func (factory *tunersFactory) newTHPTuner(_ *TunerParams) tuners.Tunable { return tuners.NewEnableTHPTuner(factory.fs, factory.executor) } -func (factory *tunersFactory) newCoredumpTuner( - params *TunerParams, -) tuners.Tunable { +func (factory *tunersFactory) newCoredumpTuner(_ *TunerParams) tuners.Tunable { return coredump.NewCoredumpTuner(factory.fs, factory.conf, factory.executor) } func (factory *tunersFactory) newBallastFileTuner( - params *TunerParams, + _ *TunerParams, ) tuners.Tunable { return ballast.NewBallastFileTuner(factory.conf, factory.executor) } @@ -302,8 +300,8 @@ func MergeTunerParamsConfig( ) (*TunerParams, error) { if len(params.Nics) == 0 { addrs := []string{conf.Redpanda.RPCServer.Address} - if len(conf.Redpanda.KafkaApi) > 0 { - addrs = append(addrs, conf.Redpanda.KafkaApi[0].Address) + if len(conf.Redpanda.KafkaAPI) > 0 { + addrs = append(addrs, conf.Redpanda.KafkaAPI[0].Address) } nics, err := net.GetInterfacesByIps( addrs..., @@ -323,8 +321,8 @@ func FillTunerParamsWithValuesFromConfig( params *TunerParams, conf *config.Config, ) error { addrs := []string{conf.Redpanda.RPCServer.Address} - if len(conf.Redpanda.KafkaApi) > 0 { - addrs = append(addrs, conf.Redpanda.KafkaApi[0].Address) + if len(conf.Redpanda.KafkaAPI) > 0 { + addrs = append(addrs, conf.Redpanda.KafkaAPI[0].Address) } nics, err := net.GetInterfacesByIps( addrs..., diff --git a/src/go/rpk/pkg/tuners/factory/factory_test.go b/src/go/rpk/pkg/tuners/factory/factory_test.go index a062337da28a..d7755d9a7c49 100644 --- a/src/go/rpk/pkg/tuners/factory/factory_test.go +++ b/src/go/rpk/pkg/tuners/factory/factory_test.go @@ -23,7 +23,7 @@ import ( func getValidTunerParams() *factory.TunerParams { return &factory.TunerParams{ Mode: "", - CpuMask: "00000000000000000000000000000001", + CPUMask: "00000000000000000000000000000001", RebootAllowed: true, Disks: []string{"dev1"}, Directories: []string{"/var/lib/redpanda"}, diff --git a/src/go/rpk/pkg/tuners/float_checker.go b/src/go/rpk/pkg/tuners/float_checker.go index 372bdbf3aee6..92793ea3f987 100644 --- a/src/go/rpk/pkg/tuners/float_checker.go +++ b/src/go/rpk/pkg/tuners/float_checker.go @@ -38,7 +38,7 @@ type floatChecker struct { severity Severity } -func (c *floatChecker) Id() CheckerID { +func (c *floatChecker) ID() CheckerID { return c.id } @@ -56,7 +56,7 @@ func (c *floatChecker) GetRequiredAsString() string { func (c *floatChecker) Check() *CheckResult { res := &CheckResult{ - CheckerId: c.Id(), + CheckerID: c.ID(), Desc: c.GetDesc(), Severity: c.GetSeverity(), Required: c.GetRequiredAsString(), diff --git a/src/go/rpk/pkg/tuners/fstrim.go b/src/go/rpk/pkg/tuners/fstrim.go index 2a873964b57c..24fee9f5a49d 100644 --- a/src/go/rpk/pkg/tuners/fstrim.go +++ b/src/go/rpk/pkg/tuners/fstrim.go @@ -53,7 +53,7 @@ func NewFstrimTuner(fs afero.Fs, executor executors.Executor) Tunable { return &fstrimTuner{fs: fs, executor: executor} } -func (t *fstrimTuner) CheckIfSupported() (bool, string) { +func (*fstrimTuner) CheckIfSupported() (bool, string) { // Check that systemd is available c, err := systemd.NewDbusClient() if err != nil { @@ -80,7 +80,7 @@ func (t *fstrimTuner) Tune() TuneResult { func tuneFstrim( fs afero.Fs, exe executors.Executor, c systemd.Client, proc os.Proc, ) TuneResult { - // Check if the default timer (fstrim.timer) is available + // Check if the default timer (fstrim.timer) is available. defaultAvailable, err := startIfAvailable(exe, c, timerName) if err != nil { return NewTuneError(err) @@ -97,7 +97,7 @@ func tuneFstrim( if customAvailable { return NewTuneResult(false) } - // Other wise, install an rpk-provided fstrim service + // Other wise, install an rpk-provided fstrim service. fstrimBinPath, err := whichFstrim(proc, timeout) if err != nil { return NewTuneError(err) @@ -107,7 +107,7 @@ func tuneFstrim( if err != nil { return NewTuneError(err) } - // Install the rpk-provided fstrim timer + // Install the rpk-provided fstrim timer. err = installSystemdUnit(fs, exe, c, fstrimTimer, customTimerName) if err != nil { // If the timer can't be created, try removing the service too. @@ -117,7 +117,7 @@ func tuneFstrim( } return NewTuneError(err) } - // Start the timer + // Start the timer. err = startSystemdUnit(exe, c, customTimerName) if err != nil { return NewTuneError(err) @@ -137,7 +137,7 @@ func NewFstrimChecker() Checker { return false, err } defer c.Shutdown() - // Check if the distro fstrim timer is available & active + // Check if the distro fstrim timer is available & active. defLoadState, defActiveState, err := c.UnitState(timerName) if err != nil { return false, err @@ -147,7 +147,7 @@ func NewFstrimChecker() Checker { } // Otherwise, check if the rpk-provided timer is available // & active (i.e. if the tuner was run previously and - // installed it) + // installed it). _, customActiveState, err := c.UnitState(customTimerName) if err != nil { return false, err @@ -157,9 +157,7 @@ func NewFstrimChecker() Checker { ) } -/* - * Returns true if the unit is available, and an error if it couldn't be started - */ +// Returns true if the unit is available, and an error if it couldn't be started. func startIfAvailable( executor executors.Executor, c systemd.Client, name string, ) (bool, error) { diff --git a/src/go/rpk/pkg/tuners/gcp_disk_write_cache_tuner.go b/src/go/rpk/pkg/tuners/gcp_disk_write_cache_tuner.go index 615f279a9992..19fcd561b239 100644 --- a/src/go/rpk/pkg/tuners/gcp_disk_write_cache_tuner.go +++ b/src/go/rpk/pkg/tuners/gcp_disk_write_cache_tuner.go @@ -47,7 +47,7 @@ func NewDeviceGcpWriteCacheTuner( executor executors.Executor, ) Tunable { return NewCheckedTunable( - NewDeviceWriteCacheChecker(fs, device, deviceFeatures), + NewDeviceWriteCacheChecker(device, deviceFeatures), func() TuneResult { return tuneWriteCache(fs, device, deviceFeatures, executor) }, diff --git a/src/go/rpk/pkg/tuners/gcp_disk_write_cache_tuner_test.go b/src/go/rpk/pkg/tuners/gcp_disk_write_cache_tuner_test.go index 9c5f3fe9b6ef..a66f05f3df48 100644 --- a/src/go/rpk/pkg/tuners/gcp_disk_write_cache_tuner_test.go +++ b/src/go/rpk/pkg/tuners/gcp_disk_write_cache_tuner_test.go @@ -31,7 +31,7 @@ func (v *vendorMock) Init() (vendor.InitializedVendor, error) { return v.init() } -func (v *vendorMock) Name() string { +func (*vendorMock) Name() string { return "none" } @@ -39,7 +39,7 @@ func (v *currentVendor) Name() string { return v.name } -func (v *currentVendor) VmType() (string, error) { +func (*currentVendor) VMType() (string, error) { return "", nil } diff --git a/src/go/rpk/pkg/tuners/hwloc/cpuset.go b/src/go/rpk/pkg/tuners/hwloc/cpuset.go index f094cf68cace..289dca0f904a 100644 --- a/src/go/rpk/pkg/tuners/hwloc/cpuset.go +++ b/src/go/rpk/pkg/tuners/hwloc/cpuset.go @@ -15,7 +15,7 @@ import ( "strings" ) -func TranslateToHwLocCpuSet(cpuset string) (string, error) { +func TranslateToHwLocCPUSet(cpuset string) (string, error) { cpuSetPattern := regexp.MustCompile(`^(\d+-)?(\d+)(,(\d+-)?(\d+))*$`) if cpuset == "all" { diff --git a/src/go/rpk/pkg/tuners/hwloc/cpuset_test.go b/src/go/rpk/pkg/tuners/hwloc/cpuset_test.go index 2dfc72d91c67..4a7aeb49bd26 100644 --- a/src/go/rpk/pkg/tuners/hwloc/cpuset_test.go +++ b/src/go/rpk/pkg/tuners/hwloc/cpuset_test.go @@ -43,7 +43,7 @@ func TestTranslateToHwLocCpuSet(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := TranslateToHwLocCpuSet(tt.cpuset) + got, err := TranslateToHwLocCPUSet(tt.cpuset) if tt.wantErr { require.Error(t, err) return diff --git a/src/go/rpk/pkg/tuners/hwloc/hwloc_cmd.go b/src/go/rpk/pkg/tuners/hwloc/hwloc_cmd.go index b8042beeb067..4135cd82fd98 100644 --- a/src/go/rpk/pkg/tuners/hwloc/hwloc_cmd.go +++ b/src/go/rpk/pkg/tuners/hwloc/hwloc_cmd.go @@ -92,6 +92,9 @@ func (hwLocCmd *hwLocCmd) getNumberOf( ) (uint, error) { output, err := hwLocCmd.runCalc("--number-of", resource, "machine:0", "--restrict", mask) + if err != nil { + return 0, err + } count, err := strconv.Atoi(output) return uint(count), err } diff --git a/src/go/rpk/pkg/tuners/int_checker.go b/src/go/rpk/pkg/tuners/int_checker.go index f5a03d496a87..af329e7b0473 100644 --- a/src/go/rpk/pkg/tuners/int_checker.go +++ b/src/go/rpk/pkg/tuners/int_checker.go @@ -38,7 +38,7 @@ type intChecker struct { severity Severity } -func (c *intChecker) Id() CheckerID { +func (c *intChecker) ID() CheckerID { return c.id } @@ -56,7 +56,7 @@ func (c *intChecker) GetRequiredAsString() string { func (c *intChecker) Check() *CheckResult { res := &CheckResult{ - CheckerId: c.Id(), + CheckerID: c.ID(), Desc: c.GetDesc(), Severity: c.GetSeverity(), Required: c.GetRequiredAsString(), diff --git a/src/go/rpk/pkg/tuners/iotune/data.go b/src/go/rpk/pkg/tuners/iotune/data.go index 3743657cae64..e0af774aa69c 100644 --- a/src/go/rpk/pkg/tuners/iotune/data.go +++ b/src/go/rpk/pkg/tuners/iotune/data.go @@ -48,7 +48,7 @@ func DataFor(mountPoint, v, vm, storage string) (*IoProperties, error) { func DataForVendor( mountpoint string, v vendor.InitializedVendor, ) (*IoProperties, error) { - vmType, err := v.VmType() + vmType, err := v.VMType() if err != nil { return nil, fmt.Errorf("Couldn't get the current VM type for vendor '%s'", v.Name()) } diff --git a/src/go/rpk/pkg/tuners/irq/balance_service.go b/src/go/rpk/pkg/tuners/irq/balance_service.go index 7224a44fac6a..98aa81c4927e 100644 --- a/src/go/rpk/pkg/tuners/irq/balance_service.go +++ b/src/go/rpk/pkg/tuners/irq/balance_service.go @@ -83,10 +83,12 @@ func (balanceService *balanceService) BanIRQsAndRestart( return err } - var optionLines []string - newOptions := "" + var ( + optionLines []string + newOptions string + newLines []string + ) optionsKeyPattern := regexp.MustCompile(fmt.Sprintf("^\\s*%s", serviceInfo.optionsKey)) - var newLines []string for _, line := range configLines { if optionsKeyPattern.MatchString(line) { optionLines = append(optionLines, line) @@ -94,12 +96,14 @@ func (balanceService *balanceService) BanIRQsAndRestart( newLines = append(newLines, line) } } - if len(optionLines) == 0 { + + switch len(optionLines) { + case 0: newOptions = fmt.Sprintf("%s=\"", serviceInfo.optionsKey) - } else if len(optionLines) == 1 { + case 1: newOptions = regexp.MustCompile("\"\\s*$").ReplaceAllString( strings.TrimRight(optionLines[0], " "), "") - } else { + default: return fmt.Errorf("invalid format in '%s' - more than one line with '%s' key", serviceInfo.configFile, serviceInfo.optionsKey) } @@ -202,7 +206,10 @@ func (balanceService *balanceService) getBalanceServiceInfo() ( configFile = "/etc/sysconfig/irqbalance" optionsKey = "IRQBALANCE_ARGS" systemd = true - } else if exists, _ := afero.Exists(fs, "/etc/conf.d/irqbalance"); exists { + } else if exists, _ := afero.Exists(fs, "/etc/conf.d/irqbalance"); !exists { + log.Error("Unknown system configuration - not restarting irqbalance!") + return nil, errors.New("Unsupported irqbalance service configuration") + } else { configFile = "/etc/conf.d/irqbalance" optionsKey = "IRQBALANCE_OPTS" lines, err := utils.ReadFileLines(fs, "/proc/1/comm") @@ -210,9 +217,6 @@ func (balanceService *balanceService) getBalanceServiceInfo() ( return nil, err } systemd = strings.Contains(lines[0], "systemd") - } else { - log.Error("Unknown system configuration - not restarting irqbalance!") - return nil, errors.New("Unsupported irqbalance service configuration") } } return &balanceServiceInfo{ diff --git a/src/go/rpk/pkg/tuners/irq/balance_service_test.go b/src/go/rpk/pkg/tuners/irq/balance_service_test.go index 332c043af88c..83ef148ac3e1 100644 --- a/src/go/rpk/pkg/tuners/irq/balance_service_test.go +++ b/src/go/rpk/pkg/tuners/irq/balance_service_test.go @@ -45,7 +45,7 @@ type balanceServiceMock struct { isRunning bool } -func (m *balanceServiceMock) BanIRQsAndRestart(bannedIRQs []int) error { +func (*balanceServiceMock) BanIRQsAndRestart([]int) error { panic("not implemented") } diff --git a/src/go/rpk/pkg/tuners/irq/cpu_masks.go b/src/go/rpk/pkg/tuners/irq/cpu_masks.go index ac1fd290b80f..b9ea71b05c83 100644 --- a/src/go/rpk/pkg/tuners/irq/cpu_masks.go +++ b/src/go/rpk/pkg/tuners/irq/cpu_masks.go @@ -21,10 +21,10 @@ import ( "github.com/spf13/afero" ) -type CpuMasks interface { - BaseCpuMask(cpuMask string) (string, error) - CpuMaskForComputations(mode Mode, cpuMask string) (string, error) - CpuMaskForIRQs(mode Mode, cpuMask string) (string, error) +type CPUMasks interface { + BaseCPUMask(cpuMask string) (string, error) + CPUMaskForComputations(mode Mode, cpuMask string) (string, error) + CPUMaskForIRQs(mode Mode, cpuMask string) (string, error) SetMask(path string, mask string) error ReadMask(path string) (string, error) ReadIRQMask(IRQ int) (string, error) @@ -38,9 +38,9 @@ type CpuMasks interface { IsSupported() bool } -func NewCpuMasks( +func NewCPUMasks( fs afero.Fs, hwloc hwloc.HwLoc, executor executors.Executor, -) CpuMasks { +) CPUMasks { return &cpuMasks{ fs: fs, hwloc: hwloc, @@ -54,7 +54,7 @@ type cpuMasks struct { executor executors.Executor } -func (masks *cpuMasks) BaseCpuMask(cpuMask string) (string, error) { +func (masks *cpuMasks) BaseCPUMask(cpuMask string) (string, error) { if cpuMask == "all" { return masks.hwloc.All() } @@ -66,7 +66,7 @@ func (masks *cpuMasks) IsSupported() bool { return masks.hwloc.IsSupported() } -func (masks *cpuMasks) CpuMaskForComputations( +func (masks *cpuMasks) CPUMaskForComputations( mode Mode, cpuMask string, ) (string, error) { log.Debugf("Computing CPU mask for '%s' mode and input CPU mask '%s'", mode, cpuMask) @@ -86,14 +86,14 @@ func (masks *cpuMasks) CpuMaskForComputations( } if masks.hwloc.CheckIfMaskIsEmpty(computationsMask) { - err = fmt.Errorf("Bad configuration mode '%s' and cpu-mask value '%s':"+ + err = fmt.Errorf("bad configuration mode '%s' and cpu-mask value '%s':"+ " this results in a zero-mask for 'computations'", mode, cpuMask) } log.Debugf("Computations CPU mask '%s'", computationsMask) return computationsMask, err } -func (masks *cpuMasks) CpuMaskForIRQs( +func (masks *cpuMasks) CPUMaskForIRQs( mode Mode, cpuMask string, ) (string, error) { log.Debugf("Computing IRQ CPU mask for '%s' mode and input CPU mask '%s'", @@ -101,7 +101,7 @@ func (masks *cpuMasks) CpuMaskForIRQs( var err error var maskForIRQs string if mode != Mq { - maskForComputations, err := masks.CpuMaskForComputations(mode, cpuMask) + maskForComputations, err := masks.CPUMaskForComputations(mode, cpuMask) if err != nil { return "", err } diff --git a/src/go/rpk/pkg/tuners/irq/cpu_masks_test.go b/src/go/rpk/pkg/tuners/irq/cpu_masks_test.go index 57d853104114..df0ef6a59831 100644 --- a/src/go/rpk/pkg/tuners/irq/cpu_masks_test.go +++ b/src/go/rpk/pkg/tuners/irq/cpu_masks_test.go @@ -20,7 +20,7 @@ import ( func Test_cpuMasks_ReadMask(t *testing.T) { // given fs := afero.NewMemMapFs() - cpuMasks := NewCpuMasks(fs, nil, executors.NewDirectExecutor()) + cpuMasks := NewCPUMasks(fs, nil, executors.NewDirectExecutor()) setMask := "0xff0,,0x13" afero.WriteFile(fs, "/test/cpu/0/smp_affinity", []byte{0}, 0644) cpuMasks.SetMask("/test/cpu/0/smp_affinity", setMask) diff --git a/src/go/rpk/pkg/tuners/irq/device_info.go b/src/go/rpk/pkg/tuners/irq/device_info.go index 3c94aaae251d..d617848c5ddb 100644 --- a/src/go/rpk/pkg/tuners/irq/device_info.go +++ b/src/go/rpk/pkg/tuners/irq/device_info.go @@ -98,7 +98,7 @@ func (deviceInfo *deviceInfo) GetIRQs( return irqs, nil } -func (deviceInfo *deviceInfo) getIRQsForLinesMatching( +func (*deviceInfo) getIRQsForLinesMatching( pattern string, irqToProcLineMap map[int]string, ) []int { var irqs []int diff --git a/src/go/rpk/pkg/tuners/kernel_version.go b/src/go/rpk/pkg/tuners/kernel_version.go index b9220acf616b..9f35c869238d 100644 --- a/src/go/rpk/pkg/tuners/kernel_version.go +++ b/src/go/rpk/pkg/tuners/kernel_version.go @@ -25,25 +25,25 @@ type kernelVersionChecker struct { getCurrent func() (string, error) } -func (c kernelVersionChecker) Id() CheckerID { +func (kernelVersionChecker) ID() CheckerID { return KernelVersion } -func (c kernelVersionChecker) GetDesc() string { +func (kernelVersionChecker) GetDesc() string { return "Kernel Version" } -func (c kernelVersionChecker) GetSeverity() Severity { +func (kernelVersionChecker) GetSeverity() Severity { return Warning } -func (c kernelVersionChecker) GetRequiredAsString() string { +func (kernelVersionChecker) GetRequiredAsString() string { return "4.19" } func (c kernelVersionChecker) Check() *CheckResult { res := &CheckResult{ - CheckerId: c.Id(), + CheckerID: c.ID(), Desc: c.GetDesc(), Severity: c.GetSeverity(), Required: c.GetRequiredAsString(), diff --git a/src/go/rpk/pkg/tuners/kernel_version_test.go b/src/go/rpk/pkg/tuners/kernel_version_test.go index b3f1c5af121f..2f6405f312f8 100644 --- a/src/go/rpk/pkg/tuners/kernel_version_test.go +++ b/src/go/rpk/pkg/tuners/kernel_version_test.go @@ -32,7 +32,7 @@ func Test_kernelVersionChecker_Check(t *testing.T) { renderRequired: func() string { return "0" }, getCurrent: func() (string, error) { return "4.19.0", nil }, want: &CheckResult{ - CheckerId: KernelVersion, + CheckerID: KernelVersion, IsOk: true, Current: "4.19.0", Desc: "Kernel Version", @@ -46,7 +46,7 @@ func Test_kernelVersionChecker_Check(t *testing.T) { renderRequired: func() string { return "0" }, getCurrent: func() (string, error) { return "4.20.0", nil }, want: &CheckResult{ - CheckerId: KernelVersion, + CheckerID: KernelVersion, IsOk: true, Current: "4.20.0", Desc: "Kernel Version", @@ -60,7 +60,7 @@ func Test_kernelVersionChecker_Check(t *testing.T) { renderRequired: func() string { return "0" }, getCurrent: func() (string, error) { return "5.1.0", nil }, want: &CheckResult{ - CheckerId: KernelVersion, + CheckerID: KernelVersion, IsOk: true, Current: "5.1.0", Desc: "Kernel Version", @@ -74,7 +74,7 @@ func Test_kernelVersionChecker_Check(t *testing.T) { renderRequired: func() string { return "0" }, getCurrent: func() (string, error) { return "4.18.0", nil }, want: &CheckResult{ - CheckerId: KernelVersion, + CheckerID: KernelVersion, IsOk: false, Current: "4.18.0", Desc: "Kernel Version", @@ -89,7 +89,7 @@ func Test_kernelVersionChecker_Check(t *testing.T) { renderRequired: func() string { return "0" }, getCurrent: func() (string, error) { return "3.19.0", nil }, want: &CheckResult{ - CheckerId: KernelVersion, + CheckerID: KernelVersion, IsOk: false, Current: "3.19.0", Desc: "Kernel Version", @@ -104,7 +104,7 @@ func Test_kernelVersionChecker_Check(t *testing.T) { renderRequired: func() string { return "0" }, getCurrent: func() (string, error) { return "4.19", nil }, want: &CheckResult{ - CheckerId: KernelVersion, + CheckerID: KernelVersion, IsOk: false, Current: "4.19", Desc: "Kernel Version", @@ -119,7 +119,7 @@ func Test_kernelVersionChecker_Check(t *testing.T) { renderRequired: func() string { return "0" }, getCurrent: func() (string, error) { return "5.8.0-19-generic", nil }, want: &CheckResult{ - CheckerId: KernelVersion, + CheckerID: KernelVersion, IsOk: true, Current: "5.8.0-19-generic", Desc: "Kernel Version", diff --git a/src/go/rpk/pkg/tuners/net_checkers.go b/src/go/rpk/pkg/tuners/net_checkers.go index 3555161d1142..943fee25a934 100644 --- a/src/go/rpk/pkg/tuners/net_checkers.go +++ b/src/go/rpk/pkg/tuners/net_checkers.go @@ -45,7 +45,7 @@ type netCheckersFactory struct { irqDeviceInfo irq.DeviceInfo ethtool ethtool.EthtoolWrapper balanceService irq.BalanceService - cpuMasks irq.CpuMasks + cpuMasks irq.CPUMasks } func NewNetCheckersFactory( @@ -54,7 +54,7 @@ func NewNetCheckersFactory( irqDeviceInfo irq.DeviceInfo, ethtool ethtool.EthtoolWrapper, balanceService irq.BalanceService, - cpuMasks irq.CpuMasks, + cpuMasks irq.CPUMasks, ) NetCheckersFactory { return &netCheckersFactory{ fs: fs, @@ -80,7 +80,7 @@ func (f *netCheckersFactory) NewNicIRQAffinityStaticChecker( nic := network.NewNic(f.fs, f.irqProcFile, f.irqDeviceInfo, f.ethtool, ifaceName) nicIRQs, err := network.CollectIRQs(nic) if err != nil { - return false, nil + return false, err } IRQs = append(IRQs, nicIRQs...) } @@ -216,7 +216,7 @@ func (f *netCheckersFactory) NewNicNTupleCheckers( return f.forNonVirtualInterfaces(interfaces, f.NewNicNTupleChecker) } -func (f *netCheckersFactory) NewNicNTupleChecker(nic network.Nic) Checker { +func (*netCheckersFactory) NewNicNTupleChecker(nic network.Nic) Checker { return NewEqualityChecker( NicNTupleChecker, fmt.Sprintf("NIC %s NTuple set", nic.Name()), @@ -279,7 +279,7 @@ func (f *netCheckersFactory) NewNicXpsChecker(nic network.Nic) Checker { ) } -func (f *netCheckersFactory) NewRfsTableSizeChecker() Checker { +func (*netCheckersFactory) NewRfsTableSizeChecker() Checker { return NewIntChecker( RfsTableEntriesChecker, "RFS Table entries", diff --git a/src/go/rpk/pkg/tuners/net_tuners.go b/src/go/rpk/pkg/tuners/net_tuners.go index f3ee0dea8778..6367adc282b0 100644 --- a/src/go/rpk/pkg/tuners/net_tuners.go +++ b/src/go/rpk/pkg/tuners/net_tuners.go @@ -27,7 +27,7 @@ func NewNetTuner( interfaces []string, fs afero.Fs, irqDeviceInfo irq.DeviceInfo, - cpuMasks irq.CpuMasks, + cpuMasks irq.CPUMasks, irqBalanceService irq.BalanceService, irqProcFile irq.ProcFile, ethtool ethtool.EthtoolWrapper, @@ -67,7 +67,7 @@ type netTunersFactory struct { irqDeviceInfo irq.DeviceInfo ethtool ethtool.EthtoolWrapper balanceService irq.BalanceService - cpuMasks irq.CpuMasks + cpuMasks irq.CPUMasks checkersFactory NetCheckersFactory executor executors.Executor } @@ -78,7 +78,7 @@ func NewNetTunersFactory( irqDeviceInfo irq.DeviceInfo, ethtool ethtool.EthtoolWrapper, balanceService irq.BalanceService, - cpuMasks irq.CpuMasks, + cpuMasks irq.CPUMasks, executor executors.Executor, ) NetTunersFactory { return &netTunersFactory{ diff --git a/src/go/rpk/pkg/tuners/net_tuners_test.go b/src/go/rpk/pkg/tuners/net_tuners_test.go index c84bbf59b711..4e0ea44f826d 100644 --- a/src/go/rpk/pkg/tuners/net_tuners_test.go +++ b/src/go/rpk/pkg/tuners/net_tuners_test.go @@ -43,7 +43,7 @@ func mockNetTunersFactory( irq.NewDeviceInfo(fs, procFile), eth, irq.NewBalanceService(fs, proc, exec, timeout), - irq.NewCpuMasks(fs, hwlocCmd, exec), + irq.NewCPUMasks(fs, hwlocCmd, exec), exec, ), nil } @@ -117,13 +117,7 @@ func TestSynBacklogTuner(t *testing.T) { require.NoError(st, res.Error()) contents, err := afero.ReadFile(fs, scriptPath) require.NoError(st, err) - expected := `#!/bin/bash - -# Redpanda Tuning Script -# ---------------------------------- -# This file was autogenerated by RPK - -` + expected := rpTuningHeader if tt.expectChange { expected = expected + fmt.Sprintf(`echo '%d' > %s `, @@ -205,13 +199,7 @@ func TestListenBacklogTuner(t *testing.T) { require.NoError(st, res.Error()) contents, err := afero.ReadFile(fs, scriptPath) require.NoError(st, err) - expected := `#!/bin/bash - -# Redpanda Tuning Script -# ---------------------------------- -# This file was autogenerated by RPK - -` + expected := rpTuningHeader if tt.expectChange { expected = expected + fmt.Sprintf(`echo '%d' > %s `, diff --git a/src/go/rpk/pkg/tuners/network/nics.go b/src/go/rpk/pkg/tuners/network/nics.go index faa3078bab50..a327071a87f8 100644 --- a/src/go/rpk/pkg/tuners/network/nics.go +++ b/src/go/rpk/pkg/tuners/network/nics.go @@ -17,7 +17,7 @@ import ( ) func getDefaultMode( - nic Nic, cpuMask string, cpuMasks irq.CpuMasks, + nic Nic, cpuMask string, cpuMasks irq.CPUMasks, ) (irq.Mode, error) { if nic.IsHwInterface() { @@ -64,13 +64,13 @@ func getDefaultMode( } return defaultMode, nil } - return "", fmt.Errorf("Virutal device %s is not supported", nic.Name()) + return "", fmt.Errorf("Virtual device %s is not supported", nic.Name()) } func GetRpsCPUMask( - nic Nic, mode irq.Mode, cpuMask string, cpuMasks irq.CpuMasks, + nic Nic, mode irq.Mode, cpuMask string, cpuMasks irq.CPUMasks, ) (string, error) { - effectiveCPUMask, err := cpuMasks.BaseCpuMask(cpuMask) + effectiveCPUMask, err := cpuMasks.BaseCPUMask(cpuMask) if err != nil { return "", err } @@ -81,7 +81,7 @@ func GetRpsCPUMask( return "", err } } - computationsCPUMask, err := cpuMasks.CpuMaskForComputations( + computationsCPUMask, err := cpuMasks.CPUMaskForComputations( effectiveMode, effectiveCPUMask) if err != nil { return "", err @@ -90,9 +90,9 @@ func GetRpsCPUMask( } func GetHwInterfaceIRQsDistribution( - nic Nic, mode irq.Mode, cpuMask string, cpuMasks irq.CpuMasks, + nic Nic, mode irq.Mode, cpuMask string, cpuMasks irq.CPUMasks, ) (map[int]string, error) { - effectiveCPUMask, err := cpuMasks.BaseCpuMask(cpuMask) + effectiveCPUMask, err := cpuMasks.BaseCPUMask(cpuMask) if err != nil { return nil, err } @@ -113,7 +113,7 @@ func GetHwInterfaceIRQsDistribution( return nil, err } - irqCPUMask, err := cpuMasks.CpuMaskForIRQs(effectiveMode, effectiveCPUMask) + irqCPUMask, err := cpuMasks.CPUMaskForIRQs(effectiveMode, effectiveCPUMask) if err != nil { return nil, err } diff --git a/src/go/rpk/pkg/tuners/redpanda_checkers.go b/src/go/rpk/pkg/tuners/redpanda_checkers.go index ca937430fd42..68d40ffa300b 100644 --- a/src/go/rpk/pkg/tuners/redpanda_checkers.go +++ b/src/go/rpk/pkg/tuners/redpanda_checkers.go @@ -121,8 +121,8 @@ func NewMemoryChecker(fs afero.Fs) Checker { if err != nil { return 0, err } - memPerCpu := availableMem / int(effCpus) - return memPerCpu, nil + memPerCPU := availableMem / int(effCpus) + return memPerCPU, nil }, ) } @@ -197,33 +197,17 @@ func RedpandaCheckers( irqDeviceInfo := irq.NewDeviceInfo(fs, irqProcFile) blockDevices := disk.NewBlockDevices(fs, irqDeviceInfo, irqProcFile, proc, timeout) deviceFeatures := disk.NewDeviceFeatures(fs, blockDevices) - schedulerChecker := NewDirectorySchedulerChecker( - fs, - config.Redpanda.Directory, - deviceFeatures, - blockDevices, - ) - nomergesChecker := NewDirectoryNomergesChecker( - fs, - config.Redpanda.Directory, - deviceFeatures, - blockDevices, - ) + schedulerChecker := NewDirectorySchedulerChecker(config.Redpanda.Directory, deviceFeatures, blockDevices) + nomergesChecker := NewDirectoryNomergesChecker(config.Redpanda.Directory, deviceFeatures, blockDevices) balanceService := irq.NewBalanceService(fs, proc, executor, timeout) - cpuMasks := irq.NewCpuMasks(fs, hwloc.NewHwLocCmd(proc, timeout), executor) - dirIRQAffinityChecker := NewDirectoryIRQAffinityChecker( - fs, config.Redpanda.Directory, "all", irq.Default, blockDevices, cpuMasks) - dirIRQAffinityStaticChecker := NewDirectoryIRQsAffinityStaticChecker( - fs, - config.Redpanda.Directory, - blockDevices, - balanceService, - ) - if len(config.Redpanda.KafkaApi) == 0 { + cpuMasks := irq.NewCPUMasks(fs, hwloc.NewHwLocCmd(proc, timeout), executor) + dirIRQAffinityChecker := NewDirectoryIRQAffinityChecker(config.Redpanda.Directory, "all", irq.Default, blockDevices, cpuMasks) + dirIRQAffinityStaticChecker := NewDirectoryIRQsAffinityStaticChecker(config.Redpanda.Directory, blockDevices, balanceService) + if len(config.Redpanda.KafkaAPI) == 0 { return nil, errors.New("'redpanda.kafka_api' is empty") } interfaces, err := net.GetInterfacesByIps( - config.Redpanda.KafkaApi[0].Address, + config.Redpanda.KafkaAPI[0].Address, config.Redpanda.RPCServer.Address, ) if err != nil { @@ -266,10 +250,7 @@ func RedpandaCheckers( // GCP when using local SSD's gcpVendor := gcp.GcpVendor{} if err == nil && v.Name() == gcpVendor.Name() { - checkers[WriteCachePolicyChecker] = []Checker{NewDirectoryWriteCacheChecker(fs, - config.Redpanda.Directory, - deviceFeatures, - blockDevices)} + checkers[WriteCachePolicyChecker] = []Checker{NewDirectoryWriteCacheChecker(config.Redpanda.Directory, deviceFeatures, blockDevices)} } return checkers, nil diff --git a/src/go/rpk/pkg/tuners/thp.go b/src/go/rpk/pkg/tuners/thp.go index c6c780788638..7161a077d8fa 100644 --- a/src/go/rpk/pkg/tuners/thp.go +++ b/src/go/rpk/pkg/tuners/thp.go @@ -53,9 +53,7 @@ func getTHPDir(fs afero.Fs) (string, error) { ) } -/* -/ Create a new tuner to enable Transparent Huge Pages -*/ +// Create a new tuner to enable Transparent Huge Pages. func NewEnableTHPTuner(fs afero.Fs, executor executors.Executor) Tunable { return &thpTuner{fs: fs, executor: executor} } diff --git a/src/go/rpk/pkg/tuners/thp_test.go b/src/go/rpk/pkg/tuners/thp_test.go index a772956e6707..79b538aaed35 100644 --- a/src/go/rpk/pkg/tuners/thp_test.go +++ b/src/go/rpk/pkg/tuners/thp_test.go @@ -19,6 +19,8 @@ import ( "github.com/stretchr/testify/require" ) +const thpDir string = "/sys/kernel/mm/transparent_hugepage" + func TestTHPTunerSupported(t *testing.T) { tests := []struct { name string @@ -28,7 +30,7 @@ func TestTHPTunerSupported(t *testing.T) { }{ { name: "should return true if the default dir exists", - thpDir: "/sys/kernel/mm/transparent_hugepage", + thpDir: thpDir, expected: true, }, { @@ -72,7 +74,7 @@ echo 'always' > /sys/kernel/mm/transparent_hugepage/enabled fs := afero.NewMemMapFs() scriptFileName := "script.sh" exec := executors.NewScriptRenderingExecutor(fs, scriptFileName) - dir := "/sys/kernel/mm/transparent_hugepage" + dir := thpDir err := fs.MkdirAll(dir, 0755) require.NoError(t, err) @@ -102,7 +104,7 @@ func TestTHPTunerDirectExecutor(t *testing.T) { expected := "always" fs := afero.NewMemMapFs() exec := executors.NewDirectExecutor() - dir := "/sys/kernel/mm/transparent_hugepage" + dir := thpDir filePath := filepath.Join(dir, "enabled") err := fs.MkdirAll(dir, 0755) require.NoError(t, err) @@ -124,7 +126,7 @@ func TestTHPTunerDirectExecutor(t *testing.T) { func TestTHPCheckID(t *testing.T) { c := tuners.NewTransparentHugePagesChecker(afero.NewMemMapFs()) - require.Equal(t, tuners.CheckerID(tuners.TransparentHugePagesChecker), c.Id()) + require.Equal(t, tuners.CheckerID(tuners.TransparentHugePagesChecker), c.ID()) } func TestTHPCheck(t *testing.T) { @@ -152,7 +154,7 @@ func TestTHPCheck(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(st *testing.T) { fs := afero.NewMemMapFs() - dir := "/sys/kernel/mm/transparent_hugepage" + dir := thpDir err := fs.MkdirAll(dir, 0755) require.NoError(t, err) diff --git a/src/go/rpk/pkg/utils/files.go b/src/go/rpk/pkg/utils/files.go index b5fc9ff90dac..2101414deee6 100644 --- a/src/go/rpk/pkg/utils/files.go +++ b/src/go/rpk/pkg/utils/files.go @@ -115,5 +115,5 @@ func ReadIntFromFile(fs afero.Fs, file string) (int, error) { if err != nil { return 0, err } - return strconv.Atoi(strings.TrimSpace(string(content))) + return strconv.Atoi(strings.TrimSpace(content)) } diff --git a/src/go/rpk/pkg/utils/os.go b/src/go/rpk/pkg/utils/os.go index eea0204f01c2..6aaec1e589ed 100644 --- a/src/go/rpk/pkg/utils/os.go +++ b/src/go/rpk/pkg/utils/os.go @@ -10,6 +10,7 @@ package utils import ( + "context" "io/ioutil" "net/http" "time" @@ -19,11 +20,21 @@ import ( func IsAWSi3MetalInstance() bool { log.Debug("Checking if we are running on i3.metal amazon instance type") - timeout := time.Duration(500 * time.Millisecond) + timeout := 500 * time.Millisecond client := http.Client{ Timeout: timeout, } - resp, err := client.Get("http://169.254.169.254/latest/meta-data/instance-type") + req, err := http.NewRequestWithContext( + context.Background(), + http.MethodGet, + "http://169.254.169.254/latest/meta-data/instance-type", + nil, + ) + if err != nil { + log.Debugf("error creating the request: %v", err) + return false + } + resp, err := client.Do(req) if err != nil { log.Debug("Can not contact AWS meta-data API, not running in EC2") return false