Skip to content

Commit 12aaa6d

Browse files
[deckhouse-cli] Add linter github job (#218)
Signed-off-by: Smyslov Maxim <[email protected]> Signed-off-by: Pavel Okhlopkov <[email protected]> Co-authored-by: Pavel Okhlopkov <[email protected]>
1 parent e94affd commit 12aaa6d

File tree

20 files changed

+151
-85
lines changed

20 files changed

+151
-85
lines changed

.github/workflows/release.yaml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ on:
1111
env:
1212
GOPRIVATE: "flant.internal"
1313
PRIVATE_REPO: "${{secrets.DECKHOUSE_PRIVATE_REPO}}"
14+
GOLANGCI_LINT_VERSION: 'v2.1'
1415

1516
permissions:
1617
contents: write
@@ -135,3 +136,69 @@ jobs:
135136
- name: Run tests
136137
run: |
137138
task test
139+
140+
141+
lint:
142+
if: github.event_name == 'pull_request'
143+
runs-on: [self-hosted, regular]
144+
continue-on-error: true
145+
container:
146+
image: ubuntu:22.04
147+
name: Lint
148+
steps:
149+
- name: Install dependency for linux-amd64 dist
150+
env:
151+
DEBIAN_FRONTEND: noninteractive
152+
run: apt-get update && apt-get install -y apt-utils libbtrfs-dev file git gcc dnsutils
153+
154+
- name: Checkout
155+
uses: actions/checkout@v4
156+
with:
157+
fetch-depth: 0 # To use `git describe --tags`
158+
159+
- name: Setup Go
160+
uses: actions/setup-go@v5
161+
with:
162+
go-version: "1.23"
163+
cache: false # Cache download takes longer that a build from scratch
164+
165+
- name: Setup GolangCI-Lint
166+
uses: golangci/golangci-lint-action@v9
167+
with:
168+
install-only: 'true'
169+
version: ${{ env.GOLANGCI_LINT_VERSION }}
170+
171+
- name: Setup Task
172+
uses: arduino/setup-task@v2
173+
174+
- name: Start ssh-agent
175+
uses: webfactory/[email protected]
176+
with:
177+
ssh-private-key: |
178+
${{secrets.SOURCE_REPO_SSH_KEY}}
179+
180+
- name: Add ssh_known_hosts
181+
run: |
182+
echo "::add-mask::$PRIVATE_REPO"
183+
IPS=$(nslookup "$PRIVATE_REPO" | awk '/^Address: / { print $2 }')
184+
for IP in $IPS; do
185+
echo "::add-mask::$IP"
186+
done
187+
mkdir -p /root/.ssh
188+
touch /root/.ssh/known_hosts
189+
HOST_KEYS=$(ssh-keyscan -H "$PRIVATE_REPO" 2>/dev/null)
190+
echo "$HOST_KEYS" | while IFS= read -r KEY_LINE; do
191+
CONSTANT_PART=$(echo "$KEY_LINE" | awk '{print $2, $3}')
192+
if ! grep -q "$CONSTANT_PART" /root/.ssh/known_hosts; then
193+
echo "$KEY_LINE" >> /root/.ssh/known_hosts
194+
fi
195+
done
196+
197+
- name: Setup git
198+
run: |
199+
git config --global url."ssh://git@${PRIVATE_REPO}/".insteadOf "https://flant.internal/"
200+
git config --global --add safe.directory '*'
201+
202+
- name: Run lint
203+
run: |
204+
task lint:check

internal/data/common.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ func AskYesNoWithTimeout(prompt string, timeout time.Duration) bool {
5757
}
5858
}
5959

60-
func ParseArgs(args []string) (deName, srcPath string, err error) {
60+
func ParseArgs(args []string) ( /*deName*/ string /*srcPath*/, string, error) {
61+
var deName, srcPath string
62+
6163
switch len(args) {
6264
case 1:
6365
deName = args[0]
@@ -72,5 +74,5 @@ func ParseArgs(args []string) (deName, srcPath string, err error) {
7274
srcPath = "/" + srcPath
7375
}
7476

75-
return
77+
return deName, srcPath, nil
7678
}

internal/data/dataexport/cmd/create/create.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,16 @@ func NewCommand(ctx context.Context, log *slog.Logger) *cobra.Command {
6666
return cmd
6767
}
6868

69-
func parseArgs(args []string) (deName, volumeKind, volumeName string, err error) {
69+
func parseArgs(args []string) ( /*deName*/ string /*volumeKind*/, string /*volumeNamestring*/, string, error) {
70+
var deName, volumeKind, volumeName string
71+
7072
if len(args) != 2 {
71-
err = fmt.Errorf("invalid arguments")
72-
return
73+
return "", "", "", fmt.Errorf("invalid arguments")
7374
}
7475
deName = args[0]
7576
resourceTypeAndName := strings.Split(args[1], "/")
7677
if len(resourceTypeAndName) != 2 {
77-
err = fmt.Errorf("invalid volume format, expect: <type>/<name>")
78-
return
78+
return "", "", "", fmt.Errorf("invalid volume format, expect: <type>/<name>")
7979
}
8080
volumeKind, volumeName = strings.ToLower(resourceTypeAndName[0]), resourceTypeAndName[1]
8181
switch volumeKind {
@@ -88,11 +88,10 @@ func parseArgs(args []string) (deName, volumeKind, volumeName string, err error)
8888
case "vds", "virtualdisksnapshot":
8989
volumeKind = dataio.VirtualDiskSnapshotKind
9090
default:
91-
err = fmt.Errorf("invalid volume type; valid values: pvc | persistentvolumeclaim | vs | volumesnapshot | vd | virtualdisk | vds | virtualdisksnapshot")
92-
return
91+
return "", "", "", fmt.Errorf("invalid volume type; valid values: pvc | persistentvolumeclaim | vs | volumesnapshot | vd | virtualdisk | vds | virtualdisksnapshot")
9392
}
9493

95-
return
94+
return deName, volumeKind, volumeName, nil
9695
}
9796

9897
func Run(ctx context.Context, log *slog.Logger, cmd *cobra.Command, args []string) error {

internal/data/dataexport/cmd/delete/delete.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func NewCommand(ctx context.Context, log *slog.Logger) *cobra.Command {
6060
return cmd
6161
}
6262

63-
func parseArgs(args []string) (deName string, err error) {
63+
func parseArgs(args []string) ( /*deName*/ string, error) {
6464
if len(args) == 1 {
6565
return args[0], nil
6666
}

internal/data/dataexport/cmd/download/download.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func forRespItems(jsonStream io.ReadCloser, workFunc func(*dirItem) error) error
133133
return nil
134134
}
135135

136-
func recursiveDownload(ctx context.Context, sClient *safeClient.SafeClient, log *slog.Logger, sem chan struct{}, url, srcPath, dstPath string) (err error) {
136+
func recursiveDownload(ctx context.Context, sClient *safeClient.SafeClient, log *slog.Logger, sem chan struct{}, url, srcPath, dstPath string) error {
137137
if err := ctx.Err(); err != nil {
138138
return err
139139
}

internal/data/dataexport/cmd/list/list.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,19 @@ func NewCommand(ctx context.Context, log *slog.Logger) *cobra.Command {
7171
return cmd
7272
}
7373

74-
func parseArgs(args []string) (deName, srcPath string, err error) {
74+
func parseArgs(args []string) ( /*deName*/ string /*srcPath*/, string, error) {
75+
var deName, srcPath string
76+
7577
if len(args) < 1 || len(args) > 2 {
76-
err = fmt.Errorf("invalid arguments")
77-
return
78+
return "", "", fmt.Errorf("invalid arguments")
7879
}
7980

8081
deName, srcPath = args[0], ""
8182
if len(args) >= 2 {
8283
srcPath = args[1]
8384
}
8485

85-
return
86+
return deName, srcPath, nil
8687
}
8788

8889
func downloadFunc(

internal/data/dataexport/util/util.go

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -226,18 +226,19 @@ func DeleteDataExport(ctx context.Context, deName, namespace string, rtClient ct
226226
return nil
227227
}
228228

229-
func getExportStatus(ctx context.Context, log *slog.Logger, deName, namespace string, public bool, rtClient ctrlrtclient.Client) (podURL, volumeMode, internalCAData string, err error) {
229+
func getExportStatus(ctx context.Context, log *slog.Logger, deName, namespace string, public bool, rtClient ctrlrtclient.Client) ( /*podURL*/ string /*volumeMode*/, string /*internalCAData*/, string, error) {
230+
var podURL, volumeMode, internalCAData string
231+
230232
log.Info("Waiting for DataExport to be ready", slog.String("name", deName), slog.String("namespace", namespace))
231233
deObj, err := GetDataExportWithRestart(ctx, deName, namespace, rtClient)
232234
if err != nil {
233-
return
235+
return "", "", "", err
234236
}
235237

236238
switch {
237239
case public:
238240
if deObj.Status.PublicURL == "" {
239-
err = fmt.Errorf("empty PublicURL")
240-
return
241+
return "", "", "", fmt.Errorf("empty PublicURL")
241242
}
242243
podURL = deObj.Status.PublicURL
243244
if !strings.HasPrefix(podURL, "http") {
@@ -247,51 +248,48 @@ func getExportStatus(ctx context.Context, log *slog.Logger, deName, namespace st
247248
podURL = deObj.Status.URL
248249
internalCAData = deObj.Status.CA
249250
default:
250-
err = fmt.Errorf("invalid URL")
251-
return
251+
return "", "", "", fmt.Errorf("invalid URL")
252252
}
253253

254254
volumeKind := deObj.Spec.TargetRef.Kind
255255
if !slices.Contains([]string{dataio.PersistentVolumeClaimKind, dataio.VolumeSnapshotKind, dataio.VirtualDiskKind, dataio.VirtualDiskSnapshotKind}, volumeKind) {
256-
err = fmt.Errorf("invalid volume kind: %s", volumeKind)
257-
return
256+
return "", "", "", fmt.Errorf("invalid volume kind: %s", volumeKind)
258257
}
259258

260259
volumeMode = deObj.Status.VolumeMode
261260
log.Info("DataExport is ready", slog.String("name", deName), slog.String("namespace", namespace), slog.String("url", podURL), slog.String("volumeMode", volumeMode))
262-
return
261+
262+
return podURL, volumeMode, internalCAData, nil
263263
}
264264

265-
func PrepareDownload(ctx context.Context, log *slog.Logger, deName, namespace string, publish bool, sClient *safeClient.SafeClient) (url, volumeMode string, subClient *safeClient.SafeClient, finErr error) {
265+
func PrepareDownload(ctx context.Context, log *slog.Logger, deName, namespace string, publish bool, sClient *safeClient.SafeClient) (string, string, *safeClient.SafeClient, error) {
266+
var url, volumeMode string
267+
var subClient *safeClient.SafeClient
268+
266269
rtClient, err := sClient.NewRTClient(v1alpha1.AddToScheme)
267270
if err != nil {
268-
finErr = err
269-
return
271+
return "", "", nil, err
270272
}
271273

272274
podURL, volumeMode, intrenalCAData, err := getExportStatus(ctx, log, deName, namespace, publish, rtClient)
273275
if err != nil {
274-
finErr = err
275-
return
276+
return "", "", nil, err
276277
}
277278

278279
// Validate srcPath, dstPath params
279280
switch volumeMode {
280281
case "Filesystem":
281282
url, err = neturl.JoinPath(podURL, "api/v1/files")
282283
if err != nil {
283-
finErr = err
284-
return
284+
return "", "", nil, err
285285
}
286286
case "Block":
287287
url, err = neturl.JoinPath(podURL, "api/v1/block")
288288
if err != nil {
289-
finErr = err
290-
return
289+
return "", "", nil, err
291290
}
292291
default:
293-
finErr = fmt.Errorf("%w: '%s'", dataio.ErrUnsupportedVolumeMode, volumeMode)
294-
return
292+
return "", "", nil, fmt.Errorf("%w: '%s'", dataio.ErrUnsupportedVolumeMode, volumeMode)
295293
}
296294

297295
// Reuse the original SafeClient unless we need to inject additional CA.
@@ -302,11 +300,10 @@ func PrepareDownload(ctx context.Context, log *slog.Logger, deName, namespace st
302300
subClient = sClient.Copy()
303301
decodedBytes, err := base64.StdEncoding.DecodeString(intrenalCAData)
304302
if err != nil {
305-
finErr = fmt.Errorf("CA decoding error: %s", err.Error())
306-
return
303+
return "", "", nil, fmt.Errorf("CA decoding error: %s", err.Error())
307304
}
308305
subClient.SetTLSCAData(decodedBytes)
309306
}
310307

311-
return
308+
return url, volumeMode, subClient, nil
312309
}

internal/data/dataimport/cmd/delete/delete.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func NewCommand(ctx context.Context, log *slog.Logger) *cobra.Command {
4444
return cmd
4545
}
4646

47-
func parseArgs(args []string) (diName string, err error) {
47+
func parseArgs(args []string) ( /*diName*/ string, error) {
4848
if len(args) == 1 {
4949
return args[0], nil
5050
}

internal/data/dataimport/util/util.go

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package util //nolint:revive
1+
package util
22

33
import (
44
"context"
@@ -166,65 +166,60 @@ func PrepareUpload(
166166
diName, namespace string,
167167
publish bool,
168168
sClient *safeClient.SafeClient,
169-
) (url, volumeMode string, subClient *safeClient.SafeClient, finErr error) {
169+
) ( /*url*/ string /*volumeMode*/, string /*subClient*/, *safeClient.SafeClient, error) {
170+
var url, volumeMode string
171+
var subClient *safeClient.SafeClient
172+
170173
rtClient, err := sClient.NewRTClient(v1alpha1.AddToScheme)
171174
if err != nil {
172-
finErr = err
173-
return
175+
return "", "", nil, err
174176
}
175177

176178
diObj, err := GetDataImportWithRestart(ctx, diName, namespace, rtClient)
177179
if err != nil {
178-
finErr = err
179-
return
180+
return "", "", nil, err
180181
}
181182

182183
var podURL string
183184
switch {
184185
case publish:
185186
if diObj.Status.PublicURL == "" {
186-
finErr = fmt.Errorf("empty PublicURL")
187-
return
187+
return "", "", nil, fmt.Errorf("empty PublicURL")
188188
}
189189
podURL = diObj.Status.PublicURL
190190
case diObj.Status.URL != "":
191191
podURL = diObj.Status.URL
192192
default:
193-
finErr = fmt.Errorf("invalid URL")
194-
return
193+
return "", "", nil, fmt.Errorf("invalid URL")
195194
}
196195

197196
volumeMode = diObj.Status.VolumeMode
198197
switch volumeMode {
199198
case "Filesystem":
200199
url, err = neturl.JoinPath(podURL, "api/v1/files")
201200
if err != nil {
202-
finErr = err
203-
return
201+
return "", "", nil, err
204202
}
205203
case "Block":
206204
url, err = neturl.JoinPath(podURL, "api/v1/block")
207205
if err != nil {
208-
finErr = err
209-
return
206+
return "", "", nil, err
210207
}
211208
default:
212-
finErr = fmt.Errorf("%w: '%s'", dataio.ErrUnsupportedVolumeMode, volumeMode)
213-
return
209+
return "", "", nil, fmt.Errorf("%w: '%s'", dataio.ErrUnsupportedVolumeMode, volumeMode)
214210
}
215211

216212
subClient = sClient
217213
if !publish && len(diObj.Status.CA) > 0 {
218214
subClient = sClient.Copy()
219215
decodedBytes, err := base64.StdEncoding.DecodeString(diObj.Status.CA)
220216
if err != nil {
221-
finErr = fmt.Errorf("CA decoding error: %s", err.Error())
222-
return
217+
return "", "", nil, fmt.Errorf("CA decoding error: %s", err.Error())
223218
}
224219
subClient.SetTLSCAData(decodedBytes)
225220
}
226221

227-
return
222+
return url, volumeMode, subClient, nil
228223
}
229224

230225
func CheckUploadProgress(ctx context.Context, httpClient *safeClient.SafeClient, targetURL string) (int64, error) {

internal/mirror/chunked/chunk_reader.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func Open(baseDir, baseFileName string) (*FileReader, error) {
5555
}
5656
}
5757

58-
func (f *FileReader) Read(p []byte) (n int, err error) {
58+
func (f *FileReader) Read(p []byte) (int, error) {
5959
return f.multiRd.Read(p)
6060
}
6161

0 commit comments

Comments
 (0)