diff --git a/runner/enterprises_test.go b/runner/enterprises_test.go index 9648e34f..311e743a 100644 --- a/runner/enterprises_test.go +++ b/runner/enterprises_test.go @@ -170,6 +170,7 @@ func (s *EnterpriseTestSuite) TestCreateEnterprise() { s.Require().Nil(err) s.Require().Equal(s.Fixtures.CreateEnterpriseParams.Name, enterprise.Name) s.Require().Equal(s.Fixtures.Credentials[s.Fixtures.CreateEnterpriseParams.CredentialsName].Name, enterprise.CredentialsName) + s.Require().Equal(params.PoolBalancerTypeRoundRobin, enterprise.PoolBalancerType) } func (s *EnterpriseTestSuite) TestCreateEnterpriseErrUnauthorized() { @@ -294,13 +295,16 @@ func (s *EnterpriseTestSuite) TestUpdateEnterprise() { s.Fixtures.PoolMgrCtrlMock.On("UpdateEnterprisePoolManager", s.Fixtures.AdminContext, mock.AnythingOfType("params.Enterprise")).Return(s.Fixtures.PoolMgrMock, nil) s.Fixtures.PoolMgrMock.On("Status").Return(params.PoolManagerStatus{IsRunning: true}, nil) - org, err := s.Runner.UpdateEnterprise(s.Fixtures.AdminContext, s.Fixtures.StoreEnterprises["test-enterprise-1"].ID, s.Fixtures.UpdateRepoParams) + param := s.Fixtures.UpdateRepoParams + param.PoolBalancerType = params.PoolBalancerTypePack + org, err := s.Runner.UpdateEnterprise(s.Fixtures.AdminContext, s.Fixtures.StoreEnterprises["test-enterprise-1"].ID, param) s.Fixtures.PoolMgrMock.AssertExpectations(s.T()) s.Fixtures.PoolMgrCtrlMock.AssertExpectations(s.T()) s.Require().Nil(err) s.Require().Equal(s.Fixtures.UpdateRepoParams.CredentialsName, org.CredentialsName) s.Require().Equal(s.Fixtures.UpdateRepoParams.WebhookSecret, org.WebhookSecret) + s.Require().Equal(params.PoolBalancerTypePack, org.PoolBalancerType) } func (s *EnterpriseTestSuite) TestUpdateEnterpriseErrUnauthorized() { diff --git a/runner/organizations_test.go b/runner/organizations_test.go index 974b2f7c..7ebfcff8 100644 --- a/runner/organizations_test.go +++ b/runner/organizations_test.go @@ -170,6 +170,20 @@ func (s *OrgTestSuite) TestCreateOrganization() { s.Require().Nil(err) s.Require().Equal(s.Fixtures.CreateOrgParams.Name, org.Name) s.Require().Equal(s.Fixtures.Credentials[s.Fixtures.CreateOrgParams.CredentialsName].Name, org.CredentialsName) + s.Require().Equal(params.PoolBalancerTypeRoundRobin, org.PoolBalancerType) +} + +func (s *OrgTestSuite) TestCreateOrganizationPoolBalancerTypePack() { + s.Fixtures.CreateOrgParams.PoolBalancerType = params.PoolBalancerTypePack + s.Fixtures.PoolMgrMock.On("Start").Return(nil) + s.Fixtures.PoolMgrCtrlMock.On("CreateOrgPoolManager", s.Fixtures.AdminContext, mock.AnythingOfType("params.Organization"), s.Fixtures.Providers, s.Fixtures.Store).Return(s.Fixtures.PoolMgrMock, nil) + + org, err := s.Runner.CreateOrganization(s.Fixtures.AdminContext, s.Fixtures.CreateOrgParams) + + s.Fixtures.PoolMgrMock.AssertExpectations(s.T()) + s.Fixtures.PoolMgrCtrlMock.AssertExpectations(s.T()) + s.Require().Nil(err) + s.Require().Equal(params.PoolBalancerTypePack, org.PoolBalancerType) } func (s *OrgTestSuite) TestCreateOrganizationErrUnauthorized() { @@ -303,6 +317,21 @@ func (s *OrgTestSuite) TestUpdateOrganization() { s.Require().Equal(s.Fixtures.UpdateRepoParams.WebhookSecret, org.WebhookSecret) } +func (s *OrgTestSuite) TestUpdateRepositoryBalancingType() { + s.Fixtures.UpdateRepoParams.PoolBalancerType = params.PoolBalancerTypePack + s.Fixtures.PoolMgrCtrlMock.On("UpdateOrgPoolManager", s.Fixtures.AdminContext, mock.AnythingOfType("params.Organization")).Return(s.Fixtures.PoolMgrMock, nil) + s.Fixtures.PoolMgrMock.On("Status").Return(params.PoolManagerStatus{IsRunning: true}, nil) + + param := s.Fixtures.UpdateRepoParams + param.PoolBalancerType = params.PoolBalancerTypePack + org, err := s.Runner.UpdateOrganization(s.Fixtures.AdminContext, s.Fixtures.StoreOrgs["test-org-1"].ID, param) + + s.Fixtures.PoolMgrMock.AssertExpectations(s.T()) + s.Fixtures.PoolMgrCtrlMock.AssertExpectations(s.T()) + s.Require().Nil(err) + s.Require().Equal(params.PoolBalancerTypePack, org.PoolBalancerType) +} + func (s *OrgTestSuite) TestUpdateOrganizationErrUnauthorized() { _, err := s.Runner.UpdateOrganization(context.Background(), "dummy-org-id", s.Fixtures.UpdateRepoParams) diff --git a/runner/pool/enterprise.go b/runner/pool/enterprise.go index a3fcdad6..24685fcb 100644 --- a/runner/pool/enterprise.go +++ b/runner/pool/enterprise.go @@ -190,10 +190,6 @@ func (e *enterprise) GetJITConfig(ctx context.Context, instance string, pool par return ret, jitConfig.Runner, nil } -func (e *enterprise) GithubCLI() common.GithubClient { - return e.ghcli -} - func (e *enterprise) PoolType() params.PoolType { return params.EnterprisePool } @@ -370,14 +366,6 @@ func (e *enterprise) WebhookSecret() string { return e.cfg.WebhookSecret } -func (e *enterprise) FindPoolByTags(labels []string) (params.Pool, error) { - pool, err := e.store.FindEnterprisePoolByTags(e.ctx, e.id, labels) - if err != nil { - return params.Pool{}, errors.Wrap(err, "fetching suitable pool") - } - return pool, nil -} - func (e *enterprise) GetPoolByID(poolID string) (params.Pool, error) { pool, err := e.store.GetEnterprisePool(e.ctx, e.id, poolID) if err != nil { diff --git a/runner/pool/interfaces.go b/runner/pool/interfaces.go index 6cdf6fcb..3815a3ac 100644 --- a/runner/pool/interfaces.go +++ b/runner/pool/interfaces.go @@ -21,7 +21,6 @@ import ( commonParams "github.com/cloudbase/garm-provider-common/params" "github.com/cloudbase/garm/params" - "github.com/cloudbase/garm/runner/common" ) type poolHelper interface { @@ -35,8 +34,6 @@ type poolHelper interface { UninstallHook(ctx context.Context, url string) error GetHookInfo(ctx context.Context) (params.HookInfo, error) - GithubCLI() common.GithubClient - GetJITConfig(ctx context.Context, instanceName string, pool params.Pool, labels []string) (map[string]string, *github.Runner, error) FetchDbInstances() ([]params.Instance, error) @@ -44,7 +41,6 @@ type poolHelper interface { GithubURL() string JwtToken() string String() string - FindPoolByTags(labels []string) (params.Pool, error) GetPoolByID(poolID string) (params.Pool, error) ValidateOwner(job params.WorkflowJob) error UpdateState(param params.UpdatePoolStateParams) error diff --git a/runner/pool/organization.go b/runner/pool/organization.go index a3e465ee..65448953 100644 --- a/runner/pool/organization.go +++ b/runner/pool/organization.go @@ -202,10 +202,6 @@ func (o *organization) GetJITConfig(ctx context.Context, instance string, pool p return ret, runner, nil } -func (o *organization) GithubCLI() common.GithubClient { - return o.ghcli -} - func (o *organization) PoolType() params.PoolType { return params.OrganizationPool } @@ -384,14 +380,6 @@ func (o *organization) WebhookSecret() string { return o.cfg.WebhookSecret } -func (o *organization) FindPoolByTags(labels []string) (params.Pool, error) { - pool, err := o.store.FindOrganizationPoolByTags(o.ctx, o.id, labels) - if err != nil { - return params.Pool{}, errors.Wrap(err, "fetching suitable pool") - } - return pool, nil -} - func (o *organization) GetPoolByID(poolID string) (params.Pool, error) { pool, err := o.store.GetOrganizationPool(o.ctx, o.id, poolID) if err != nil { diff --git a/runner/pool/pool.go b/runner/pool/pool.go index 2d52ca02..f3b21852 100644 --- a/runner/pool/pool.go +++ b/runner/pool/pool.go @@ -1653,7 +1653,15 @@ func (r *basePoolManager) Stop() error { } func (r *basePoolManager) RefreshState(param params.UpdatePoolStateParams) error { - return r.helper.UpdateState(param) + if err := r.helper.UpdateState(param); err != nil { + return fmt.Errorf("failed to update pool state: %w", err) + } + // Update the tools as soon as state is updated. This should revive a stopped pool manager + // or stop one if the supplied credentials are not okay. + if err := r.updateTools(); err != nil { + return fmt.Errorf("failed to update tools: %w", err) + } + return nil } func (r *basePoolManager) WebhookSecret() string { diff --git a/runner/pool/repository.go b/runner/pool/repository.go index e37ed55b..3383aacf 100644 --- a/runner/pool/repository.go +++ b/runner/pool/repository.go @@ -161,10 +161,6 @@ func (r *repository) GetJITConfig(ctx context.Context, instance string, pool par return ret, runner, nil } -func (r *repository) GithubCLI() common.GithubClient { - return r.ghcli -} - func (r *repository) PoolType() params.PoolType { return params.RepositoryPool } @@ -341,14 +337,6 @@ func (r *repository) WebhookSecret() string { return r.cfg.WebhookSecret } -func (r *repository) FindPoolByTags(labels []string) (params.Pool, error) { - pool, err := r.store.FindRepositoryPoolByTags(r.ctx, r.id, labels) - if err != nil { - return params.Pool{}, errors.Wrap(err, "fetching suitable pool") - } - return pool, nil -} - func (r *repository) GetPoolByID(poolID string) (params.Pool, error) { pool, err := r.store.GetRepositoryPool(r.ctx, r.id, poolID) if err != nil { diff --git a/runner/repositories_test.go b/runner/repositories_test.go index 12f62478..8a1e8d9c 100644 --- a/runner/repositories_test.go +++ b/runner/repositories_test.go @@ -171,6 +171,27 @@ func (s *RepoTestSuite) TestCreateRepository() { s.Require().Equal(s.Fixtures.CreateRepoParams.Owner, repo.Owner) s.Require().Equal(s.Fixtures.CreateRepoParams.Name, repo.Name) s.Require().Equal(s.Fixtures.Credentials[s.Fixtures.CreateRepoParams.CredentialsName].Name, repo.CredentialsName) + s.Require().Equal(params.PoolBalancerTypeRoundRobin, repo.PoolBalancerType) +} + +func (s *RepoTestSuite) TestCreareRepositoryPoolBalancerTypePack() { + // setup mocks expectations + s.Fixtures.PoolMgrMock.On("Start").Return(nil) + s.Fixtures.PoolMgrCtrlMock.On("CreateRepoPoolManager", s.Fixtures.AdminContext, mock.AnythingOfType("params.Repository"), s.Fixtures.Providers, s.Fixtures.Store).Return(s.Fixtures.PoolMgrMock, nil) + + // call tested function + param := s.Fixtures.CreateRepoParams + param.PoolBalancerType = params.PoolBalancerTypePack + repo, err := s.Runner.CreateRepository(s.Fixtures.AdminContext, param) + + // assertions + s.Fixtures.PoolMgrMock.AssertExpectations(s.T()) + s.Fixtures.PoolMgrCtrlMock.AssertExpectations(s.T()) + s.Require().Nil(err) + s.Require().Equal(param.Owner, repo.Owner) + s.Require().Equal(param.Name, repo.Name) + s.Require().Equal(s.Fixtures.Credentials[s.Fixtures.CreateRepoParams.CredentialsName].Name, repo.CredentialsName) + s.Require().Equal(params.PoolBalancerTypePack, repo.PoolBalancerType) } func (s *RepoTestSuite) TestCreateRepositoryErrUnauthorized() { @@ -304,11 +325,27 @@ func (s *RepoTestSuite) TestUpdateRepository() { s.Require().Nil(err) s.Require().Equal(s.Fixtures.UpdateRepoParams.CredentialsName, repo.CredentialsName) s.Require().Equal(s.Fixtures.UpdateRepoParams.WebhookSecret, repo.WebhookSecret) + s.Require().Equal(params.PoolBalancerTypeRoundRobin, repo.PoolBalancerType) +} + +func (s *RepoTestSuite) TestUpdateRepositoryBalancingType() { + s.Fixtures.PoolMgrCtrlMock.On("UpdateRepoPoolManager", s.Fixtures.AdminContext, mock.AnythingOfType("params.Repository")).Return(s.Fixtures.PoolMgrMock, nil) + s.Fixtures.PoolMgrMock.On("Status").Return(params.PoolManagerStatus{IsRunning: true}, nil) + + updateRepoParams := s.Fixtures.UpdateRepoParams + updateRepoParams.PoolBalancerType = params.PoolBalancerTypePack + repo, err := s.Runner.UpdateRepository(s.Fixtures.AdminContext, s.Fixtures.StoreRepos["test-repo-1"].ID, updateRepoParams) + + s.Fixtures.PoolMgrCtrlMock.AssertExpectations(s.T()) + s.Fixtures.PoolMgrMock.AssertExpectations(s.T()) + s.Require().Nil(err) + s.Require().Equal(updateRepoParams.CredentialsName, repo.CredentialsName) + s.Require().Equal(updateRepoParams.WebhookSecret, repo.WebhookSecret) + s.Require().Equal(params.PoolBalancerTypePack, repo.PoolBalancerType) } func (s *RepoTestSuite) TestUpdateRepositoryErrUnauthorized() { _, err := s.Runner.UpdateRepository(context.Background(), "dummy-repo-id", s.Fixtures.UpdateRepoParams) - s.Require().Equal(runnerErrors.ErrUnauthorized, err) }