Skip to content

Commit c0f7ad9

Browse files
committed
Adds golangci lint check and fix corresponding issues
1 parent 3999a6b commit c0f7ad9

21 files changed

+327
-119
lines changed

.circleci/config.yml

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,38 @@
11
version: 2
22
jobs:
3+
build:
4+
working_directory: /go/src/github.com/gojekfarm/kat
5+
docker:
6+
- image: circleci/golang:1.11
7+
steps:
8+
- checkout
9+
- setup_remote_docker:
10+
docker_layer_caching: false
11+
- restore_cache:
12+
keys:
13+
- vendor-pkg-{{ checksum "go.sum" }}
14+
- vendor-pkg-
15+
- run:
16+
name: Install Dependencies
17+
command: |
18+
make setup
19+
- save_cache:
20+
paths:
21+
- ./vendor
22+
- "/go/pkg"
23+
key: vendor-pkg-{{ checksum "go.sum" }}
24+
- run:
25+
name: Check Quality
26+
command: |
27+
env GO111MODULE=on go mod verify
28+
make clean check-quality golangci
29+
- run:
30+
name: Build
31+
command: |
32+
env GO111MODULE=on go mod verify
33+
make clean build
34+
35+
336
test:
437
working_directory: /go/src/github.com/gojekfarm/kat
538
docker:
@@ -25,7 +58,7 @@ jobs:
2558
name: Run tests
2659
command: |
2760
env GO111MODULE=on go mod verify
28-
env GO111MODULE=on CGO_ENABLED=0 make
61+
make test
2962
3063
3164
release:
@@ -52,14 +85,17 @@ jobs:
5285
- run:
5386
name: Release go binary
5487
command: |
55-
env GO111MODULE=on CGO_ENABLED=0 make
88+
make
5689
curl -sL https://git.io/goreleaser | bash
5790
5891
workflows:
5992
version: 2
60-
build_and_test:
93+
build-test-release:
6194
jobs:
62-
- test
95+
- build
96+
- test:
97+
requires:
98+
- build
6399
- release:
64100
requires:
65101
- test

.golangci.yml

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
linters-settings:
2+
govet:
3+
check-shadowing: true
4+
settings:
5+
printf:
6+
funcs:
7+
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof
8+
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf
9+
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf
10+
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf
11+
golint:
12+
min-confidence: 0
13+
gocyclo:
14+
min-complexity: 8
15+
maligned:
16+
suggest-new: true
17+
dupl:
18+
threshold: 100
19+
goconst:
20+
min-len: 2
21+
min-occurrences: 3
22+
misspell:
23+
locale: US
24+
lll:
25+
line-length: 160
26+
goimports:
27+
local-prefixes: github.com/golangci/golangci-lint
28+
gocritic:
29+
enabled-tags:
30+
- performance
31+
- style
32+
- experimental
33+
disabled-checks:
34+
- wrapperFunc
35+
- hugeParam
36+
- octalLiteral
37+
38+
settings: # settings passed to gocritic
39+
captLocal: # must be valid enabled check name
40+
paramsOnly: true
41+
rangeValCopy:
42+
sizeThreshold: 200
43+
44+
linters:
45+
disable-all: true
46+
enable:
47+
- deadcode
48+
- depguard
49+
- dupl
50+
- errcheck
51+
- goconst
52+
- gocritic
53+
- gocyclo
54+
- gofmt
55+
- goimports
56+
- golint
57+
- gosec
58+
- gosimple
59+
- govet
60+
- ineffassign
61+
- interfacer
62+
- lll
63+
- misspell
64+
- nakedret
65+
- scopelint
66+
- staticcheck
67+
- structcheck
68+
- stylecheck
69+
- typecheck
70+
- unconvert
71+
- unparam
72+
- unused
73+
- varcheck
74+
75+
run:
76+
skip-dirs:
77+
- test/testdata_etc
78+
- pkg/golinters/goanalysis/(checker|passes)
79+
tests: false
80+
81+
issues:
82+
exclude-rules:
83+
- text: "weak cryptographic primitive"
84+
linters:
85+
- gosec
86+
87+
# golangci.com configuration
88+
# https://github.com/golangci/golangci/wiki/Configuration
89+
service:
90+
golangci-lint-version: 1.15.x # use the fixed version to not introduce new linters unexpectedly
91+
prepare:
92+
- echo "here I can run custom commands, but no preparation needed for this repo"

Makefile

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
all: clean check-quality test build
1+
all: clean check-quality golangci test build
22
APP=kat
33
ALL_PACKAGES=$(shell go list ./...)
44
SOURCE_DIRS=$(shell go list ./... | cut -d "/" -f4 | uniq)
@@ -15,6 +15,9 @@ setup:
1515
test:
1616
go test ./...
1717

18+
testcodecov:
19+
go test -coverprofile=coverage.txt -covermode=atomic ./...
20+
1821
build:
1922
@echo "Building './kat'..."
2023
go mod download
@@ -40,6 +43,10 @@ fix_imports:
4043
vet:
4144
go vet ./...
4245

46+
golangci:
47+
GO111MODULE=off go get -v github.com/golangci/golangci-lint/cmd/golangci-lint
48+
golangci-lint run -v --deadline 5m0s
49+
4350
test-coverage:
4451
mkdir -p ./out
4552
@echo "mode: count" > coverage-all.out

README.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# KAT
2+
[![Build Status](https://circleci.com/gh/gojekfarm/kat.svg?branch=master)](https://circleci.com/gh/gojekfarm/kat)
23

34
Kafka Admin Tool provides an interface to perform many admin operations on kafka in a straight-forward manner.
45

@@ -10,12 +11,14 @@ brew install kat
1011
```
1112

1213
### Others
13-
1. Download the project -- ```go get -u github.com/gojekfarm/kat```
14-
2. Build -- ```make```
14+
```
15+
go install github.com/gojekfarm/kat
16+
```
1517

1618
### Local Dev/Testing
17-
* Unit tests - ```make test```
18-
* Manual - Two kafka clusters can be created in local environment using docker-compose - ```docker-compose up -d```. Commands can be run against these clusters for testing
19+
* Clone the repo
20+
* Run ```make all``` to run lint checks, unit tests and build the project
21+
* Manual testing: Running ```docker-compose up -d``` will create 2 local kafka clusters. Commands can be run against these clusters for testing
1922

2023
## Admin operations available
2124
- [List Topics](#list-topics)

cmd/alterconfig.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ var alterConfigCmd = &cobra.Command{
2828

2929
func init() {
3030
alterConfigCmd.PersistentFlags().StringP("config", "c", "", "Comma separated list of configs, eg: key1=val1,key2=val2")
31-
alterConfigCmd.MarkPersistentFlagRequired("config")
31+
if err := alterConfigCmd.MarkPersistentFlagRequired("config"); err != nil {
32+
logger.Fatal(err)
33+
}
3234
}
3335

3436
func (a *alterConfig) alterConfig() {

cmd/base.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ func WithAddr(addrConfig string) Opts {
4343
}
4444

4545
func (b *BaseCmd) setTopicCli() {
46-
var err error
4746
addr := strings.Split(b.cobraUtil.GetStringArg(b.addrConfig), ",")
4847
var opts []pkg.TopicOpts
4948
if b.enableSSH {

cmd/config.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"github.com/gojekfarm/kat/logger"
45
"github.com/spf13/cobra"
56
)
67

@@ -11,8 +12,9 @@ var configCmd = &cobra.Command{
1112

1213
func init() {
1314
configCmd.PersistentFlags().StringP("topics", "t", "", "Comma separated list of topic names for which retention needs to be changed")
14-
configCmd.MarkPersistentFlagRequired("topics")
15-
15+
if err := configCmd.MarkPersistentFlagRequired("topics"); err != nil {
16+
logger.Fatal(err)
17+
}
1618
configCmd.AddCommand(showConfigCmd)
1719
configCmd.AddCommand(alterConfigCmd)
1820
}

cmd/deletetopic.go

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,21 +60,15 @@ func init() {
6060
}
6161

6262
func (d *deleteTopic) deleteTopic() {
63-
var regex string
64-
var include bool
65-
if ((d.topicWhitelist == "") && (d.topicBlacklist == "")) || ((d.topicWhitelist != "") && (d.topicBlacklist != "")) {
66-
logger.Fatalf("Any one of blacklist or whitelist should be passed.")
67-
return
68-
}
69-
if d.topicWhitelist != "" {
70-
include = true
71-
regex = d.topicWhitelist
72-
} else if d.topicBlacklist != "" {
73-
include = false
74-
regex = d.topicBlacklist
63+
regex, include, err := d.filterCriteria()
64+
if err != nil {
65+
logger.Fatal(err)
7566
}
7667
topics, err := d.getTopics(regex, include)
77-
if err != nil || len(topics) == 0 {
68+
if err != nil {
69+
logger.Fatal(err)
70+
}
71+
if len(topics) == 0 {
7872
return
7973
}
8074
fmt.Println("------------------------------------------------------------")
@@ -91,6 +85,20 @@ func (d *deleteTopic) deleteTopic() {
9185
}
9286
}
9387

88+
func (d *deleteTopic) filterCriteria() (regex string, include bool, err error) {
89+
if ((d.topicWhitelist == "") && (d.topicBlacklist == "")) || ((d.topicWhitelist != "") && (d.topicBlacklist != "")) {
90+
return regex, include, fmt.Errorf("any one of blacklist or whitelist should be passed")
91+
}
92+
if d.topicWhitelist != "" {
93+
include = true
94+
regex = d.topicWhitelist
95+
} else if d.topicBlacklist != "" {
96+
include = false
97+
regex = d.topicBlacklist
98+
}
99+
return regex, include, nil
100+
}
101+
94102
func (d *deleteTopic) getLastWrittenTopics() ([]string, error) {
95103
topics, err := d.TopicCli.ListLastWrittenTopics(d.lastWrite, d.dataDir)
96104
if err != nil {
@@ -101,17 +109,20 @@ func (d *deleteTopic) getLastWrittenTopics() ([]string, error) {
101109
}
102110

103111
func (d *deleteTopic) getTopics(regex string, include bool) ([]string, error) {
104-
var topics []string
105-
var err error
106112
if d.lastWrite != 0 {
107113
lastWrittenTopics, err := d.getLastWrittenTopics()
108114
if err != nil {
109115
return nil, err
110116
}
111-
topics, err = util.Filter(lastWrittenTopics, regex, include)
112-
} else {
113-
topics, err = d.TopicCli.ListOnly(regex, include)
117+
topics, err := util.Filter(lastWrittenTopics, regex, include)
118+
if err != nil {
119+
logger.Errorf("Error while fetching topic list - %v\n", err)
120+
return nil, err
121+
}
122+
return topics, nil
114123
}
124+
125+
topics, err := d.TopicCli.ListOnly(regex, include)
115126
if err != nil {
116127
logger.Errorf("Error while fetching topic list - %v\n", err)
117128
return nil, err

cmd/deletetopic_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,13 @@ func TestDelete_WhenLastWriteIsPassed_DeletesBlackListedTopicsOnError(t *testing
174174

175175
d := deleteTopic{BaseCmd: BaseCmd{TopicCli: mockTopicCli}, topicBlacklist: "test-1|test-2", io: mockIo, lastWrite: 123}
176176
mockTopicCli.On("ListLastWrittenTopics", d.lastWrite, d.dataDir).Return(topics, errors.New("test"))
177+
fakeExit := func(int) {
178+
panic("os.Exit called")
179+
}
180+
patch := monkey.Patch(os.Exit, fakeExit)
181+
defer patch.Unpatch()
177182

178-
d.deleteTopic()
183+
assert.PanicsWithValue(t, "os.Exit called", d.deleteTopic, "os.Exit was not called")
179184
mockTopicCli.AssertNotCalled(t, "ListOnly", mock.Anything, mock.Anything)
180185
mockTopicCli.AssertNotCalled(t, "Delete", mock.Anything)
181186
mockIo.AssertNotCalled(t, "AskForConfirmation", mock.Anything)

cmd/describetopic.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ var describeTopicCmd = &cobra.Command{
2828

2929
func init() {
3030
describeTopicCmd.PersistentFlags().StringP("topics", "t", "", "Comma separated list of topic names to describe")
31-
describeTopicCmd.MarkPersistentFlagRequired("topics")
31+
if err := describeTopicCmd.MarkPersistentFlagRequired("topics"); err != nil {
32+
logger.Fatal(err)
33+
}
3234
}
3335

3436
func (d *describeTopic) describeTopic() {
@@ -41,11 +43,13 @@ func (d *describeTopic) describeTopic() {
4143

4244
func printConfigs(metadata []*pkg.TopicMetadata) {
4345
for _, topicMetadata := range metadata {
44-
fmt.Printf("Topic Name: %v,\nIsInternal: %v,\nPartitions:\n", (*topicMetadata).Name, (*topicMetadata).IsInternal)
46+
fmt.Printf("Topic Name: %v,\nIsInternal: %v,\nPartitions:\n", topicMetadata.Name, topicMetadata.IsInternal)
4547

46-
partitions := (*topicMetadata).Partitions
48+
partitions := topicMetadata.Partitions
4749
for _, partitionMetadata := range partitions {
48-
fmt.Printf("Id: %v, Leader: %v, Replicas: %v, ISR: %v, OfflineReplicas: %v\n", (*partitionMetadata).ID, (*partitionMetadata).Leader, (*partitionMetadata).Replicas, (*partitionMetadata).Isr, (*partitionMetadata).OfflineReplicas)
50+
fmt.Printf("Id: %v, Leader: %v, Replicas: %v, ISR: %v, OfflineReplicas: %v\n",
51+
partitionMetadata.ID, partitionMetadata.Leader, partitionMetadata.Replicas,
52+
partitionMetadata.Isr, partitionMetadata.OfflineReplicas)
4953
}
5054
fmt.Println()
5155
}

0 commit comments

Comments
 (0)