diff options
author | Jaime Martinez <jmartinez@gitlab.com> | 2020-07-27 03:55:51 +0300 |
---|---|---|
committer | Jaime Martinez <jmartinez@gitlab.com> | 2020-07-27 03:55:51 +0300 |
commit | 74714d9ea8a9d3292c923025cb9cee5c8663015f (patch) | |
tree | f948624bb13d539fc8e5ff6871826625ef18cb17 /internal/source/gitlab | |
parent | 795c4657db1e8aefa648f989a38a26126cad5b54 (diff) |
Use isReady flag in Gitlab struct
Diffstat (limited to 'internal/source/gitlab')
-rw-r--r-- | internal/source/gitlab/gitlab.go | 13 | ||||
-rw-r--r-- | internal/source/gitlab/gitlab_poll.go | 18 | ||||
-rw-r--r-- | internal/source/gitlab/gitlab_poll_test.go | 62 |
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) + }) } } |