Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-pages.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaime Martinez <jmartinez@gitlab.com>2020-07-27 03:55:51 +0300
committerJaime Martinez <jmartinez@gitlab.com>2020-07-27 03:55:51 +0300
commit74714d9ea8a9d3292c923025cb9cee5c8663015f (patch)
treef948624bb13d539fc8e5ff6871826625ef18cb17
parent795c4657db1e8aefa648f989a38a26126cad5b54 (diff)
Use isReady flag in Gitlab struct
-rw-r--r--internal/source/gitlab/gitlab.go13
-rw-r--r--internal/source/gitlab/gitlab_poll.go18
-rw-r--r--internal/source/gitlab/gitlab_poll_test.go62
3 files changed, 55 insertions, 38 deletions
diff --git a/internal/source/gitlab/gitlab.go b/internal/source/gitlab/gitlab.go
index 2c3aaab7..77192478 100644
--- a/internal/source/gitlab/gitlab.go
+++ b/internal/source/gitlab/gitlab.go
@@ -6,6 +6,7 @@ import (
"net/http"
"path"
"strings"
+ "sync"
"gitlab.com/gitlab-org/gitlab-pages/internal/domain"
"gitlab.com/gitlab-org/gitlab-pages/internal/request"
@@ -20,10 +21,11 @@ import (
type Gitlab struct {
client api.Resolver
checker checker
+ mu *sync.RWMutex
+ isReady bool
}
type checker interface {
- // Status checks that Pages can reach the rails internal Pages API for source domain configuration.
Status() error
}
@@ -33,9 +35,16 @@ func New(config client.Config) (*Gitlab, error) {
if err != nil {
return nil, err
}
+ g := &Gitlab{
+ client: cache.NewCache(client, nil),
+ mu: &sync.RWMutex{},
+ checker: client,
+ }
+
+ go g.Poll(defaultPollingMaxRetries, defaultPollingInterval)
// using nil for cache config will use the default values specified in internal/source/gitlab/cache/cache.go#12
- return &Gitlab{client: cache.NewCache(client, nil), checker: client}, nil
+ return g, nil
}
// GetDomain return a representation of a domain that we have fetched from
diff --git a/internal/source/gitlab/gitlab_poll.go b/internal/source/gitlab/gitlab_poll.go
index 5421f2bf..f6653e62 100644
--- a/internal/source/gitlab/gitlab_poll.go
+++ b/internal/source/gitlab/gitlab_poll.go
@@ -1,36 +1,38 @@
package gitlab
import (
- "fmt"
"time"
log "github.com/sirupsen/logrus"
)
const (
- // DefaultPollingMaxRetries to be used by Poll
- DefaultPollingMaxRetries = 30
- // DefaultPollingInterval to be used by Poll
- DefaultPollingInterval = 60 * time.Second
+ // defaultPollingMaxRetries to be used by Poll
+ defaultPollingMaxRetries = 30
+ // defaultPollingInterval to be used by Poll
+ defaultPollingInterval = 10 * time.Second
)
// Poll tries to call the /internal/pages/status API endpoint once plus
// `retries` every `interval`.
// TODO: Remove in https://gitlab.com/gitlab-org/gitlab/-/issues/218357
-func (g *Gitlab) Poll(retries int, interval time.Duration) error {
+func (g *Gitlab) Poll(retries int, interval time.Duration) {
var err error
for i := 0; i <= retries; i++ {
log.Info("polling GitLab internal pages status API")
err = g.checker.Status()
if err == nil {
log.Info("GitLab internal pages status API connected successfully")
+ g.mu.Lock()
+ g.isReady = true
+ g.mu.Unlock()
// return as soon as we connect to the API
- return nil
+ return
}
time.Sleep(interval)
}
- return fmt.Errorf("polling failed after %d tries every %fs: %w", retries+1, interval.Seconds(), err)
+ log.WithError(err).Errorf("polling failed after %d tries every %.2fs", retries+1, interval.Seconds())
}
diff --git a/internal/source/gitlab/gitlab_poll_test.go b/internal/source/gitlab/gitlab_poll_test.go
index 87461cc3..aebbc798 100644
--- a/internal/source/gitlab/gitlab_poll_test.go
+++ b/internal/source/gitlab/gitlab_poll_test.go
@@ -2,51 +2,55 @@ package gitlab
import (
"fmt"
+ "sync"
"testing"
"time"
+ "github.com/sirupsen/logrus/hooks/test"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitlab-pages/internal/source/gitlab/client"
)
func TestClient_Poll(t *testing.T) {
+ hook := test.NewGlobal()
tests := []struct {
- name string
- retries int
- interval time.Duration
- wantErr bool
+ name string
+ retries int
+ interval time.Duration
+ expectedFail bool
}{
{
- name: "success_with_no_retry",
- retries: 0,
- interval: 5 * time.Millisecond,
- wantErr: false,
+ name: "success_with_no_retry",
+ retries: 0,
+ interval: 5 * time.Millisecond,
+ expectedFail: false,
},
{
- name: "success_after_N_retries",
- retries: 3,
- interval: 10 * time.Millisecond,
- wantErr: false,
+ name: "success_after_N_retries",
+ retries: 3,
+ interval: 10 * time.Millisecond,
+ expectedFail: false,
},
{
- name: "fail_with_no_retries",
- retries: 0,
- interval: 5 * time.Millisecond,
- wantErr: true,
+ name: "fail_with_no_retries",
+ retries: 0,
+ interval: 5 * time.Millisecond,
+ expectedFail: true,
},
{
- name: "fail_after_N_retries",
- retries: 3,
- interval: 5 * time.Millisecond,
- wantErr: true,
+ name: "fail_after_N_retries",
+ retries: 3,
+ interval: 5 * time.Millisecond,
+ expectedFail: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
+ defer hook.Reset()
var counter int
checkerMock := checkerMock{StatusErr: func() error {
- if tt.wantErr {
+ if tt.expectedFail {
return fmt.Errorf(client.ConnectionErrorMsg)
}
@@ -58,17 +62,19 @@ func TestClient_Poll(t *testing.T) {
return nil
}}
- glClient := Gitlab{checker: checkerMock}
+ glClient := Gitlab{checker: checkerMock, mu: &sync.RWMutex{}}
- err := glClient.Poll(tt.retries, tt.interval)
- if tt.wantErr {
- require.Error(t, err)
- require.Contains(t, err.Error(), "polling failed after")
- require.Contains(t, err.Error(), client.ConnectionErrorMsg)
+ glClient.Poll(tt.retries, tt.interval)
+ if tt.expectedFail {
+ require.False(t, glClient.isReady)
+ s := fmt.Sprintf("polling failed after %d tries every %.2fs", tt.retries+1, tt.interval.Seconds())
+ require.Equal(t, s, hook.LastEntry().Message)
return
}
- require.NoError(t, err)
+ require.True(t, glClient.isReady)
+ require.Equal(t, "GitLab internal pages status API connected successfully", hook.LastEntry().Message)
+
})
}
}