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

fix(sprvsr): Properly enable deployments for select repos #131

Merged
merged 2 commits into from Jan 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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