diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 434583a..58e1e59 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -42,3 +42,24 @@ jobs: - name: Build renku-dev-utils run: make rdu + + lint: + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Install Go + uses: actions/setup-go@v6 + with: + go-version: '1.24.2' + check-latest: true + + - name: Install libraries for ubuntu + run: | + sudo apt install libx11-dev + + - name: golangci-lint + uses: golangci/golangci-lint-action@v8 + with: + version: v2.1 diff --git a/pkg/cmd/cleanupdeployment.go b/pkg/cmd/cleanupdeployment.go index 99539bb..584a170 100644 --- a/pkg/cmd/cleanupdeployment.go +++ b/pkg/cmd/cleanupdeployment.go @@ -144,5 +144,5 @@ func askForConfirmation(question string) (response bool, err error) { case "no": return false, nil } - return false, fmt.Errorf("Invalid answer, aborting.") + return false, fmt.Errorf("invalid answer, aborting") } diff --git a/pkg/helm/release.go b/pkg/helm/release.go index 21678ef..364b173 100644 --- a/pkg/helm/release.go +++ b/pkg/helm/release.go @@ -30,9 +30,7 @@ type helmListOutput struct { func (cli *HelmCLI) UninstallReleases(ctx context.Context, namespace string, releases []string) error { args := []string{"uninstall", "--wait", "--namespace", namespace} - for _, release := range releases { - args = append(args, release) - } + args = append(args, releases...) out, err := cli.RunCmd(ctx, args...) if err != nil { diff --git a/pkg/k8s/client.go b/pkg/k8s/client.go index 51b952b..6122682 100644 --- a/pkg/k8s/client.go +++ b/pkg/k8s/client.go @@ -13,7 +13,7 @@ import ( func GetClientset() (*kubernetes.Clientset, error) { home := homedir.HomeDir() if home == "" { - return nil, fmt.Errorf("Could not determine home directory") + return nil, fmt.Errorf("could not determine home directory") } kubeconfig := filepath.Join(home, ".kube", "config") @@ -28,7 +28,7 @@ func GetClientset() (*kubernetes.Clientset, error) { func GetDynamicClient() (client *dynamic.DynamicClient, err error) { home := homedir.HomeDir() if home == "" { - return nil, fmt.Errorf("Could not determine home directory") + return nil, fmt.Errorf("could not determine home directory") } kubeconfig := filepath.Join(home, ".kube", "config") diff --git a/pkg/keycloak/admin.go b/pkg/keycloak/admin.go index c9e4202..d6dbc39 100644 --- a/pkg/keycloak/admin.go +++ b/pkg/keycloak/admin.go @@ -30,7 +30,7 @@ func (client *KeycloakClient) FindUser(ctx context.Context, realm string, email } } - return "", fmt.Errorf("Could not find user '%s' in Keycloak", email) + return "", fmt.Errorf("could not find user '%s' in Keycloak", email) } func (client *KeycloakClient) GetAdminUsersURL(realm string) *url.URL { @@ -75,11 +75,14 @@ func (client *KeycloakClient) findRenkuAdminRole(ctx context.Context, realm stri return role, err } } - return roleMapping{}, fmt.Errorf("Could not find role '%s' in Keycloak", renkuAdminRole) + return roleMapping{}, fmt.Errorf("could not find role '%s' in Keycloak", renkuAdminRole) } func (client *KeycloakClient) AddRenkuAdminRoleToUser(ctx context.Context, realm string, userID string) error { role, err := client.findRenkuAdminRole(ctx, realm, userID) + if err != nil { + return err + } postURL := client.GetAdminRolesURL(realm, userID) diff --git a/pkg/keycloak/rest.go b/pkg/keycloak/rest.go index da03e08..773e739 100644 --- a/pkg/keycloak/rest.go +++ b/pkg/keycloak/rest.go @@ -30,7 +30,7 @@ func (client *KeycloakClient) GetJSON(ctx context.Context, url string, result an if resp.Header.Get("Content-Type") == jsonContentType { parseErr = tryParseResponse(resp, result) } else { - return resp, fmt.Errorf("Expected '%s' but got response with content type '%s'", jsonContentType, resp.Header.Get("Content-Type")) + return resp, fmt.Errorf("expected '%s' but got response with content type '%s'", jsonContentType, resp.Header.Get("Content-Type")) } if resp.StatusCode >= 200 && resp.StatusCode < 300 && parseErr != nil { return resp, parseErr @@ -67,7 +67,7 @@ func (client *KeycloakClient) PostJSON(ctx context.Context, url string, body any // No content return resp, nil } else { - return resp, fmt.Errorf("Expected '%s' but got response with content type '%s'", jsonContentType, resp.Header.Get("Content-Type")) + return resp, fmt.Errorf("expected '%s' but got response with content type '%s'", jsonContentType, resp.Header.Get("Content-Type")) } if resp.StatusCode >= 200 && resp.StatusCode < 300 && parseErr != nil { return resp, parseErr @@ -95,7 +95,7 @@ func (client *KeycloakClient) PostForm(ctx context.Context, url string, data url if resp.Header.Get("Content-Type") == jsonContentType { parseErr = tryParseResponse(resp, result) } else { - return resp, fmt.Errorf("Expected '%s' but got response with content type '%s'", jsonContentType, resp.Header.Get("Content-Type")) + return resp, fmt.Errorf("expected '%s' but got response with content type '%s'", jsonContentType, resp.Header.Get("Content-Type")) } if resp.StatusCode >= 200 && resp.StatusCode < 300 && parseErr != nil { return resp, parseErr @@ -105,7 +105,11 @@ func (client *KeycloakClient) PostForm(ctx context.Context, url string, data url } func tryParseResponse(resp *http.Response, result any) error { - defer resp.Body.Close() + defer func() { + if err := resp.Body.Close(); err != nil { + fmt.Printf("Warning, could not close HTTP response: %s", err.Error()) + } + }() outBuf := new(bytes.Buffer) _, err := outBuf.ReadFrom(resp.Body) diff --git a/pkg/renkuapi/auth.go b/pkg/renkuapi/auth.go index 9fdd6ad..9ef7712 100644 --- a/pkg/renkuapi/auth.go +++ b/pkg/renkuapi/auth.go @@ -370,7 +370,11 @@ func (auth *RenkuApiAuth) postForm(ctx context.Context, url string, data url.Val } func tryParseResponse(resp *http.Response, result any) error { - defer resp.Body.Close() + defer func() { + if err := resp.Body.Close(); err != nil { + fmt.Printf("Warning, could not close HTTP response: %s", err.Error()) + } + }() outBuf := new(bytes.Buffer) _, err := outBuf.ReadFrom(resp.Body)