This is an automated email from the ASF dual-hosted git repository.
klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
The following commit(s) were added to refs/heads/main by this push:
new ceb3a8080 fix(sonarqube): modify connection to conform pr4260 (#4276)
ceb3a8080 is described below
commit ceb3a80806f80781e9df16a7b5b2f8fb54fc5195
Author: Warren Chen <[email protected]>
AuthorDate: Mon Jan 30 17:43:52 2023 +0800
fix(sonarqube): modify connection to conform pr4260 (#4276)
---
backend/plugins/ae/api/connection.go | 2 +-
backend/plugins/sonarqube/api/connection.go | 41 +++++++++-------------
backend/plugins/sonarqube/impl/impl.go | 2 +-
backend/plugins/sonarqube/models/connection.go | 3 +-
backend/plugins/sonarqube/tasks/api_client.go | 47 ++++----------------------
5 files changed, 26 insertions(+), 69 deletions(-)
diff --git a/backend/plugins/ae/api/connection.go
b/backend/plugins/ae/api/connection.go
index 91d3a0325..31e1e5af1 100644
--- a/backend/plugins/ae/api/connection.go
+++ b/backend/plugins/ae/api/connection.go
@@ -44,7 +44,7 @@ func TestConnection(input *plugin.ApiResourceInput)
(*plugin.ApiResourceOutput,
// decode
var err errors.Error
var connection models.AeConn
- if err := api.Decode(input.Body, &connection, vld); err != nil {
+ if err = api.Decode(input.Body, &connection, vld); err != nil {
return nil, errors.BadInput.Wrap(err, "could not decode request
parameters")
}
diff --git a/backend/plugins/sonarqube/api/connection.go
b/backend/plugins/sonarqube/api/connection.go
index bf518c0ad..dc861ece0 100644
--- a/backend/plugins/sonarqube/api/connection.go
+++ b/backend/plugins/sonarqube/api/connection.go
@@ -19,13 +19,11 @@ package api
import (
"context"
- "fmt"
"github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/plugin"
"github.com/apache/incubator-devlake/helpers/pluginhelper/api"
"github.com/apache/incubator-devlake/plugins/sonarqube/models"
"net/http"
- "time"
)
type validation struct {
@@ -39,17 +37,7 @@ func TestConnection(input *plugin.ApiResourceInput)
(*plugin.ApiResourceOutput,
if err = api.Decode(input.Body, &connection, vld); err != nil {
return nil, err
}
- // test connection
- apiClient, err := api.NewApiClient(
- context.TODO(),
- connection.Endpoint,
- map[string]string{
- "Authorization": fmt.Sprintf("Basic %s",
connection.GetEncodedToken()),
- },
- 3*time.Second,
- connection.Proxy,
- basicRes,
- )
+ apiClient, err := api.NewApiClientFromConnection(context.TODO(),
basicRes, connection)
if err != nil {
return nil, err
}
@@ -58,19 +46,22 @@ func TestConnection(input *plugin.ApiResourceInput)
(*plugin.ApiResourceOutput,
if err != nil {
return nil, err
}
- if res.StatusCode != http.StatusOK {
- return nil,
errors.HttpStatus(res.StatusCode).New(fmt.Sprintf("unexpected status code: %d",
res.StatusCode))
+ switch res.StatusCode {
+ case 200: // right StatusCode
+ body := &validation{}
+ err = api.UnmarshalResponse(res, body)
+ if err != nil {
+ return nil, err
+ }
+ if !body.Valid {
+ return nil, errors.Default.New("Authentication failed,
please check your access token.")
+ }
+ return &plugin.ApiResourceOutput{Body: true, Status: 200}, nil
+ case 401: // error secretKey or nonceStr
+ return &plugin.ApiResourceOutput{Body: false, Status:
res.StatusCode}, nil
+ default: // unknow what happen , back to user
+ return &plugin.ApiResourceOutput{Body: res.Body, Status:
res.StatusCode}, nil
}
-
- body := &validation{}
- err = api.UnmarshalResponse(res, body)
- if err != nil {
- return nil, err
- }
- if !body.Valid {
- return nil, errors.Default.New("Authentication failed, please
check your access token.")
- }
- return nil, nil
}
/*
diff --git a/backend/plugins/sonarqube/impl/impl.go
b/backend/plugins/sonarqube/impl/impl.go
index 82b7c55ad..50d5d8751 100644
--- a/backend/plugins/sonarqube/impl/impl.go
+++ b/backend/plugins/sonarqube/impl/impl.go
@@ -73,7 +73,7 @@ func (p Sonarqube) PrepareTaskData(taskCtx
plugin.TaskContext, options map[strin
return nil, errors.Default.Wrap(err, "unable to get Sonarqube
connection by the given connection ID")
}
- apiClient, err := tasks.NewSonarqubeApiClient(taskCtx, connection)
+ apiClient, err := tasks.CreateApiClient(taskCtx, connection)
if err != nil {
return nil, errors.Default.Wrap(err, "unable to get Sonarqube
API client instance")
}
diff --git a/backend/plugins/sonarqube/models/connection.go
b/backend/plugins/sonarqube/models/connection.go
index 422d88d51..6d29013de 100644
--- a/backend/plugins/sonarqube/models/connection.go
+++ b/backend/plugins/sonarqube/models/connection.go
@@ -47,8 +47,7 @@ func (sat SonarqubeAccessToken) GetEncodedToken() string {
type SonarqubeConnection struct {
helper.BaseConnection `mapstructure:",squash"`
helper.RestConnection `mapstructure:",squash"`
- // For sonarqube, we can `use user_token:`
- SonarqubeAccessToken `mapstructure:",squash"`
+ SonarqubeAccessToken `mapstructure:",squash"`
}
// SonarqubeConn holds the essential information to connect to the sonarqube
API
diff --git a/backend/plugins/sonarqube/tasks/api_client.go
b/backend/plugins/sonarqube/tasks/api_client.go
index e7864f4a7..958535ff8 100644
--- a/backend/plugins/sonarqube/tasks/api_client.go
+++ b/backend/plugins/sonarqube/tasks/api_client.go
@@ -18,57 +18,24 @@ limitations under the License.
package tasks
import (
- "fmt"
"github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/plugin"
"github.com/apache/incubator-devlake/helpers/pluginhelper/api"
- "net/http"
- "strconv"
- "time"
-
"github.com/apache/incubator-devlake/plugins/sonarqube/models"
)
-func NewSonarqubeApiClient(taskCtx plugin.TaskContext, connection
*models.SonarqubeConnection) (*api.ApiAsyncClient, errors.Error) {
- // create synchronize api client so we can calculate api rate limit
dynamically
- headers := map[string]string{
- "Authorization": fmt.Sprintf("Basic %s",
connection.GetEncodedToken()),
- }
- apiClient, err := api.NewApiClient(taskCtx.GetContext(),
connection.Endpoint, headers, 30*time.Second, connection.Proxy, taskCtx)
+// CreateApiClient creates a new asynchronize API Client for AE
+func CreateApiClient(taskCtx plugin.TaskContext, connection
*models.SonarqubeConnection) (*api.ApiAsyncClient, errors.Error) {
+ apiClient, err := api.NewApiClientFromConnection(taskCtx.GetContext(),
taskCtx, connection)
if err != nil {
return nil, err
}
- apiClient.SetAfterFunction(func(res *http.Response) errors.Error {
- if res.StatusCode == http.StatusUnauthorized {
- return
errors.HttpStatus(res.StatusCode).New("authentication failed, please check your
AccessToken")
- }
- return nil
- })
- // create rate limit calculator
- rateLimiter := &api.ApiRateLimitCalculator{
- UserRateLimitPerHour: connection.RateLimitPerHour,
- DynamicRateLimit: func(res *http.Response) (int, time.Duration,
errors.Error) {
- rateLimitHeader := res.Header.Get("RateLimit-Limit")
- if rateLimitHeader == "" {
- // use default
- return 0, 0, nil
- }
- rateLimit, err := strconv.Atoi(rateLimitHeader)
- if err != nil {
- return 0, 0, errors.Default.Wrap(err, "failed
to parse RateLimit-Limit header")
- }
- // seems like {{ .plugin-ame }} rate limit is on minute
basis
- return rateLimit, 1 * time.Minute, nil
- },
- }
- asyncApiClient, err := api.CreateAsyncApiClient(
- taskCtx,
- apiClient,
- rateLimiter,
- )
+ // create ae api client
+ asyncApiCLient, err := api.CreateAsyncApiClient(taskCtx, apiClient, nil)
if err != nil {
return nil, err
}
- return asyncApiClient, nil
+
+ return asyncApiCLient, nil
}