Skip to content
This repository has been archived by the owner on Nov 29, 2022. It is now read-only.

Commit

Permalink
fix(sprvsr): Properly enable deployments for select repos
Browse files Browse the repository at this point in the history
  • Loading branch information
jmdobry committed Jan 8, 2021
1 parent 070f064 commit 2fec8c1
Show file tree
Hide file tree
Showing 7 changed files with 140 additions and 52 deletions.
2 changes: 2 additions & 0 deletions .gitignore
@@ -1,3 +1,5 @@
.vscode
unit_test_coverage.txt
coverage.txt
coverage_integration.txt
**/profile.out
Expand Down
4 changes: 4 additions & 0 deletions drghs-worker/maintner-sprvsr/main.go
Expand Up @@ -418,4 +418,8 @@ func bucketName(t repos.TrackedRepository) string {
return path.Join(*mutationBucket)
}

func shouldDeploy(ta repos.TrackedRepository) bool {
return ta.IsTrackingIssues
}

func int32Ptr(i int32) *int32 { return &i }
10 changes: 5 additions & 5 deletions repos/repos.go
Expand Up @@ -30,11 +30,11 @@ type RepoList interface {

// TrackedRepository represents a repository tracked by Maintner or Samplr
type TrackedRepository struct {
Owner string `json:"owner"`
Name string `json:"name"`
DefaultBranch string `json:"defaultBranch"`
IsTrackingIssues bool `json:"isTrackingIssues"`
IsTrackingSnippets bool `json:"isTrackingSnippets"`
Owner string `json:"owner"`
Name string `json:"name"`
DefaultBranch string `json:"defaultBranch"`
IsTrackingIssues bool `json:"isTrackingIssues"`
IsTrackingSamples bool `json:"isTrackingSamples"`
}

// RepoSha Creates a Sum224 of the TrackedRepository's name
Expand Down
18 changes: 9 additions & 9 deletions repos/repos_bucket.go
Expand Up @@ -65,10 +65,10 @@ func (r *bucketRepoList) GetTrackedRepos() []TrackedRepository {
}

type bucketRepo struct {
Repo string `json:"repo"`
DefaultBranch string `json:"default_branch"`
IsTrackingIssues bool `json:"is_tracking_issues"`
IsTrackingSnippets bool `json:"is_tracking_snippets"`
Repo string `json:"repo"`
DefaultBranch string `json:"default_branch"`
IsTrackingIssues bool `json:"is_tracking_issues"`
IsTrackingSamples bool `json:"is_tracking_samples"`
}

func (r *bucketRepoList) getRepos(ctx context.Context) ([]TrackedRepository, error) {
Expand Down Expand Up @@ -108,11 +108,11 @@ func (r *bucketRepoList) getRepos(ctx context.Context) ([]TrackedRepository, err
}

tr := TrackedRepository{
Owner: parts[0],
Name: parts[1],
IsTrackingIssues: re.IsTrackingIssues,
IsTrackingSnippets: re.IsTrackingSnippets,
DefaultBranch: re.DefaultBranch,
Owner: parts[0],
Name: parts[1],
IsTrackingIssues: re.IsTrackingIssues,
IsTrackingSamples: re.IsTrackingSamples,
DefaultBranch: re.DefaultBranch,
}
reps[i] = tr
}
Expand Down
5 changes: 5 additions & 0 deletions samplr/samplr-sprvsr/main.go
Expand Up @@ -165,6 +165,7 @@ func main() {
ServiceBuilder: buildService,
DeploymentBuilder: bd,
PreDeploy: preDeploy,
ShouldDeploy: shouldDeploy,
}

super, err := sprvsr.NewK8sSupervisor(log, cs, kcfg, repoList, "samplr")
Expand Down Expand Up @@ -298,4 +299,8 @@ func preDeploy(ta repos.TrackedRepository) error {
return nil
}

func shouldDeploy(ta repos.TrackedRepository) bool {
return ta.IsTrackingSamples
}

func int32Ptr(i int32) *int32 { return &i }
21 changes: 18 additions & 3 deletions sprvsr/k8s_supervisor.go
Expand Up @@ -52,6 +52,7 @@ type k8supervisor struct {
deploymentNamer DeploymentNamer
serviceBuilder ServiceBuilder
deploymentPrep DeploymentPrep
deploymentCheck DeploymentCheck
deploymentBuilder DeploymentBuilder

// The list of repositories to track
Expand All @@ -77,6 +78,10 @@ type ServiceBuilder func(repos.TrackedRepository) (*apiv1.Service, error)
// used to provision additional resources before the Deployment is applied
type DeploymentPrep func(repos.TrackedRepository) error

// DeploymentCheck is called to decide whether a deployment should be
// created for a given TrackedRepository.
type DeploymentCheck func(repos.TrackedRepository) bool

// K8sConfiguration is a struct to describe the set of operations
// a K8SSupervisor needs to manage a cluster
type K8sConfiguration struct {
Expand All @@ -85,6 +90,7 @@ type K8sConfiguration struct {
ServiceBuilder ServiceBuilder
DeploymentBuilder DeploymentBuilder
PreDeploy DeploymentPrep
ShouldDeploy DeploymentCheck
}

// NewK8sSupervisor creates a new supervisor backed by Kubernetes
Expand All @@ -108,6 +114,7 @@ func newK8sSupervisor(log *logrus.Logger, clientset kubernetes.Interface, kconfi
serviceBuilder: kconfig.ServiceBuilder,
deploymentBuilder: kconfig.DeploymentBuilder,
deploymentPrep: kconfig.PreDeploy,
deploymentCheck: kconfig.ShouldDeploy,
repoList: rl,
labelgenkey: lblkey,
}, nil
Expand Down Expand Up @@ -160,12 +167,20 @@ func (s *k8supervisor) updateCorpusRepoList(ctx context.Context, handle func(err

s.mu.Lock()
defer s.mu.Unlock()

trackedRepos := s.repoList.GetTrackedRepos()
filteredRepos := make([]repos.TrackedRepository, 0)
for _, tr := range trackedRepos {
if !s.deploymentCheck(tr) {
continue
}
filteredRepos = append(filteredRepos, tr)
}

s.log.Debugf("got n tracked repos: %v", len(trackedRepos))
s.log.Debugf("got n tracked repos: %v", len(filteredRepos))

trSet := make(map[string]repos.TrackedRepository)
for _, tr := range trackedRepos {
for _, tr := range filteredRepos {
d, err := s.deploymentBuilder(tr)
if err != nil {
handle(err)
Expand All @@ -182,7 +197,7 @@ func (s *k8supervisor) updateCorpusRepoList(ctx context.Context, handle func(err
s.log.Debugf("trSet: %v", trSet)

tServicesSet := make(map[string]repos.TrackedRepository)
for _, tr := range trackedRepos {
for _, tr := range filteredRepos {
tServicesSet[tr.String()] = tr
}

Expand Down
132 changes: 97 additions & 35 deletions sprvsr/k8s_supervisor_test.go
Expand Up @@ -107,15 +107,27 @@ func TestUpdateAddsDeploymentsAndServices(t *testing.T) {
DeploymentBuilder: func(repos.TrackedRepository) (*appsv1.Deployment, error) {
return &appsv1.Deployment{}, nil
},
PreDeploy: func(repos.TrackedRepository) error { return nil },
PreDeploy: func(repos.TrackedRepository) error { return nil },
ShouldDeploy: func(tr repos.TrackedRepository) bool { return tr.IsTrackingSamples },
}
repoList := &fakeRepoList{
idx: -1,
RepoStack: [][]repos.TrackedRepository{
{
repos.TrackedRepository{
Owner: "foo",
Name: "bar",
Owner: "beep",
Name: "boop",
IsTrackingSamples: false,
},
repos.TrackedRepository{
Owner: "foo",
Name: "bar",
IsTrackingSamples: true,
},
repos.TrackedRepository{
Owner: "beep",
Name: "blarp",
IsTrackingSamples: false,
},
},
},
Expand Down Expand Up @@ -161,15 +173,23 @@ func TestUpdateMultipleLeavesThingsAlone(t *testing.T) {
DeploymentBuilder: func(repos.TrackedRepository) (*appsv1.Deployment, error) {
return &appsv1.Deployment{}, nil
},
PreDeploy: func(repos.TrackedRepository) error { return nil },
PreDeploy: func(repos.TrackedRepository) error { return nil },
ShouldDeploy: func(tr repos.TrackedRepository) bool { return tr.IsTrackingSamples },
}
repoList := &fakeRepoList{
idx: -1,
RepoStack: [][]repos.TrackedRepository{
{
repos.TrackedRepository{
Owner: "foo",
Name: "bar",
Owner: "foo",
Name: "bar",
IsTrackingSamples: true,
},
// Should be skipped
repos.TrackedRepository{
Owner: "beep",
Name: "boop",
IsTrackingSamples: false,
},
},
},
Expand All @@ -188,11 +208,18 @@ func TestUpdateMultipleLeavesThingsAlone(t *testing.T) {
spr.updateCorpusRepoList(ctx, func(error) {})

acts := clientSet.Actions()

ncreate := 0
for _, a := range acts {
if a.GetVerb() == "delete" {
t.Errorf("Did not expect to delete a resource: %v", a)
} else if a.GetVerb() == "create" {
ncreate++
}
}
if ncreate != 2 {
t.Errorf("Wanted %v Created. Got %v", 2, ncreate)
}
}

func TestNewReposAreAdded(t *testing.T) {
Expand All @@ -211,25 +238,39 @@ func TestNewReposAreAdded(t *testing.T) {
DeploymentBuilder: func(repos.TrackedRepository) (*appsv1.Deployment, error) {
return &appsv1.Deployment{}, nil
},
PreDeploy: func(repos.TrackedRepository) error { return nil },
PreDeploy: func(repos.TrackedRepository) error { return nil },
ShouldDeploy: func(tr repos.TrackedRepository) bool { return tr.IsTrackingSamples },
}
repoList := &fakeRepoList{
idx: -1,
RepoStack: [][]repos.TrackedRepository{
{
repos.TrackedRepository{
Owner: "foo",
Name: "bar",
Owner: "foo",
Name: "bar",
IsTrackingSamples: true,
},
repos.TrackedRepository{
Owner: "beep",
Name: "boop",
IsTrackingSamples: false,
},
},
{
repos.TrackedRepository{
Owner: "foo",
Name: "bar",
Owner: "foo",
Name: "bar",
IsTrackingSamples: true,
},
repos.TrackedRepository{
Owner: "baz",
Name: "biz",
Owner: "beep",
Name: "boop",
IsTrackingSamples: false,
},
repos.TrackedRepository{
Owner: "baz",
Name: "biz",
IsTrackingSamples: true,
},
},
},
Expand All @@ -255,9 +296,9 @@ func TestNewReposAreAdded(t *testing.T) {
t.Logf("Got verb %v", a.GetVerb())
}
}
// Want 2*len as we are creating one service and one deployment
if ncreate != 2*len(repoList.GetTrackedRepos()) {
t.Errorf("Wanted %v Created. Got %v", len(repoList.GetTrackedRepos()), ncreate)
// Want 2 as we are creating one service and one deployment
if ncreate != 2 {
t.Errorf("Wanted %v Created. Got %v", 2, ncreate)
}
if ndelete != 0 {
t.Errorf("Wanted %v Deleted. Got %v", 0, ndelete)
Expand All @@ -276,9 +317,9 @@ func TestNewReposAreAdded(t *testing.T) {
t.Logf("Got verb %v", a.GetVerb())
}
}
// Want 2*len as we are creating one service and one deployment
if ncreate != 2*len(repoList.GetTrackedRepos()) {
t.Errorf("Wanted %v Created. Got %v", len(repoList.GetTrackedRepos()), ncreate)
// Want 4 as we are created 1 more service and 1 more deployment.
if ncreate != 4 {
t.Errorf("Wanted %v Created. Got %v", 4, ncreate)
}
if ndelete != 0 {
t.Errorf("Wanted %v Deleted. Got %v", 0, ndelete)
Expand Down Expand Up @@ -306,25 +347,39 @@ func TestDeletedReposAreRemoved(t *testing.T) {
Name: fmt.Sprintf("d-%v", a.RepoSha()),
}}, nil
},
PreDeploy: func(repos.TrackedRepository) error { return nil },
PreDeploy: func(repos.TrackedRepository) error { return nil },
ShouldDeploy: func(tr repos.TrackedRepository) bool { return tr.IsTrackingSamples },
}
repoList := &fakeRepoList{
idx: -1,
RepoStack: [][]repos.TrackedRepository{
{
repos.TrackedRepository{
Owner: "foo",
Name: "bar",
Owner: "foo",
Name: "bar",
IsTrackingSamples: true,
},
repos.TrackedRepository{
Owner: "baz",
Name: "biz",
IsTrackingSamples: true,
},
repos.TrackedRepository{
Owner: "baz",
Name: "biz",
Owner: "beep",
Name: "boop",
IsTrackingSamples: false,
},
},
{
repos.TrackedRepository{
Owner: "foo",
Name: "bar",
Owner: "foo",
Name: "bar",
IsTrackingSamples: true,
},
repos.TrackedRepository{
Owner: "beep",
Name: "boop",
IsTrackingSamples: false,
},
},
},
Expand All @@ -349,9 +404,9 @@ func TestDeletedReposAreRemoved(t *testing.T) {
}
t.Logf("Got action: %v %v", a.GetResource(), a.GetVerb())
}
// Want 2*len as we are creating one service and one deployment
if ncreate != 2*len(repoList.GetTrackedRepos()) {
t.Errorf("Wanted %v Created. Got %v", len(repoList.GetTrackedRepos()), ncreate)
// Want 4 as we are creating 2 services and 2 deployments
if ncreate != 4 {
t.Errorf("Wanted %v Created. Got %v", 4, ncreate)
}
if ndelete != 0 {
t.Errorf("Wanted %v Deleted. Got %v", 0, ndelete)
Expand Down Expand Up @@ -435,15 +490,22 @@ func TestUpdatedImagesAreReplaced(t *testing.T) {
},
}, nil
},
PreDeploy: func(repos.TrackedRepository) error { return nil },
PreDeploy: func(repos.TrackedRepository) error { return nil },
ShouldDeploy: func(tr repos.TrackedRepository) bool { return tr.IsTrackingSamples },
}
repoList := &fakeRepoList{
idx: -1,
RepoStack: [][]repos.TrackedRepository{
{
repos.TrackedRepository{
Owner: "foo",
Name: "bar",
Owner: "foo",
Name: "bar",
IsTrackingSamples: true,
},
repos.TrackedRepository{
Owner: "beep",
Name: "boop",
IsTrackingSamples: false,
},
},
},
Expand All @@ -468,9 +530,9 @@ func TestUpdatedImagesAreReplaced(t *testing.T) {
ndelete++
}
}
// Want 2*len as we are creating one service and one deployment
if ncreate != 2*len(repoList.GetTrackedRepos()) {
t.Errorf("Wanted %v Created. Got %v", len(repoList.GetTrackedRepos()), ncreate)
// Want 2 as we are creating one service and one deployment
if ncreate != 2 {
t.Errorf("Wanted %v Created. Got %v", 2, ncreate)
}
// We should delete the existing deployment
if ndelete != 1 {
Expand Down

0 comments on commit 2fec8c1

Please sign in to comment.